From f4867ceefcdee545b1a1938eed9e900cc2eb8a76 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Therese=20Natter=C3=B8y?=
<61694854+tnatt@users.noreply.github.com>
Date: Tue, 8 Nov 2022 10:32:32 +0100
Subject: [PATCH 1/4] arrow implementation and improvements to
TimeseriesOneByOne
---
.github/workflows/subsurface.yml | 146 ++++-
.../_components/tornado/_tornado_table.py | 2 +
.../_figures/timeseries_figure.py | 127 +++-
webviz_subsurface/plugins/__init__.py | 4 +-
...eservoir_simulation_timeseries_onebyone.py | 574 +++++++-----------
.../__init__.py | 1 +
.../_business_logic.py | 196 ++++++
.../_callbacks.py | 239 ++++++++
.../_layout.py | 331 ++++++++++
.../_plugin.py | 171 ++++++
.../_utils/__init__.py | 0
.../_utils/datetime_utils.py | 16 +
.../models/__init__.py | 1 +
.../models/ensemble_timeseries_datamodel.py | 142 +++++
.../controllers/tornado_controllers.py | 14 +-
15 files changed, 1572 insertions(+), 392 deletions(-)
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/_business_logic.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/_layout.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/__init__.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/datetime_utils.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/__init__.py
create mode 100644 webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/ensemble_timeseries_datamodel.py
diff --git a/.github/workflows/subsurface.yml b/.github/workflows/subsurface.yml
index b111cec73..398442a37 100644
--- a/.github/workflows/subsurface.yml
+++ b/.github/workflows/subsurface.yml
@@ -173,28 +173,130 @@ jobs:
matrix:
python-version: ["3.8"]
- steps:
- - name: 📖 Checkout commit locally
- uses: actions/checkout@v2
+ - name: 🧹 Remove unused pre-installed software
+ run: |
+ # https://github.com/actions/virtual-environments/issues/751
+ # https://github.com/actions/virtual-environments/issues/709
+ sudo apt-get purge p7zip* yarn ruby-full ghc* php7*
+ sudo apt-get autoremove
+ sudo apt-get clean
+ df -h
- - name: 🐍 Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v2
- with:
- python-version: ${{ matrix.python-version }}
+ - name: 📖 Checkout commit locally
+ uses: actions/checkout@v2
- - name: 📦 Install webviz-subsurface with dependencies
- run: |
- pip install --upgrade pip
- pip install "bleach<5" # https://github.com/equinor/webviz-config/issues/586
- pip install "werkzeug<2.1" # ...while waiting for https://github.com/plotly/dash/issues/1992
- pip install "selenium<4.3" # breaking change in selenium==4.3
- pip install "scipy<1.9.3" # breaking change in scipy==1.9.3
- pip install "pytest<7.2.0"
- pip install "pytest-xdist<3.0"
- pip install "xtgeo<2.20.2"
- pip install .
+ - name: 🐍 Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
- - name: Test import
- run: |
- import webviz_subsurface
- shell: python
+ - name: 📦 Install webviz-subsurface with dependencies
+ run: |
+ pip install --upgrade pip
+ if [[ $(pip freeze) ]]; then
+ pip freeze | grep -vw "pip" | xargs pip uninstall -y
+ fi
+ pip install "bleach<5" # https://github.com/equinor/webviz-config/issues/586
+ pip install "werkzeug<2.1" # ...while waiting for https://github.com/plotly/dash/issues/1992
+ pip install "selenium<4.3" # breaking change in selenium==4.3
+ pip install "scipy<1.9.3" # breaking change in scipy==1.9.3
+ pip install "pytest<7.2.0"
+ pip install "pytest-xdist<3.0"
+ pip install "xtgeo<2.20.2"
+ pip install "mypy<0.990"
+ pip install .
+
+ # Testing against our latest release (including pre-releases)
+ pip install --pre --upgrade webviz-config webviz-core-components webviz-subsurface-components
+
+ - name: 📦 Install test dependencies
+ run: |
+ pip install .[tests]
+ wget https://chromedriver.storage.googleapis.com/$(wget https://chromedriver.storage.googleapis.com/LATEST_RELEASE -q -O -)/chromedriver_linux64.zip
+ unzip chromedriver_linux64.zip
+ export PATH=$PATH:$PWD
+
+ - name: 🧾 List all installed packages
+ run: pip freeze
+
+ - name: 🕵️ Check code style & linting
+ run: |
+ black --check webviz_subsurface tests setup.py
+ pylint webviz_subsurface tests setup.py
+ bandit -r -c ./bandit.yml webviz_subsurface tests setup.py
+ isort --check-only webviz_subsurface tests setup.py
+ mypy --package webviz_subsurface
+
+ - name: 🤖 Run tests
+ env:
+ # If you want the CI to (temporarily) run against your fork of the testdada,
+ # change the value her from "equinor" to your username.
+ TESTDATA_REPO_OWNER: equinor
+ # If you want the CI to (temporarily) run against another branch than master,
+ # change the value her from "master" to the relevant branch name.
+ TESTDATA_REPO_BRANCH: master
+ run: |
+ git clone --depth 1 --branch $TESTDATA_REPO_BRANCH https://github.com/$TESTDATA_REPO_OWNER/webviz-subsurface-testdata.git
+ # Copy any clientside script to the test folder before running tests
+ mkdir ./tests/assets && cp ./webviz_subsurface/_assets/js/* ./tests/assets
+ pytest ./tests --headless --forked --testdata-folder ./webviz-subsurface-testdata
+ rm -rf ./tests/assets
+ webviz docs --portable ./docs_build --skip-open
+
+ - name: 🐳 Build Docker example image
+ run: |
+ pip install --pre webviz-config-equinor
+ export SOURCE_URL_WEBVIZ_SUBSURFACE=https://github.com/$GITHUB_REPOSITORY
+ export GIT_POINTER_WEBVIZ_SUBSURFACE=$GITHUB_REF
+ webviz build ./webviz-subsurface-testdata/webviz_examples/webviz-full-demo.yml --portable ./example_subsurface_app --theme equinor
+ rm -rf ./webviz-subsurface-testdata
+ pushd example_subsurface_app
+ docker build -t webviz/example_subsurface_image:equinor-theme .
+ popd
+
+ - name: 🐳 Update Docker Hub example image
+ if: github.event_name != 'schedule' && github.ref == 'refs/heads/master' && matrix.python-version == '3.8'
+ run: |
+ echo ${{ secrets.dockerhub_webviz_token }} | docker login --username webviz --password-stdin
+ docker push webviz/example_subsurface_image:equinor-theme
+
+ - name: 🐳 Update review/test Docker example image
+ if: github.ref != 'refs/heads/master' && contains(github.event.head_commit.message, '[deploy test]') && matrix.python-version == '3.8'
+ run: |
+ docker tag webviz/example_subsurface_image:equinor-theme ${{ secrets.review_docker_registry_url }}/${{ secrets.review_container_name }}
+
+ echo ${{ secrets.review_docker_registry_token }} | docker login ${{ secrets.review_docker_registry_url }} --username ${{ secrets.review_docker_registry_username }} --password-stdin
+ docker push ${{ secrets.review_docker_registry_url }}/${{ secrets.review_container_name }}
+
+ - name: 🚢 Build and deploy Python package
+ if: github.event_name == 'release' && matrix.python-version == '3.8'
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.pypi_webviz_token }}
+ run: |
+ python -m pip install --upgrade setuptools wheel twine
+ python setup.py sdist bdist_wheel
+ twine upload dist/*
+
+ - name: 📚 Update GitHub pages
+ if: github.event_name == 'release' && matrix.python-version == '3.8'
+ run: |
+ cp -R ./docs_build ../docs_build
+
+ git config --local user.email "webviz-github-action"
+ git config --local user.name "webviz-github-action"
+ git fetch origin gh-pages
+ git checkout --track origin/gh-pages
+ git clean -f -f -d -x
+ git rm -r *
+
+ cp -R ../docs_build/* .
+
+ git add .
+
+ if git diff-index --quiet HEAD; then
+ echo "No changes in documentation. Skip documentation deploy."
+ else
+ git commit -m "Update Github Pages"
+ git push "https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" gh-pages
+ fi
diff --git a/webviz_subsurface/_components/tornado/_tornado_table.py b/webviz_subsurface/_components/tornado/_tornado_table.py
index 8b0defad7..d80c07cee 100644
--- a/webviz_subsurface/_components/tornado/_tornado_table.py
+++ b/webviz_subsurface/_components/tornado/_tornado_table.py
@@ -23,6 +23,7 @@ def __init__(
lambda x: str(len(x))
)
self._table["Response"] = tornado_data.response_name
+ self._table["Reference"] = tornado_data.reference_average
self._table.rename(
columns={
"sensname": "Sensitivity",
@@ -64,6 +65,7 @@ def columns(self) -> List[Dict]:
"True high",
"Low #reals",
"High #reals",
+ "Reference",
]
]
diff --git a/webviz_subsurface/_figures/timeseries_figure.py b/webviz_subsurface/_figures/timeseries_figure.py
index 791297336..91e3080d6 100644
--- a/webviz_subsurface/_figures/timeseries_figure.py
+++ b/webviz_subsurface/_figures/timeseries_figure.py
@@ -5,7 +5,13 @@
import numpy as np
import pandas as pd
-from webviz_subsurface._utils.colors import find_intermediate_color, rgba_to_str
+from webviz_subsurface._utils.colors import (
+ find_intermediate_color,
+ rgba_to_str,
+ rgb_to_str,
+ scale_rgb_lightness,
+ hex_to_rgb,
+)
from webviz_subsurface._utils.simulation_timeseries import (
get_simulation_line_shape,
set_simulation_line_shape_fallback,
@@ -31,20 +37,31 @@ def __init__(
line_shape_fallback: str,
historical_vector_df: Optional[pd.DataFrame] = None,
dateline: Optional[datetime.datetime] = None,
- ):
+ discrete_color_map: dict = None,
+ groupby: str = "REAL",
+ ) -> None:
self.dframe = dframe
+ self.color_col = color_col
+ self.groupby = groupby
+ if color_col is not None and discrete_color_map is None:
+ self.dframe = self.normalize_parameter_value(self.dframe)
+ self.dframe = self.dframe.rename(columns={color_col: "VALUE"})
self.vector = vector
self.ensemble = ensemble
- self.color_col = color_col
self.visualization = visualization
self.historical_vector_df = historical_vector_df
self.date = dateline
self.line_shape = self.get_line_shape(line_shape_fallback)
+ self.continous_color = self.color_col is not None and discrete_color_map is None
+ self.colormap = discrete_color_map if discrete_color_map is not None else {}
self.create_traces()
@property
def figure(self) -> dict:
+ title = self.vector
+ if self.color_col is not None:
+ title += f" colored by {self.color_col}"
return {
"data": self.traces,
"layout": {
@@ -56,7 +73,7 @@ def figure(self) -> dict:
"plot_bgcolor": "white",
"showlegend": False,
"uirevision": self.vector,
- "title": {"text": f"{self.vector} colored by {self.color_col}"},
+ "title": {"text": title},
"shapes": self.shapes,
"annotations": self.annotations,
},
@@ -65,11 +82,17 @@ def figure(self) -> dict:
def create_traces(self) -> None:
self.traces: List[dict] = []
- if self.visualization != "statistics":
- self._add_realization_traces()
+ if self.groupby == "SENSNAME_CASE":
+ if self.visualization == "realizations":
+ self._add_sensitivity_traces_real()
+ else:
+ self._add_sensitivity_traces_stat()
- if self.visualization != "realizations":
- self._add_statistic_traces()
+ else:
+ if self.visualization == "realizations":
+ self._add_realization_traces()
+ if self.visualization == "statistics":
+ self._add_statistic_traces()
self._add_history_trace()
@@ -116,7 +139,8 @@ def _add_statistic_traces(self) -> None:
def _add_realization_traces(self) -> None:
"""Renders line trace for each realization"""
- mean = self.dframe["VALUE_NORM"].mean()
+
+ mean = self.dframe["VALUE_NORM"].mean() if self.continous_color else None
self.traces.extend(
[
{
@@ -125,21 +149,93 @@ def _add_realization_traces(self) -> None:
"color": self.set_real_color(
real_df["VALUE_NORM"].iloc[0], mean
)
- if self.visualization == "realizations"
- else "gainsboro",
+ if self.visualization == "realizations" and self.continous_color
+ else self.colormap.get(real_df[self.color_col].iloc[0], "grey"),
},
"mode": "lines",
"x": real_df["DATE"],
"y": real_df[self.vector],
"name": self.ensemble,
"legendgroup": self.ensemble,
- "hovertext": self.create_hovertext(real_df["VALUE"].iloc[0], real),
+ "hovertext": self.create_hovertext(real_df["VALUE"].iloc[0], real)
+ if self.continous_color
+ else f"Real: {real} {real_df[self.color_col].iloc[0]}",
"showlegend": real_idx == 0,
}
for real_idx, (real, real_df) in enumerate(self.dframe.groupby("REAL"))
]
)
+ def _add_sensitivity_traces_stat(self) -> None:
+ """Renders line trace for each realization"""
+
+ self.dframe["dash"] = np.where(
+ self.dframe["t"] == 1, "dashdot", "solid"
+ ) # dot, dashdot
+
+ self.traces.extend(
+ [
+ {
+ "line": {
+ "dash": "dash" if real_df["t"].iloc[0] == 1 else "solid",
+ "shape": self.line_shape,
+ "color": self.colormap.get(
+ real_df[self.color_col].iloc[0], "grey"
+ ),
+ "width": 3 if real_df["t"].iloc[0] == 1 else 2,
+ },
+ "mode": "lines",
+ "x": real_df["DATE"],
+ "y": real_df[self.vector],
+ "name": sens,
+ "legendgroup": sens,
+ "hovertext": f"Sens: {sens}",
+ }
+ for real_idx, (sens, real_df) in enumerate(
+ self.dframe.groupby("SENSNAME_CASE")
+ )
+ ]
+ )
+
+ def _add_sensitivity_traces_real(self) -> None:
+ """Renders line trace for each realization"""
+
+ self.dframe["dash"] = np.where(
+ self.dframe["t"] == 1, "longdash", "solid"
+ ) # dot, dashdot
+
+ self.traces.extend(
+ [
+ {
+ "line": {
+ "dash": "dash" if real_df["t"].iloc[0] == 1 else "solid",
+ "shape": self.line_shape,
+ "color": rgb_to_str(
+ scale_rgb_lightness(
+ hex_to_rgb(
+ self.colormap.get(
+ real_df[self.color_col].iloc[0], "grey"
+ )
+ ),
+ 130 if real_df["t"].iloc[0] == 1 else 90,
+ )
+ ),
+ "width": 3 if real_df["t"].iloc[0] == 1 else 2,
+ },
+ "mode": "lines",
+ "x": real_df["DATE"],
+ "y": real_df[self.vector],
+ "name": sens,
+ "legendgroup": sens,
+ "hovertext": f"Real: {real}, Sens: {sens}",
+ "showlegend": real_idx == 0,
+ }
+ for real_idx, ((sens, real), real_df) in enumerate(
+ self.dframe.groupby(["SENSNAME_CASE", "REAL"])
+ )
+ ]
+ )
+
@property
def daterange(self) -> list:
active_dates = self.dframe["DATE"][self.dframe[self.vector] != 0]
@@ -226,3 +322,10 @@ def set_real_color(norm_value: float, mean_param_value: float) -> str:
return find_intermediate_color(Colors.MID, Colors.GREEN, intermed)
return Colors.MID
+
+ def normalize_parameter_value(self, df: pd.DataFrame) -> pd.DataFrame:
+
+ df["VALUE_NORM"] = (df[self.color_col] - df[self.color_col].min()) / (
+ df[self.color_col].max() - df[self.color_col].min()
+ )
+ return df
diff --git a/webviz_subsurface/plugins/__init__.py b/webviz_subsurface/plugins/__init__.py
index 900adade8..cc724ae2b 100644
--- a/webviz_subsurface/plugins/__init__.py
+++ b/webviz_subsurface/plugins/__init__.py
@@ -43,9 +43,6 @@
from ._pvt_plot import PvtPlot
from ._relative_permeability import RelativePermeability
from ._reservoir_simulation_timeseries import ReservoirSimulationTimeSeries
-from ._reservoir_simulation_timeseries_onebyone import (
- ReservoirSimulationTimeSeriesOneByOne,
-)
from ._reservoir_simulation_timeseries_regional import (
ReservoirSimulationTimeSeriesRegional,
)
@@ -54,6 +51,7 @@
from ._segy_viewer import SegyViewer
from ._seismic_misfit import SeismicMisfit
from ._simulation_time_series import SimulationTimeSeries
+from ._simulation_timeseries_onebyone import ReservoirSimulationTimeSeriesOneByOne
from ._structural_uncertainty import StructuralUncertainty
from ._subsurface_map import SubsurfaceMap
from ._surface_viewer_fmu import SurfaceViewerFMU
diff --git a/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py b/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py
index acab713fa..a38830ff6 100644
--- a/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py
+++ b/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py
@@ -1,12 +1,13 @@
import datetime
import json
from pathlib import Path
-from typing import Callable, List, Tuple, Union
+from typing import Callable, List, Optional, Tuple, Union
from uuid import uuid4
import numpy as np
import pandas as pd
import webviz_core_components as wcc
+import webviz_subsurface_components as wsc
from dash import Dash, Input, Output, State, callback_context, dash_table, dcc, html
from dash.exceptions import PreventUpdate
from webviz_config import WebvizPluginABC, WebvizSettings
@@ -14,9 +15,19 @@
from webviz_config.webviz_store import webvizstore
from webviz_subsurface._components import TornadoWidget
-from webviz_subsurface._models import (
- EnsembleSetModel,
- caching_ensemble_set_model_factory,
+from webviz_subsurface._figures import TimeSeriesFigure
+from webviz_subsurface._models.parameter_model import ParametersModel
+from webviz_subsurface._providers import (
+ EnsembleSummaryProviderFactory,
+ EnsembleTableProviderFactory,
+ EnsembleTableProviderSet,
+ Frequency,
+)
+from webviz_subsurface._utils.dataframe_utils import merge_dataframes_on_realization
+from webviz_subsurface._utils.datetime_utils import from_str, to_str
+from webviz_subsurface.plugins._parameter_analysis.models import (
+ ProviderTimeSeriesDataModel,
+ SimulationTimeSeriesModel,
)
from .._abbreviations.number_formatting import table_statistics_base
@@ -112,11 +123,6 @@ class ReservoirSimulationTimeSeriesOneByOne(WebvizPluginABC):
"RUNPATH",
]
- TABLE_STAT: List[Tuple[str, dict]] = [
- ("Sensitivity", {}),
- ("Case", {}),
- ] + table_statistics_base()
-
# pylint: disable=too-many-arguments
def __init__(
self,
@@ -124,19 +130,24 @@ def __init__(
webviz_settings: WebvizSettings,
csvfile_smry: Path = None,
csvfile_parameters: Path = None,
+ time_index: str = "monthly",
+ sampling: str = "monthly",
+ rel_file_pattern: str = "share/results/unsmry/*.arrow",
ensembles: list = None,
column_keys: list = None,
initial_vector: str = None,
- sampling: str = "monthly",
line_shape_fallback: str = "linear",
) -> None:
super().__init__()
- self.time_index = sampling
- self.column_keys = column_keys
self.csvfile_smry = csvfile_smry
self.csvfile_parameters = csvfile_parameters
+ self.ensembles = ensembles
+ self.vmodel: Optional[
+ Union[SimulationTimeSeriesModel, ProviderTimeSeriesDataModel]
+ ] = None
+ table_provider = EnsembleTableProviderFactory.instance()
if csvfile_smry and ensembles:
raise ValueError(
@@ -144,54 +155,72 @@ def __init__(
'"ensembles"'
)
if csvfile_smry and csvfile_parameters:
- self.smry = read_csv(csvfile_smry)
- self.parameters = read_csv(csvfile_parameters)
- self.parameters["SENSTYPE"] = self.parameters.apply(
- lambda row: find_sens_type(row.SENSCASE), axis=1
+ smry_df = read_csv(csvfile_smry)
+ parameter_df = read_csv(csvfile_parameters)
+
+ self.vmodel = SimulationTimeSeriesModel(
+ dataframe=smry_df, line_shape_fallback=line_shape_fallback
)
- self.smry_meta = None
elif ensembles:
- self.ens_paths = {
- ensemble: webviz_settings.shared_settings["scratch_ensembles"][ensemble]
- for ensemble in ensembles
+
+ ensemble_paths = {
+ ensemble_name: webviz_settings.shared_settings["scratch_ensembles"][
+ ensemble_name
+ ]
+ for ensemble_name in ensembles
}
- self.emodel: EnsembleSetModel = (
- caching_ensemble_set_model_factory.get_or_create_model(
- ensemble_paths=self.ens_paths,
- time_index=self.time_index,
- column_keys=self.column_keys,
+
+ resampling_frequency = Frequency(time_index)
+ provider_factory = EnsembleSummaryProviderFactory.instance()
+
+ try:
+ provider_set = {
+ ens: provider_factory.create_from_arrow_unsmry_presampled(
+ str(ens_path), rel_file_pattern, resampling_frequency
+ )
+ for ens, ens_path in ensemble_paths.items()
+ }
+ self.vmodel = ProviderTimeSeriesDataModel(
+ provider_set=provider_set, column_keys=column_keys
)
- )
- self.smry = self.emodel.get_or_load_smry_cached()
- self.smry_meta = self.emodel.load_smry_meta()
- # Extract realizations and sensitivity information
- self.parameters = get_realizations(
- ensemble_paths=self.ens_paths, ensemble_set_name="EnsembleSet"
+ except ValueError as error:
+ message = (
+ f"Some/all ensembles are missing arrow files at {rel_file_pattern}.\n"
+ "If no arrow files have been generated with `ERT` using `ECL2CSV`, "
+ "the commandline tool `smry2arrow_batch` can be used to generate arrow "
+ "files for an ensemble"
+ )
+ raise ValueError(message) from error
+
+ parameter_df = self.create_df_from_table_provider(
+ table_provider.create_provider_set_from_per_realization_parameter_file(
+ ensemble_paths
+ )
)
+
else:
raise ValueError(
'Incorrent arguments. Either provide a "csvfile_smry" and "csvfile_parameters" or '
'"ensembles"'
)
- self.smry_cols = [
- c
- for c in self.smry.columns
- if c not in ReservoirSimulationTimeSeriesOneByOne.ENSEMBLE_COLUMNS
- and historical_vector(c, self.smry_meta, False) not in self.smry.columns
- ]
+
+ self.pmodel = ParametersModel(dataframe=parameter_df, drop_constants=True)
+ self.parameter_df = self.pmodel.dataframe
+
+ self.vectors = self.vmodel.vectors
+ self.smry_meta = None
+
self.initial_vector = (
initial_vector
- if initial_vector and initial_vector in self.smry_cols
- else self.smry_cols[0]
- )
- self.ensembles = list(self.parameters["ENSEMBLE"].unique())
- self.line_shape_fallback = set_simulation_line_shape_fallback(
- line_shape_fallback
+ if initial_vector and initial_vector in self.vectors
+ else self.vectors[0]
)
+ self.ensembles = list(self.parameter_df["ENSEMBLE"].unique())
+ self.realizations = list(self.parameter_df["REAL"].unique())
self.tornadoplot = TornadoWidget(
- app, webviz_settings, self.parameters, allow_click=True
+ app, webviz_settings, self.parameter_df, allow_click=True
)
self.uid = uuid4()
self.theme = webviz_settings.theme
@@ -201,6 +230,18 @@ def ids(self, element: str) -> str:
"""Generate unique id for dom element"""
return f"{element}-id-{self.uid}"
+ def create_df_from_table_provider(
+ self, provider: EnsembleTableProviderSet
+ ) -> pd.DataFrame:
+ dfs = []
+ for ens in provider.ensemble_names():
+ df = provider.ensemble_provider(ens).get_column_data(
+ column_names=provider.ensemble_provider(ens).column_names()
+ )
+ df["ENSEMBLE"] = df.get("ENSEMBLE", ens)
+ dfs.append(df)
+ return pd.concat(dfs)
+
@property
def tour_steps(self) -> List[dict]:
return [
@@ -242,26 +283,54 @@ def ensemble_selector(self) -> html.Div:
)
@property
- def smry_selector(self) -> html.Div:
+ def visualization_selector(self) -> html.Div:
"""Dropdown to select ensemble"""
- return wcc.Dropdown(
- label="Time series",
- id=self.ids("vector"),
+ return wcc.RadioItems(
+ id=self.ids("visualization"),
options=[
- {
- "label": f"{simulation_vector_description(vec)} ({vec})",
- "value": vec,
- }
- for vec in self.smry_cols
+ {"label": "Individual realizations", "value": "realizations"},
+ {"label": "Mean over Sensitivities", "value": "sensmean"},
],
- clearable=False,
- value=self.initial_vector,
+ value="realizations",
)
@property
- def initial_date(self) -> datetime.date:
- df = self.smry[["ENSEMBLE", "DATE"]]
- return df.loc[df["ENSEMBLE"] == df["ENSEMBLE"].unique()[0]]["DATE"].max()
+ def sensitivity_selector(self) -> html.Div:
+ """Dropdown to select ensemble"""
+ return wcc.SelectWithLabel(
+ id=self.ids("sensitivity_filter"),
+ options=[{"label": i, "value": i} for i in self.pmodel.sensitivities],
+ value=self.pmodel.sensitivities,
+ size=min(20, len(self.pmodel.sensitivities)),
+ )
+
+ @property
+ def vector_selector(self) -> html.Div:
+ """Dropdown to select ensemble"""
+ return wsc.VectorSelector(
+ id=self.ids("vector"),
+ maxNumSelectedNodes=1,
+ data=self.vmodel.vector_selector_data,
+ persistence=True,
+ persistence_type="session",
+ selectedTags=[self.initial_vector],
+ numSecondsUntilSuggestionsAreShown=0.5,
+ lineBreakAfterTag=True,
+ )
+
+ @property
+ def colormap(self) -> dict:
+ return {
+ sens: color
+ for sens, color in zip(
+ self.parameter_df["SENSNAME_CASE"],
+ (self.theme.plotly_theme["layout"]["colorway"] * 3),
+ )
+ }
+
+ @property
+ def initial_date(self) -> str:
+ return to_str(max(self.vmodel.dates))
def add_webvizstore(self) -> List[Tuple[Callable, list]]:
return (
@@ -275,18 +344,7 @@ def add_webvizstore(self) -> List[Tuple[Callable, list]]:
)
]
if self.csvfile_smry and self.csvfile_parameters
- else self.emodel.webvizstore
- + [
- (
- get_realizations,
- [
- {
- "ensemble_paths": self.ens_paths,
- "ensemble_set_name": "EnsembleSet",
- }
- ],
- )
- ]
+ else []
)
@property
@@ -301,51 +359,36 @@ def layout(self) -> html.Div:
children=[
wcc.Selectors(
label="Selectors",
- children=[self.ensemble_selector, self.smry_selector],
+ children=[
+ self.ensemble_selector,
+ self.vector_selector,
+ ],
+ ),
+ wcc.Selectors(
+ label="Visualization",
+ children=self.visualization_selector,
),
- dcc.Store(
- id=self.ids("date-store"),
- storage_type="session",
+ wcc.Selectors(
+ label="Sensitivity filter",
+ children=[self.sensitivity_selector],
),
],
),
),
wcc.FlexColumn(
flex=3,
- children=wcc.Frame(
- style={"height": "90vh"},
- color="white",
- highlight=False,
- children=[
- html.Div(
- id=self.ids("graph-wrapper"),
- style={"height": "450px"},
- children=wcc.Graph(
- id=self.ids("graph"),
- clickData={"points": [{"x": self.initial_date}]},
- ),
+ children=[
+ wcc.Frame(
+ style={"height": "48vh"},
+ color="white",
+ highlight=False,
+ children=wcc.Graph(
+ id=self.ids("graph"),
+ style={"height": "46vh"},
+ clickData={"points": [{"x": self.initial_date}]},
),
- html.Div(
- children=[
- html.Div(
- id=self.ids("table_title"),
- style={"textAlign": "center"},
- children="",
- ),
- html.Div(
- style={"fontSize": "15px"},
- children=dash_table.DataTable(
- id=self.ids("table"),
- sort_action="native",
- filter_action="native",
- page_action="native",
- page_size=10,
- ),
- ),
- ],
- ),
- ],
- ),
+ ),
+ ],
),
wcc.FlexColumn(
flex=3,
@@ -360,20 +403,24 @@ def layout(self) -> html.Div:
],
)
+ def create_vectors_statistics_df(self, dframe, vector) -> pd.DataFrame:
+ return (
+ dframe[["DATE", vector, "SENSNAME_CASE"]]
+ .groupby(["DATE", "SENSNAME_CASE"])
+ .mean()
+ .reset_index()
+ )
+
# pylint: disable=too-many-statements
def set_callbacks(self, app: Dash) -> None:
@app.callback(
[
- # Output(self.ids("date-store"), "children"),
- Output(self.ids("table"), "data"),
- Output(self.ids("table"), "columns"),
- Output(self.ids("table_title"), "children"),
Output(self.tornadoplot.storage_id, "data"),
],
[
Input(self.ids("ensemble"), "value"),
Input(self.ids("graph"), "clickData"),
- Input(self.ids("vector"), "value"),
+ Input(self.ids("vector"), "selectedNodes"),
],
)
def _render_date(
@@ -385,25 +432,19 @@ def _render_date(
date = clickdata["points"][0]["x"]
except TypeError as exc:
raise PreventUpdate from exc
- data = filter_ensemble(self.smry, self.parameters, ensemble, [vector])
- data = data.loc[data["DATE"].astype(str) == date]
- table_rows, table_columns = calculate_table(data, vector)
+ vector = vector[0]
+
+ vector_df = self.vmodel.get_vector_df(
+ ensemble=ensemble, realizations=self.realizations, vectors=[vector]
+ )
+
+ vector_df = vector_df.loc[vector_df["DATE"] == from_str(date)]
+
return (
- # json.dumps(f"{date}"),
- table_rows,
- table_columns,
- (
- f"{simulation_vector_description(vector)} ({vector})"
- + (
- ""
- if get_unit(self.smry_meta, vector) is None
- else f" [{get_unit(self.smry_meta, vector)}]"
- )
- ),
json.dumps(
{
"ENSEMBLE": ensemble,
- "data": data[["REAL", vector]].values.tolist(),
+ "data": vector_df[["REAL", vector]].values.tolist(),
"number_format": "#.4g",
"unit": (
""
@@ -416,20 +457,20 @@ def _render_date(
@app.callback(
Output(self.ids("graph"), "figure"),
- [
- Input(self.tornadoplot.click_id, "data"),
- Input(self.tornadoplot.high_low_storage_id, "data"),
- ],
- [
- State(self.ids("ensemble"), "value"),
- State(self.ids("vector"), "value"),
- State(self.ids("graph"), "clickData"),
- State(self.ids("graph"), "figure"),
- ],
+ Input(self.tornadoplot.click_id, "data"),
+ Input(self.tornadoplot.high_low_storage_id, "data"),
+ Input(self.ids("sensitivity_filter"), "value"),
+ Input(self.ids("visualization"), "value"),
+ State(self.ids("ensemble"), "value"),
+ State(self.ids("vector"), "selectedNodes"),
+ State(self.ids("graph"), "clickData"),
+ State(self.ids("graph"), "figure"),
)
def _render_tornado( # pylint: disable=too-many-branches, too-many-locals
tornado_click_data_str: Union[str, None],
high_low_storage: dict,
+ sensitivites,
+ visualization,
ensemble: str,
vector: str,
date_click: dict,
@@ -439,7 +480,7 @@ def _render_tornado( # pylint: disable=too-many-branches, too-many-locals
if callback_context.triggered is None:
raise PreventUpdate
ctx = callback_context.triggered[0]["prop_id"].split(".")[0]
-
+ vector = vector[0]
tornado_click: Union[dict, None] = (
json.loads(tornado_click_data_str) if tornado_click_data_str else None
)
@@ -447,223 +488,68 @@ def _render_tornado( # pylint: disable=too-many-branches, too-many-locals
reset_click = tornado_click["sens_name"] is None
else:
reset_click = False
-
- # Draw initial figure and redraw if ensemble/vector changes
- if ctx in ["", self.tornadoplot.high_low_storage_id] or reset_click:
- vectors = [vector]
- historical_vector_name = historical_vector(vector, self.smry_meta, True)
-
- if (
- historical_vector_name is not None
- and historical_vector_name in self.smry.columns
- ):
- vectors.append(historical_vector_name)
- data = filter_ensemble(
- self.smry,
- self.parameters,
- ensemble,
- vectors,
- )
-
- line_shape = get_simulation_line_shape(
- line_shape_fallback=self.line_shape_fallback,
- vector=vector,
- smry_meta=self.smry_meta,
- )
- traces = [
- {
- "type": "line",
- "marker": {"color": "grey"},
- "hoverinfo": "x+y+text",
- "hovertext": f"Real: {r}",
- "x": df["DATE"],
- "y": df[vector],
- "customdata": r,
- "line": {"shape": line_shape},
- "meta": {
- "SENSCASE": df["SENSCASE"].values[0],
- "SENSTYPE": df["SENSTYPE"].values[0],
- },
- "name": ensemble,
- "legendgroup": ensemble,
- "showlegend": r == data["REAL"][0],
- }
- for r, df in data.groupby(["REAL"])
- ]
- if historical_vector(vector, self.smry_meta, True) in data.columns:
- hist = data[data["REAL"] == data["REAL"][0]]
- traces.append(
- {
- "type": "line",
- "x": hist["DATE"],
- "y": hist[historical_vector(vector, self.smry_meta, True)],
- "line": {
- "shape": line_shape,
- "color": "black",
- "width": 3,
- },
- "name": "History",
- "legendgroup": "History",
- "showlegend": True,
- }
- )
- # traces[0]["hoverinfo"] = "x"
- figure = {
- "data": traces,
- "layout": {"margin": {"t": 60}, "hovermode": "closest"},
- }
-
+ print(ctx)
+ # # Draw initial figure and redraw if ensemble/vector changes
+ # if ctx in ["", self.tornadoplot.high_low_storage_id] or reset_click:
+
+ realizations = list(
+ self.parameter_df[self.parameter_df["SENSNAME"].isin(sensitivites)][
+ "REAL"
+ ].unique()
+ )
# Update line colors if a sensitivity is selected in tornado
# pylint: disable=too-many-nested-blocks
- if tornado_click and tornado_click["sens_name"] in high_low_storage:
- if ctx == self.tornadoplot.high_low_storage_id:
- tornado_click["real_low"] = high_low_storage[
- tornado_click["sens_name"]
- ].get("real_low")
- tornado_click["real_high"] = high_low_storage[
- tornado_click["sens_name"]
- ].get("real_high")
- if reset_click:
- add_legend = True
- for trace in figure["data"]:
- if trace["name"] != "History":
- if add_legend:
- trace["showlegend"] = True
- add_legend = False
- else:
- trace["showlegend"] = False
- trace["marker"] = {"color": "grey"}
- trace["opacity"] = 1
- trace["name"] = ensemble
- trace["legendgroup"] = ensemble
- trace["hoverinfo"] = "all"
- trace["hovertext"] = f"Real: {trace['customdata']}"
-
- else:
- add_legend_low = True
- add_legend_high = True
- for trace in figure["data"]:
- if trace["name"] != "History":
- if trace["customdata"] in tornado_click["real_low"]:
- trace["marker"] = {
- "color": self.theme.plotly_theme["layout"][
- "colorway"
- ][0]
- }
- trace["opacity"] = 1
- trace["legendgroup"] = "real_low"
- trace["hoverinfo"] = "all"
- trace["name"] = (
- "Below ref"
- if trace["meta"]["SENSTYPE"] == "mc"
- else trace["meta"]["SENSCASE"]
- )
- if add_legend_low:
- add_legend_low = False
- trace["showlegend"] = True
- else:
- trace["showlegend"] = False
- elif trace["customdata"] in tornado_click["real_high"]:
- trace["marker"] = {
- "color": self.theme.plotly_theme["layout"][
- "colorway"
- ][1]
- }
- trace["opacity"] = 1
- trace["legendgroup"] = "real_high"
- trace["hoverinfo"] = "all"
- trace["name"] = (
- "Above ref"
- if trace["meta"]["SENSTYPE"] == "mc"
- else trace["meta"]["SENSCASE"]
- )
- if add_legend_high:
- add_legend_high = False
- trace["showlegend"] = True
- else:
- trace["showlegend"] = False
- else:
- trace["marker"] = {"color": "lightgrey"}
- trace["opacity"] = 0.02
- trace["showlegend"] = False
- trace["hoverinfo"] = "skip"
+ # if tornado_click and tornado_click["sens_name"] in high_low_storage:
+ if tornado_click and ctx in [
+ self.tornadoplot.click_id,
+ self.tornadoplot.high_low_storage_id,
+ ]:
+ tornado_click["real_low"] = high_low_storage[
+ tornado_click["sens_name"]
+ ].get("real_low")
+ tornado_click["real_high"] = high_low_storage[
+ tornado_click["sens_name"]
+ ].get("real_high")
+ realizations = tornado_click["real_low"] + tornado_click["real_high"]
+ print(realizations)
+
+ # Get dataframe with vectors and dataframe with parameters and merge
+ vector_df = self.vmodel.get_vector_df(
+ ensemble=ensemble, realizations=realizations, vectors=[vector]
+ )
+
+ param_df = self.parameter_df[
+ self.parameter_df["ENSEMBLE"] == ensemble
+ ].copy()
+ data = merge_dataframes_on_realization(dframe1=vector_df, dframe2=param_df)
date = date_click["points"][0]["x"]
- if figure is None:
- raise PreventUpdate
- ymin = min([min(trace["y"]) for trace in figure["data"]])
- ymax = max([max(trace["y"]) for trace in figure["data"]])
- figure["layout"]["shapes"] = [
- {"type": "line", "x0": date, "x1": date, "y0": ymin, "y1": ymax}
- ]
+
+ if visualization == "sensmean":
+ data = self.create_vectors_statistics_df(data, vector)
+
+ figure = TimeSeriesFigure(
+ dframe=data,
+ visualization="realizations",
+ vector=vector,
+ ensemble=ensemble,
+ dateline=from_str(date),
+ historical_vector_df=self.vmodel.get_historical_vector_df(
+ vector, ensemble
+ ),
+ color_col="SENSNAME_CASE",
+ line_shape_fallback=self.vmodel.line_shape_fallback,
+ discrete_color=True,
+ discrete_color_map=self.colormap,
+ groupby="SENSNAME_CASE" if visualization == "sensmean" else "REAL",
+ ).figure
figure["layout"]["title"] = (
f"Date: {date}, "
f"Sensitivity: {tornado_click['sens_name'] if tornado_click else None}"
)
- figure["layout"]["yaxis"] = {
- "title": f"{simulation_vector_description(vector)} ({vector})"
- + (
- ""
- if get_unit(self.smry_meta, vector) is None
- else f" [{get_unit(self.smry_meta, vector)}]"
- ),
- "uirevision": vector,
- }
- figure["layout"]["xaxis"] = {"uirevision": "locked"}
- figure["layout"]["legend"] = {
- "orientation": "h",
- # "traceorder": "reversed",
- "y": 1.1,
- "x": 1,
- "xanchor": "right",
- }
- figure["layout"] = self.theme.create_themed_layout(figure["layout"])
return figure
-@CACHE.memoize(timeout=CACHE.TIMEOUT)
-def calculate_table(df: pd.DataFrame, vector: str) -> Tuple[List[dict], List[dict]]:
- table = []
- for (sensname, senscase), dframe in df.groupby(["SENSNAME", "SENSCASE"]):
- values = dframe[vector]
- try:
- table.append(
- {
- "Sensitivity": str(sensname),
- "Case": str(senscase),
- "Minimum": values.min(),
- "Maximum": values.max(),
- "Mean": values.mean(),
- "Stddev": values.std(),
- "P10": np.percentile(values, 90),
- "P90": np.percentile(values, 10),
- }
- )
- except KeyError:
- pass
- columns = [
- {**{"name": i[0], "id": i[0]}, **i[1]}
- for i in ReservoirSimulationTimeSeriesOneByOne.TABLE_STAT
- ]
- return table, columns
-
-
-def filter_ensemble(
- smry: pd.DataFrame, parameters: pd.DataFrame, ensemble: str, vector: List[str]
-) -> pd.DataFrame:
- smry_columns = ["DATE", "REAL"] + vector
- parameter_columns = ["REAL", "SENSCASE", "SENSNAME", "SENSTYPE"]
- return pd.merge(
- smry[smry_columns + ["ENSEMBLE"]].loc[smry["ENSEMBLE"] == ensemble][
- smry_columns
- ],
- parameters[parameter_columns + ["ENSEMBLE"]].loc[
- parameters["ENSEMBLE"] == ensemble
- ][parameter_columns],
- on=["REAL"],
- )
-
-
@CACHE.memoize(timeout=CACHE.TIMEOUT)
@webvizstore
def read_csv(csv_file: Path) -> pd.DataFrame:
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py
new file mode 100644
index 000000000..84d0252ab
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py
@@ -0,0 +1 @@
+from ._plugin import ReservoirSimulationTimeSeriesOneByOne
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_business_logic.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_business_logic.py
new file mode 100644
index 000000000..aa290cec4
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_business_logic.py
@@ -0,0 +1,196 @@
+from typing import List, Optional, Tuple
+
+import pandas as pd
+import plotly.graph_objects as go
+
+from webviz_config import WebvizSettings
+
+from webviz_subsurface._figures import TimeSeriesFigure
+from webviz_subsurface._components.tornado._tornado_bar_chart import TornadoBarChart
+from webviz_subsurface._components.tornado._tornado_data import TornadoData
+from webviz_subsurface._components.tornado._tornado_table import TornadoTable
+from webviz_subsurface._models.parameter_model import ParametersModel
+from webviz_subsurface._figures import create_figure
+from .models import ProviderTimeSeriesDataModel
+from ._utils import datetime_utils
+
+
+class SimulationTimeSeriesOneByOneDataModel:
+ """Class keeping the data needed in the vizualisations and various
+ data providing methods.
+ """
+
+ SELECTORS = ["QC_FLAG", "SATNUM", "EQLNUM", "FIPNUM"]
+
+ def __init__(
+ self,
+ vectormodel: ProviderTimeSeriesDataModel,
+ parametermodel: ParametersModel,
+ webviz_settings: WebvizSettings,
+ initial_vector: Optional[str],
+ ) -> None:
+
+ self.theme = webviz_settings.theme
+ self.pmodel = parametermodel
+ self.vmodel = vectormodel
+
+ self.parameter_df = parametermodel.sens_df.copy()
+
+ def test(x: pd.Series) -> pd.Series:
+ return x.apply(lambda v: list(x.unique()).index(v))
+
+ self.parameter_df["t"] = self.parameter_df.groupby("SENSNAME")[
+ "SENSCASE"
+ ].transform(test)
+
+ self.smry_meta = None
+ self._senscolormap = {
+ sens: color for sens, color in zip(self.pmodel.sensitivities, self.colors)
+ }
+ self.initial_vector = (
+ initial_vector
+ if initial_vector and initial_vector in vectormodel.vectors
+ else vectormodel.vectors[0]
+ )
+
+ def create_vectors_statistics_df(self, dframe: pd.DataFrame) -> pd.DataFrame:
+ cols = [x for x in self.parameter_df.columns if x != "REAL"]
+ return dframe.groupby(["DATE"] + cols).mean().reset_index()
+
+ @property
+ def colors(self) -> list:
+ return self.theme.plotly_theme["layout"]["colorway"] * 5
+
+ @property
+ def realizations(self) -> List[int]:
+ return list(self.parameter_df["REAL"].unique())
+
+ @property
+ def ensembles(self) -> List[str]:
+ return list(self.parameter_df["ENSEMBLE"].unique())
+
+ @property
+ def sensname_colormap(self) -> dict:
+ return self._senscolormap
+
+ def get_sensitivity_dataframe_for_ensemble(self, ensemble: str) -> pd.DataFrame:
+ return self.parameter_df[self.parameter_df["ENSEMBLE"] == ensemble]
+
+ def get_unique_sensitivities_for_ensemble(self, ensemble: str) -> list:
+ df = self.get_sensitivity_dataframe_for_ensemble(ensemble)
+ return list(df["SENSNAME"].unique())
+
+ @staticmethod
+ def get_tornado_reference(sensitivities: List[str], existing_reference: str) -> str:
+ if existing_reference in sensitivities:
+ return existing_reference
+ if "rms_seed" in sensitivities:
+ return "rms_seed"
+ return sensitivities[0]
+
+ def get_tornado_data(
+ self, dframe: pd.DataFrame, response: str, selections: dict
+ ) -> TornadoData:
+ dframe.rename(columns={response: "VALUE"}, inplace=True)
+ return TornadoData(
+ dframe=dframe,
+ reference=selections["Reference"],
+ response_name=response,
+ scale=selections["Scale"],
+ cutbyref=bool(selections["Remove no impact"]),
+ )
+
+ def create_tornado_figure(
+ self, tornado_data: TornadoData, selections: dict, use_si_format: bool
+ ) -> tuple:
+
+ return (
+ TornadoBarChart(
+ tornado_data=tornado_data,
+ plotly_theme=self.theme.plotly_theme,
+ label_options=selections["labeloptions"],
+ number_format="#.3g",
+ locked_si_prefix=None if use_si_format else "",
+ use_true_base=selections["Scale"] == "True",
+ show_realization_points=bool(selections["real_scatter"]),
+ show_reference=selections["torn_ref"],
+ color_by_sensitivity=selections["color_by_sens"],
+ sensitivity_color_map=self.sensname_colormap,
+ )
+ .figure.update_xaxes(side="bottom", title=None)
+ .update_layout(
+ title_text=f"Tornadoplot for {tornado_data.response_name}
",
+ margin={"t": 70},
+ )
+ )
+
+ def create_realplot(self, tornado_data: TornadoData) -> go.Figure:
+ df = tornado_data.real_df
+ senscasecolors = {
+ senscase: self.sensname_colormap[sensname]
+ for senscase, sensname in zip(df["sensname_case"], df["sensname"])
+ }
+
+ return (
+ create_figure(
+ plot_type="bar",
+ data_frame=df,
+ x="REAL",
+ y="VALUE",
+ color="sensname_case",
+ color_discrete_map=senscasecolors,
+ barmode="overlay",
+ custom_data=["casetype"],
+ yaxis={"range": [df["VALUE"].min() * 0.7, df["VALUE"].max() * 1.1]},
+ opacity=0.85,
+ )
+ .update_layout(legend={"orientation": "h", "yanchor": "bottom", "y": 1.02})
+ .update_layout(legend_title_text="", margin_b=0, margin_r=10)
+ .for_each_trace(
+ lambda t: (
+ t.update(marker_line_color="black")
+ if t["customdata"][0][0] == "high"
+ else t.update(marker_line_color="white", marker_line_width=2)
+ )
+ if t["customdata"][0][0] != "mc"
+ else None
+ )
+ )
+
+ def create_tornado_table(
+ self,
+ tornado_data: TornadoData,
+ use_si_format: bool,
+ ) -> Tuple[List[dict], List[dict]]:
+
+ tornado_table = TornadoTable(
+ tornado_data=tornado_data,
+ use_si_format=use_si_format,
+ precision=4 if use_si_format else 3,
+ )
+ return tornado_table.as_plotly_table, tornado_table.columns
+
+ def create_timeseries_figure(
+ self,
+ dframe: pd.DataFrame,
+ vector: str,
+ ensemble: str,
+ date: str,
+ visualization: str,
+ ) -> go.Figure:
+ return go.Figure(
+ TimeSeriesFigure(
+ dframe=dframe,
+ visualization=visualization,
+ vector=vector,
+ ensemble=ensemble,
+ dateline=datetime_utils.from_str(date),
+ historical_vector_df=self.vmodel.get_historical_vector_df(
+ vector, ensemble
+ ),
+ color_col="SENSNAME",
+ line_shape_fallback=self.vmodel.line_shape_fallback,
+ discrete_color_map=self.sensname_colormap,
+ groupby="SENSNAME_CASE",
+ ).figure
+ ).update_layout({"title": f"{vector}, Date: {date}"})
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py
new file mode 100644
index 000000000..fcdcb35eb
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py
@@ -0,0 +1,239 @@
+from typing import Callable, List, Union, Tuple
+
+from dash import ALL, Input, Output, State, callback, ctx, html, no_update
+from dash.exceptions import PreventUpdate
+import plotly.graph_objects as go
+from webviz_subsurface._utils.dataframe_utils import merge_dataframes_on_realization
+from ._utils import datetime_utils
+from ._layout import date_selector
+from ._business_logic import SimulationTimeSeriesOneByOneDataModel
+
+
+def plugin_callbacks(
+ get_uuid: Callable, datamodel: SimulationTimeSeriesOneByOneDataModel
+) -> None:
+ @callback(
+ Output(get_uuid("options-store"), "data"),
+ Input({"id": get_uuid("options"), "selector": ALL}, "value"),
+ State({"id": get_uuid("options"), "selector": ALL}, "id"),
+ )
+ def _update_options(option_values: list, options_id: List[dict]) -> dict:
+ """Update graph with line coloring, vertical line and title"""
+ return {opt["selector"]: value for opt, value in zip(options_id, option_values)}
+
+ @callback(
+ Output(get_uuid("real-store"), "data"),
+ Input(get_uuid("sensitivity_filter"), "value"),
+ State(get_uuid("ensemble"), "value"),
+ )
+ def _update_realization_store(sensitivites: list, ensemble: str) -> List[int]:
+ """Update graph with line coloring, vertical line and title"""
+ df = datamodel.get_sensitivity_dataframe_for_ensemble(ensemble)
+ return list(df[df["SENSNAME"].isin(sensitivites)]["REAL"].unique())
+
+ @callback(
+ Output(get_uuid("sensitivity_filter"), "value"),
+ Input(get_uuid("tornado-graph"), "clickData"),
+ State({"id": get_uuid("options"), "selector": "Reference"}, "value"),
+ prevent_initial_call=True,
+ )
+ def _update_sensitivity_filter(
+ tornado_click_data: dict, reference: str
+ ) -> List[str]:
+ """Update graph with line coloring, vertical line and title"""
+ clicked_data = tornado_click_data["points"][0]
+ return [clicked_data["y"], reference]
+
+ @callback(
+ Output(get_uuid("sensitivity_filter"), "options"),
+ Output({"id": get_uuid("options"), "selector": "Reference"}, "options"),
+ Output({"id": get_uuid("options"), "selector": "Reference"}, "value"),
+ Output(get_uuid("vector"), "data"),
+ Output(get_uuid("vector"), "selectedTags"),
+ Input(get_uuid("ensemble"), "value"),
+ State(get_uuid("vector"), "selectedNodes"),
+ State({"id": get_uuid("options"), "selector": "Reference"}, "value"),
+ )
+ def _update_sensitivity_filter_and_reference(
+ ensemble: str, vector: list, reference: str
+ ) -> tuple:
+ """Update graph with line coloring, vertical line and title"""
+ sensitivities = datamodel.get_unique_sensitivities_for_ensemble(ensemble)
+ available_vectors = datamodel.vmodel._provider_set[
+ ensemble
+ ].vector_names_filtered_by_value(
+ exclude_all_values_zero=True, exclude_constant_values=True
+ )
+ vector_selector_data = datamodel.vmodel.create_vector_selector_data(
+ available_vectors
+ )
+ vector = vector if vector[0] in available_vectors else [available_vectors[0]]
+ return (
+ [{"label": elm, "value": elm} for elm in sensitivities],
+ [{"label": elm, "value": elm} for elm in sensitivities],
+ datamodel.get_tornado_reference(sensitivities, reference),
+ vector_selector_data,
+ vector,
+ )
+
+ @callback(
+ Output(get_uuid("vector-store"), "data"),
+ Input(get_uuid("vector"), "selectedNodes"),
+ )
+ def _update_vector_store(vector: list) -> str:
+ """Unpack selected vector in vector selector"""
+ if not vector:
+ raise PreventUpdate
+ return vector[0]
+
+ @callback(
+ Output(get_uuid("date-store"), "data"),
+ Output(get_uuid("date_selector_wrapper"), "children"),
+ Input(get_uuid("ensemble"), "value"),
+ Input(get_uuid("graph"), "clickData"),
+ Input({"id": get_uuid("date-slider"), "test": ALL}, "value"),
+ State(get_uuid("date-store"), "data"),
+ )
+ def _render_date_selector(
+ ensemble: str,
+ timeseries_clickdata: Union[None, dict],
+ dateidx: List[int],
+ date: str,
+ ) -> Tuple[str, html.Div]:
+ """Store selected date and tornado input. Write statistics
+ to table"""
+
+ dates = datamodel.vmodel.dates_for_ensemble(ensemble)
+ dateslider_drag = get_uuid("date-slider") in str(ctx.triggered_id)
+
+ if timeseries_clickdata is not None and ctx.triggered_id == get_uuid("graph"):
+ date = timeseries_clickdata.get("points", [{}])[0]["x"]
+ elif dateslider_drag:
+ date = datetime_utils.to_str(dates[dateidx[0]])
+
+ date_selected = (
+ datetime_utils.from_str(date)
+ if datetime_utils.from_str(date) in dates
+ else datamodel.vmodel.get_last_date(ensemble)
+ )
+
+ return (
+ datetime_utils.to_str(date_selected),
+ date_selector(get_uuid, date_selected=date_selected, dates=dates)
+ if not dateslider_drag
+ else no_update,
+ )
+
+ @callback(
+ Output({"id": get_uuid("date-selected-text"), "test": ALL}, "children"),
+ Input({"id": get_uuid("date-slider"), "test": ALL}, "drag_value"),
+ Input(get_uuid("ensemble"), "value"),
+ prevent_initial_call=True,
+ )
+ def _update_date_text(dateidx: List[int], ensemble: str) -> List[str]:
+ """Update selected date text on date-slider drag"""
+ dates = datamodel.vmodel.dates_for_ensemble(ensemble)
+ return [datetime_utils.to_str(dates[dateidx[0]])]
+
+ @callback(
+ Output(get_uuid("graph"), "figure"),
+ Input(get_uuid("date-store"), "data"),
+ Input(get_uuid("visualization"), "value"),
+ Input(get_uuid("vector-store"), "data"),
+ Input(get_uuid("real-store"), "data"),
+ State(get_uuid("ensemble"), "value"),
+ )
+ def _update_timeseries_figure(
+ date: str,
+ visualization: str,
+ vector: str,
+ realizations: list,
+ ensemble: str,
+ ) -> go.Figure:
+ # Get dataframe with vectors and dataframe with parameters and merge
+ vector_df = datamodel.vmodel.get_vector_df(
+ ensemble=ensemble, vectors=[vector], realizations=realizations
+ )
+ data = merge_dataframes_on_realization(
+ dframe1=vector_df,
+ dframe2=datamodel.get_sensitivity_dataframe_for_ensemble(ensemble),
+ )
+ if visualization == "sensmean":
+ data = datamodel.create_vectors_statistics_df(data)
+
+ return datamodel.create_timeseries_figure(
+ data, vector, ensemble, date, visualization
+ )
+
+ @callback(
+ Output(get_uuid("table"), "data"),
+ Output(get_uuid("table"), "columns"),
+ Output(get_uuid("tornado-graph"), "figure"),
+ Input(get_uuid("date-store"), "data"),
+ Input(get_uuid("options-store"), "data"),
+ Input(get_uuid("vector-store"), "data"),
+ State(get_uuid("ensemble"), "value"),
+ )
+ def _update_tornadoplot(
+ date: str, selections: dict, vector: str, ensemble: str
+ ) -> tuple:
+
+ if selections is None:
+ raise PreventUpdate
+
+ # Get dataframe with vectors and dataframe with parameters and merge
+ vector_df = datamodel.vmodel.get_vector_df(
+ ensemble=ensemble, vectors=[vector], date=datetime_utils.from_str(date)
+ )
+ data = merge_dataframes_on_realization(
+ dframe1=vector_df,
+ dframe2=datamodel.get_sensitivity_dataframe_for_ensemble(ensemble),
+ )
+
+ tornado_data = datamodel.get_tornado_data(data, vector, selections)
+ use_si_format = tornado_data.reference_average > 1000
+ tornadofig = datamodel.create_tornado_figure(
+ tornado_data, selections, use_si_format
+ )
+ table, columns = datamodel.create_tornado_table(tornado_data, use_si_format)
+ return table, columns, tornadofig
+
+ @callback(
+ Output(get_uuid("real-graph"), "figure"),
+ Input(get_uuid("date-store"), "data"),
+ State(get_uuid("options-store"), "data"),
+ Input(get_uuid("vector-store"), "data"),
+ State(get_uuid("ensemble"), "value"),
+ Input(get_uuid("bottom-viz"), "value"),
+ )
+ def _update_realplot(
+ date: str,
+ selections: dict,
+ vector: str,
+ ensemble: str,
+ selected_vizualisation: str,
+ ) -> go.Figure:
+ if selections is None or selected_vizualisation == "table":
+ raise PreventUpdate
+
+ # Get dataframe with vectors and dataframe with parameters and merge
+ vector_df = datamodel.vmodel.get_vector_df(
+ ensemble=ensemble, vectors=[vector], date=datetime_utils.from_str(date)
+ )
+ data = merge_dataframes_on_realization(
+ dframe1=vector_df,
+ dframe2=datamodel.get_sensitivity_dataframe_for_ensemble(ensemble),
+ )
+ tornado_data = datamodel.get_tornado_data(data, vector, selections)
+
+ return datamodel.create_realplot(tornado_data)
+
+ @callback(
+ Output(get_uuid("real-graph-wrapper"), "style"),
+ Output(get_uuid("table-wrapper"), "style"),
+ Input(get_uuid("bottom-viz"), "value"),
+ )
+ def _display_table_or_realplot(selected_vizualisation: str) -> tuple:
+ return {"display": "none" if selected_vizualisation == "table" else "block"}, {
+ "display": "block" if selected_vizualisation == "table" else "none"
+ }
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_layout.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_layout.py
new file mode 100644
index 000000000..7c295d05d
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_layout.py
@@ -0,0 +1,331 @@
+import datetime
+from typing import Callable, List, Any
+from enum import Enum
+import webviz_core_components as wcc
+import webviz_subsurface_components as wsc
+from dash import html, dcc, dash_table
+
+from ._utils import datetime_utils
+
+from ._business_logic import SimulationTimeSeriesOneByOneDataModel
+
+# pylint: disable = too-few-public-methods
+class LayoutElements(str, Enum):
+ PLOT_WRAPPER = "plot-wrapper"
+ PLOT_SELECTOR = "plot-wrapper"
+
+
+class LayoutStyle:
+ MAIN_HEIGHT = "87vh"
+
+
+class FullScreen(wcc.WebvizPluginPlaceholder):
+ def __init__(self, children: List[Any]) -> None:
+ super().__init__(buttons=["expand"], children=children)
+
+
+def main_view(
+ get_uuid: Callable, datamodel: SimulationTimeSeriesOneByOneDataModel
+) -> wcc.FlexBox:
+ return wcc.FlexBox(
+ id=get_uuid("layout"),
+ children=[
+ wcc.FlexColumn(
+ flex=1,
+ children=selector_view(get_uuid, datamodel),
+ ),
+ wcc.FlexColumn(flex=6, children=data_view(get_uuid, datamodel)),
+ ],
+ )
+
+
+def selector_view(
+ get_uuid: Callable, datamodel: SimulationTimeSeriesOneByOneDataModel
+) -> html.Div:
+ initial_date = datamodel.vmodel.get_last_date(datamodel.ensembles[0])
+ return wcc.Frame(
+ style={"height": "90vh"},
+ children=[
+ wcc.Selectors(
+ label="Selectors",
+ children=[
+ ensemble_selector(get_uuid, datamodel.ensembles),
+ vector_selector(
+ get_uuid,
+ datamodel.vmodel.vector_selector_data,
+ datamodel.initial_vector,
+ ),
+ html.Div(
+ id=get_uuid("date_selector_wrapper"),
+ children=date_selector(
+ get_uuid,
+ date_selected=initial_date,
+ dates=datamodel.vmodel.dates_for_ensemble(
+ datamodel.ensembles[0]
+ ),
+ ),
+ ),
+ ],
+ ),
+ wcc.Selectors(
+ label="Visualization",
+ children=visualization_selector(get_uuid),
+ ),
+ wcc.Selectors(
+ label="Sensitivity filter",
+ children=sensitivity_selector(get_uuid, datamodel.pmodel.sensitivities),
+ ),
+ wcc.Selectors(
+ label="⚙️ SETTINGS",
+ open_details=True,
+ children=[
+ scale_selector(get_uuid),
+ checkboxes_settings(get_uuid),
+ labels_display(get_uuid),
+ reference_selector(get_uuid, datamodel.pmodel.sensitivities),
+ dcc.Store(get_uuid("options-store")),
+ dcc.Store(get_uuid("real-store")),
+ dcc.Store(
+ get_uuid("date-store"), data=datetime_utils.to_str(initial_date)
+ ),
+ dcc.Store(get_uuid("vector-store")),
+ ],
+ ),
+ ],
+ )
+
+
+def data_view(
+ get_uuid: Callable, datamodel: SimulationTimeSeriesOneByOneDataModel
+) -> wcc.FlexBox:
+ initial_date = datetime_utils.to_str(
+ datamodel.vmodel.get_last_date(datamodel.ensembles[0])
+ )
+
+ return html.Div(
+ children=[
+ wcc.FlexBox(
+ children=[
+ wcc.FlexColumn(
+ children=wcc.Frame(
+ style={"height": "50vh"},
+ color="white",
+ highlight=False,
+ children=wcc.Graph(
+ id=get_uuid("graph"),
+ style={"height": "48vh"},
+ clickData={"points": [{"x": initial_date}]},
+ ),
+ ),
+ ),
+ wcc.FlexColumn(
+ children=wcc.Frame(
+ style={"height": "50vh"},
+ color="white",
+ highlight=False,
+ id=get_uuid("tornado-wrapper"),
+ children=FullScreen(
+ wcc.Graph(
+ config={"displayModeBar": False},
+ style={"height": "100%", "min-height": "46vh"},
+ id=get_uuid("tornado-graph"),
+ ),
+ ),
+ ),
+ ),
+ ]
+ ),
+ wcc.Frame(
+ style={"height": "37vh"},
+ color="white",
+ highlight=False,
+ children=[
+ html.Div(
+ id=get_uuid("table-wrapper"),
+ style={"display": "block"},
+ children=dash_table.DataTable(
+ id=get_uuid("table"),
+ sort_action="native",
+ sort_mode="multi",
+ filter_action="native",
+ style_as_list_view=True,
+ style_table={"height": "35vh", "overflowY": "auto"},
+ ),
+ ),
+ html.Div(
+ id=get_uuid("real-graph-wrapper"),
+ style={"display": "none"},
+ children=wcc.Graph(
+ config={"displayModeBar": False},
+ style={"height": "35vh"},
+ id=get_uuid("real-graph"),
+ ),
+ ),
+ ],
+ ),
+ ]
+ )
+
+
+def checkboxes_settings(get_uuid: Callable) -> html.Div:
+ return html.Div(
+ style={"margin-top": "10px", "margin-bottom": "10px"},
+ children=[
+ wcc.Checklist(
+ id={"id": get_uuid("options"), "selector": selector},
+ options=[{"label": label, "value": "selected"}],
+ value=["selected"] if selected else [],
+ )
+ for label, selector, selected in [
+ ("Color by sensitivity", "color_by_sens", True),
+ ("Show realization points", "real_scatter", False),
+ ("Show reference on tornado", "torn_ref", True),
+ ("Remove sensitivities with no impact", "Remove no impact", True),
+ ]
+ ],
+ )
+
+
+def labels_display(get_uuid: Callable) -> html.Div:
+ return html.Div(
+ style={"margin-bottom": "10px"},
+ children=[
+ wcc.RadioItems(
+ label="Label options:",
+ id={"id": get_uuid("options"), "selector": "labeloptions"},
+ options=[
+ {"label": "detailed", "value": "detailed"},
+ {"label": "simple", "value": "simple"},
+ {"label": "hide", "value": "hide"},
+ ],
+ vertical=False,
+ value="simple",
+ ),
+ ],
+ )
+
+
+def reference_selector(get_uuid: Callable, sensitivities: list) -> wcc.Dropdown:
+ return wcc.Dropdown(
+ label="Reference:",
+ id={"id": get_uuid("options"), "selector": "Reference"},
+ options=[{"label": elm, "value": elm} for elm in sensitivities],
+ value="rms_seed" if "rms_seed" in sensitivities else sensitivities[0],
+ clearable=False,
+ )
+
+
+def date_selector(
+ get_uuid: Callable, date_selected: datetime.datetime, dates: List[datetime.datetime]
+) -> html.Div:
+ return html.Div(
+ style={"margin": "10px 0px"},
+ children=[
+ html.Div(
+ style={"display": "inline-flex"},
+ children=[
+ wcc.Label("Date:"),
+ wcc.Label(
+ datetime_utils.to_str(date_selected),
+ id={"id": get_uuid("date-selected-text"), "test": "test"},
+ style={"margin-left": "10px"},
+ ),
+ ],
+ ),
+ wcc.Slider(
+ id={"id": get_uuid("date-slider"), "test": "test"},
+ value=dates.index(date_selected),
+ min=0,
+ max=len(dates) - 1,
+ step=1,
+ included=False,
+ marks={
+ idx: {
+ "label": datetime_utils.to_str(dates[idx]),
+ "style": {"white-space": "nowrap"},
+ }
+ for idx in [0, len(dates) - 1]
+ },
+ ),
+ ],
+ )
+
+
+def scale_selector(get_uuid: Callable) -> wcc.Dropdown:
+ return wcc.Dropdown(
+ label="Scale:",
+ id={"id": get_uuid("options"), "selector": "Scale"},
+ options=[
+ {"label": "Relative value (%)", "value": "Percentage"},
+ {"label": "Relative value", "value": "Absolute"},
+ {"label": "True value", "value": "True"},
+ ],
+ value="Percentage",
+ clearable=False,
+ )
+
+
+def ensemble_selector(get_uuid: Callable, ensembles: list) -> html.Div:
+ """Dropdown to select ensemble"""
+ return wcc.Dropdown(
+ label="Ensemble",
+ id=get_uuid("ensemble"),
+ options=[{"label": i, "value": i} for i in ensembles],
+ clearable=False,
+ value=ensembles[0],
+ )
+
+
+def visualization_selector(get_uuid: Callable) -> html.Div:
+ """Dropdown to select ensemble"""
+ return html.Div(
+ [
+ wcc.RadioItems(
+ id=get_uuid("visualization"),
+ options=[
+ {"label": "Individual realizations", "value": "realizations"},
+ {"label": "Mean over Sensitivities", "value": "sensmean"},
+ ],
+ value="realizations",
+ ),
+ html.Div(
+ style={"margin-top": "10px"},
+ children=wcc.RadioItems(
+ label="Bottom visualization:",
+ id=get_uuid("bottom-viz"),
+ options=[
+ {"label": "Table", "value": "table"},
+ {"label": "Realization plot", "value": "realplot"},
+ ],
+ vertical=False,
+ value="table",
+ ),
+ ),
+ ]
+ )
+
+
+def sensitivity_selector(get_uuid: Callable, sensitivities: list) -> html.Div:
+ """Dropdown to select ensemble"""
+ return wcc.SelectWithLabel(
+ id=get_uuid("sensitivity_filter"),
+ options=[{"label": i, "value": i} for i in sensitivities],
+ value=sensitivities,
+ size=min(20, len(sensitivities)),
+ )
+
+
+def vector_selector(
+ get_uuid: Callable, vector_selector_data: list, initial_vector: str
+) -> html.Div:
+ """Dropdown to select ensemble"""
+ return wsc.VectorSelector(
+ id=get_uuid("vector"),
+ maxNumSelectedNodes=1,
+ data=vector_selector_data,
+ persistence=True,
+ persistence_type="session",
+ selectedTags=[initial_vector],
+ numSecondsUntilSuggestionsAreShown=0.5,
+ lineBreakAfterTag=True,
+ )
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py
new file mode 100644
index 000000000..3b3549a0f
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py
@@ -0,0 +1,171 @@
+from typing import List, Dict
+
+import pandas as pd
+from dash import html
+from webviz_config import WebvizPluginABC, WebvizSettings
+
+
+from webviz_subsurface._models.parameter_model import ParametersModel
+from webviz_subsurface._providers import (
+ EnsembleSummaryProviderFactory,
+ EnsembleTableProviderFactory,
+ EnsembleTableProvider,
+ Frequency,
+)
+
+from ._business_logic import SimulationTimeSeriesOneByOneDataModel
+from ._callbacks import plugin_callbacks
+from ._layout import main_view
+from .models import ProviderTimeSeriesDataModel
+
+
+class ReservoirSimulationTimeSeriesOneByOne(WebvizPluginABC):
+ """Visualizes reservoir simulation time series data for sensitivity studies based \
+on a design matrix.
+
+A tornado plot can be calculated interactively for each date/vector by selecting a date.
+After selecting a date individual sensitivities can be selected to highlight the realizations
+run with that sensitivity.
+
+---
+
+**Using simulation time series data directly from `UNSMRY` files**
+* **`ensembles`:** Which ensembles in `shared_settings` to visualize.
+* **`column_keys`:** List of vectors to extract. If not given, all vectors \
+ from the simulations will be extracted. Wild card asterisk `*` can be used.
+* **`sampling`:** Time separation between extracted values. Can be e.g. `monthly` (default) or \
+ `yearly`.
+
+**Common optional settings for both input options**
+* **`initial_vector`:** Initial vector to display
+* **`line_shape_fallback`:** Fallback interpolation method between points. Vectors identified as \
+ rates or phase ratios are always backfilled, vectors identified as cumulative (totals) are \
+ always linearly interpolated. The rest use the fallback.
+ Supported options:
+ * `linear` (default)
+ * `backfilled`
+ * `hv`, `vh`, `hvh`, `vhv` and `spline` (regular Plotly options).
+
+
+**Using simulation time series data directly from `.UNSMRY` files**
+
+Time series data are extracted automatically from the `UNSMRY` files in the individual
+realizations, using the `fmu-ensemble` library. The `SENSNAME` and `SENSCASE` values are read
+directly from the `parameters.txt` files of the individual realizations, assuming that these
+exist. If the `SENSCASE` of a realization is `p10_p90`, the sensitivity case is regarded as a
+**Monte Carlo** style sensitivity, otherwise the case is evaluated as a **scalar** sensitivity.
+
+?> Using the `UNSMRY` method will also extract metadata like units, and whether the vector is a \
+rate, a cumulative, or historical. Units are e.g. added to the plot titles, while rates and \
+cumulatives are used to decide the line shapes in the plot.
+"""
+
+ def __init__(
+ self,
+ webviz_settings: WebvizSettings,
+ ensembles: list,
+ time_index: str = "monthly",
+ rel_file_pattern: str = "share/results/unsmry/*.arrow",
+ column_keys: list = None,
+ initial_vector: str = None,
+ line_shape_fallback: str = "linear",
+ ) -> None:
+
+ super().__init__()
+
+ vectormodel: ProviderTimeSeriesDataModel
+ table_provider = EnsembleTableProviderFactory.instance()
+ provider_factory = EnsembleSummaryProviderFactory.instance()
+ resampling_frequency = Frequency(time_index)
+ # provider_factory.create_from_ensemble_csv_file()
+
+ ensemble_paths = {
+ ensemble_name: webviz_settings.shared_settings["scratch_ensembles"][
+ ensemble_name
+ ]
+ for ensemble_name in ensembles
+ }
+ try:
+ provider_set = {
+ ens: provider_factory.create_from_arrow_unsmry_presampled(
+ str(ens_path), rel_file_pattern, resampling_frequency
+ )
+ for ens, ens_path in ensemble_paths.items()
+ }
+ vectormodel = ProviderTimeSeriesDataModel(
+ provider_set=provider_set,
+ column_keys=column_keys,
+ line_shape_fallback=line_shape_fallback,
+ )
+ except ValueError as error:
+ message = (
+ f"Some/all ensembles are missing arrow files at {rel_file_pattern}.\n"
+ "If no arrow files have been generated with `ERT` using `ECL2CSV`, "
+ "the commandline tool `smry2arrow_batch` can be used to generate arrow "
+ "files for an ensemble"
+ )
+ raise ValueError(message) from error
+
+ parameterproviderset = {
+ ens_name: table_provider.create_from_per_realization_parameter_file(
+ ens_path
+ )
+ for ens_name, ens_path in ensemble_paths.items()
+ }
+ parameter_df = create_df_from_table_provider(parameterproviderset)
+
+ parametermodel = ParametersModel(dataframe=parameter_df, drop_constants=True)
+ self.datamodel = SimulationTimeSeriesOneByOneDataModel(
+ vectormodel=vectormodel,
+ parametermodel=parametermodel,
+ webviz_settings=webviz_settings,
+ initial_vector=initial_vector,
+ )
+
+ self.set_callbacks()
+
+ @property
+ def layout(self) -> html.Div:
+ return main_view(get_uuid=self.uuid, datamodel=self.datamodel)
+
+ def set_callbacks(self) -> None:
+ plugin_callbacks(get_uuid=self.uuid, datamodel=self.datamodel)
+
+ @property
+ def tour_steps(self) -> List[dict]:
+ return [
+ {
+ "id": self.uuid("layout"),
+ "content": (
+ "Dashboard displaying time series from a sensitivity study."
+ ),
+ },
+ {
+ "id": self.uuid("graph-wrapper"),
+ "content": (
+ "Selected time series displayed per realization. "
+ "Click in the plot to calculate tornadoplot for the "
+ "corresponding date, then click on the tornado plot to "
+ "highlight the corresponding sensitivity."
+ ),
+ },
+ {
+ "id": self.uuid("table"),
+ "content": (
+ "Table statistics for all sensitivities for the selected date."
+ ),
+ },
+ {"id": self.uuid("vector"), "content": "Select time series"},
+ {"id": self.uuid("ensemble"), "content": "Select ensemble"},
+ ]
+
+
+def create_df_from_table_provider(
+ providerset: Dict[str, EnsembleTableProvider]
+) -> pd.DataFrame:
+ dfs = []
+ for ens, provider in providerset.items():
+ df = provider.get_column_data(column_names=provider.column_names())
+ df["ENSEMBLE"] = ens
+ dfs.append(df)
+ return pd.concat(dfs)
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/__init__.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/datetime_utils.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/datetime_utils.py
new file mode 100644
index 000000000..3c5dd187d
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_utils/datetime_utils.py
@@ -0,0 +1,16 @@
+import datetime
+
+# DOCS: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
+
+
+def from_str(date_str: str) -> datetime.datetime:
+ return datetime.datetime.strptime(date_str, "%Y-%m-%d")
+
+
+def to_str(date: datetime.datetime) -> str:
+ if date.hour != 0 or date.minute != 0 or date.second != 0 or date.microsecond != 0:
+ raise ValueError(
+ f"Invalid date resolution, expected no data for hour, minute, second"
+ f" or microsecond for {str(date)}"
+ )
+ return date.strftime("%Y-%m-%d")
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/__init__.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/__init__.py
new file mode 100644
index 000000000..e1f4d1178
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/__init__.py
@@ -0,0 +1 @@
+from .ensemble_timeseries_datamodel import ProviderTimeSeriesDataModel
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/ensemble_timeseries_datamodel.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/ensemble_timeseries_datamodel.py
new file mode 100644
index 000000000..256ce86c1
--- /dev/null
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/models/ensemble_timeseries_datamodel.py
@@ -0,0 +1,142 @@
+import datetime
+import fnmatch
+import re
+from typing import List, Optional, Set
+
+import pandas as pd
+
+from webviz_subsurface._abbreviations.reservoir_simulation import historical_vector
+from webviz_subsurface._providers import EnsembleSummaryProvider
+from webviz_subsurface._utils.simulation_timeseries import (
+ set_simulation_line_shape_fallback,
+)
+from webviz_subsurface._utils.vector_selector import add_vector_to_vector_selector_data
+
+
+class ProviderTimeSeriesDataModel:
+ """Class to process and and visualize ensemble timeseries"""
+
+ def __init__(
+ self,
+ provider_set: dict,
+ column_keys: Optional[list] = None,
+ line_shape_fallback: str = "linear",
+ ) -> None:
+
+ self._provider_set = provider_set
+ self.line_shape_fallback = set_simulation_line_shape_fallback("linear")
+ all_vector_names = self._create_union_of_vector_names_from_providers(
+ list(provider_set.values())
+ )
+ self._vector_names = (
+ self.filter_vectorlist_on_column_keys(column_keys, all_vector_names)
+ if column_keys is not None
+ else all_vector_names
+ )
+ if not self._vector_names:
+ raise ValueError("No vectors match the selected 'column_keys' criteria")
+
+ self.line_shape_fallback = set_simulation_line_shape_fallback(
+ line_shape_fallback
+ )
+ self._dates = self.all_dates()
+
+ # add vectors to vector selector
+ self.vector_selector_data = self.create_vector_selector_data(self._vector_names)
+
+ def create_vector_selector_data(self, vector_names: list) -> list:
+ vector_selector_data: list = []
+ for vector in self.get_non_historical_vector_names(vector_names):
+ add_vector_to_vector_selector_data(vector_selector_data, vector)
+ return vector_selector_data
+
+ @property
+ def vectors(self) -> List[str]:
+ return self._vector_names
+
+ @property
+ def dates(self) -> List[datetime.datetime]:
+ return self._dates
+
+ def dates_for_ensemble(self, ensemble: str) -> List[datetime.datetime]:
+ return self._provider_set[ensemble].dates(None)
+
+ def get_non_historical_vector_names(self, vector_names: list) -> list:
+ return [
+ vector
+ for vector in vector_names
+ if historical_vector(vector, None, False) not in vector_names
+ ]
+
+ def all_dates(self) -> List[datetime.datetime]:
+ """List with the union of dates among providers"""
+ # TODO: Adjust when providers are updated!
+ dates_union: Set[datetime.datetime] = set()
+ for provider in list(self._provider_set.values()):
+ _dates = set(provider.dates(None))
+ dates_union.update(_dates)
+ return list(sorted(dates_union))
+
+ @staticmethod
+ def _create_union_of_vector_names_from_providers(
+ providers: List[EnsembleSummaryProvider],
+ ) -> List[str]:
+ """Create list with the union of vector names among providers"""
+ vector_names = []
+ for provider in providers:
+ vector_names.extend(
+ provider.vector_names_filtered_by_value(
+ exclude_all_values_zero=True, exclude_constant_values=True
+ )
+ )
+ vector_names = list(sorted(set(vector_names)))
+ return vector_names
+
+ def filter_vectors(self, column_keys: str) -> list:
+ """Filter vector list used for correlation"""
+ column_key_list = "".join(column_keys.split()).split(",")
+ return self.filter_vectorlist_on_column_keys(column_key_list, self.vectors)
+
+ @staticmethod
+ def filter_vectorlist_on_column_keys(
+ column_key_list: list, vectorlist: list
+ ) -> list:
+ """Filter vectors using list of unix shell wildcards"""
+ try:
+ regex = re.compile(
+ "|".join([fnmatch.translate(col) for col in column_key_list]),
+ flags=re.IGNORECASE,
+ )
+ return [v for v in vectorlist if regex.fullmatch(v)]
+ except re.error:
+ return []
+
+ def get_historical_vector_df(
+ self, vector: str, ensemble: str
+ ) -> Optional[pd.DataFrame]:
+ hist_vecname = historical_vector(vector, smry_meta=None)
+
+ if hist_vecname and hist_vecname in self.vectors:
+ provider = self._provider_set[ensemble]
+ return provider.get_vectors_df(
+ [hist_vecname], None, realizations=provider.realizations()[:1]
+ ).rename(columns={hist_vecname: vector})
+ return None
+
+ def get_vector_df(
+ self,
+ ensemble: str,
+ vectors: List[str],
+ realizations: Optional[List[int]] = None,
+ date: Optional[datetime.datetime] = None,
+ ) -> pd.DataFrame:
+ provider = self._provider_set[ensemble]
+ ens_vectors = [vec for vec in vectors if vec in provider.vector_names()]
+ return (
+ provider.get_vectors_df(ens_vectors, None, realizations)
+ if date is None
+ else provider.get_vectors_for_date_df(date, ens_vectors, realizations)
+ )
+
+ def get_last_date(self, ensemble: str) -> datetime.datetime:
+ return max(self._provider_set[ensemble].dates(None))
diff --git a/webviz_subsurface/plugins/_volumetric_analysis/controllers/tornado_controllers.py b/webviz_subsurface/plugins/_volumetric_analysis/controllers/tornado_controllers.py
index 76cc772d0..1aab74598 100644
--- a/webviz_subsurface/plugins/_volumetric_analysis/controllers/tornado_controllers.py
+++ b/webviz_subsurface/plugins/_volumetric_analysis/controllers/tornado_controllers.py
@@ -83,7 +83,6 @@ def _update_tornado_pages(
)
figure, table_data, columns = tornado_figure_and_table(
tornado_data=tornado_data,
- response=response,
selections=selections,
theme=theme,
sensitivity_colors=sens_colors(),
@@ -250,7 +249,6 @@ def sens_colors() -> dict:
def tornado_figure_and_table(
tornado_data: TornadoData,
- response: str,
selections: dict,
theme: WebvizConfigTheme,
sensitivity_colors: dict,
@@ -273,10 +271,10 @@ def tornado_figure_and_table(
).figure
figure.update_xaxes(side="bottom", title=None).update_layout(
- title_text=f"Tornadoplot for {response}
"
+ title_text=f"Tornadoplot for {tornado_data.response_name}
"
+ f"Fluid zone: {(' + ').join(selections['filters']['FLUID_ZONE'])}"
if group is None
- else f"{response} {group}",
+ else f"{tornado_data.response_name} {group}",
title_font_size=font_size,
margin={"t": 70},
)
@@ -337,16 +335,10 @@ def create_tornado_table(
)
table_data = tornado_table.as_plotly_table
for data in table_data:
- data["Reference"] = tornado_data.reference_average
if group is not None:
data[subplots] = group
columns = create_table_columns(columns=[subplots]) if subplots is not None else []
columns.extend(tornado_table.columns)
- columns.extend(
- create_table_columns(
- columns=["Reference"],
- use_si_format=["Reference"] if use_si_format else [],
- )
- )
+
return table_data, columns
From f677e2056fffe3c1b6e9f077176e11f4a19207f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Therese=20Natter=C3=B8y?=
<61694854+tnatt@users.noreply.github.com>
Date: Tue, 8 Nov 2022 16:55:30 +0100
Subject: [PATCH 2/4] parameteranalysis_fix
---
q | 1962 +++++++++++++++++
.../parameter_response_controller.py | 8 +-
.../models/parameters_model.py | 16 -
3 files changed, 1966 insertions(+), 20 deletions(-)
create mode 100644 q
diff --git a/q b/q
new file mode 100644
index 000000000..840fb3312
--- /dev/null
+++ b/q
@@ -0,0 +1,1962 @@
+commit 7d1c9d8b79a8b4d2d88b00f5d5cdf5e6c4070b48
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Nov 8 11:57:20 2022 +0100
+
+ arrow implementation and improvements to TimeseriesOneByOne
+
+commit b6e7763c21e5f34865395290bd8207b1a6e9f39b
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Tue Nov 8 10:32:32 2022 +0100
+
+ `GroupTree`: Improved terminal_node filtering (#1152)
+
+ * Improved terminal_node filtering
+
+ * Pinned mypy to <0.990
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 59a1e103be3155416c746d3d617934d377f80f1f
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Oct 27 10:56:26 2022 +0200
+
+ Metadata functionality in `EnsembleTableProvider` (#1135)
+
+commit 7c35594495cebb4d57584e7c2f8b347751b9f778
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Wed Oct 26 12:02:37 2022 +0200
+
+ More flexibility in `GroupTree` (#1138)
+
+ * Two new parameters in GroupTree for more flexibility, terminal_node and excl_well_startswith
+
+ * Implemented new function get_filtered_dataframe in gruptree_model
+
+ * New input excl_well_endswith
+
+ * Improved Exception message for injection nodes in BRANPROP trees
+
+ * Started on unit tests for the gruptree model
+
+ * Fixed CI workflow issues
+
+ * Improved tests with fixture creating the gruptree model
+
+ * Improved handling of injection for BRANPROP nodes
+
+ * Made terminal_node optional in get_filtered_dataframe
+
+ * New input parameter tree_type which is GRUPTREE by default, and some other improvements
+
+ * Relaxed the requirements on summary vectors
+
+ * New StrEnum DataType for oilrate, gasrate etc
+
+ * Eased the requirement on node summary vectors, they are now optional
+
+ * New type EdgeOrNode
+
+ * Small docstring update
+
+ * Implemented mock GruptreeModel class with some new tests
+
+ * Allowed tree_type to be defaulted in gruptree_model, in which case the tree is automatically selected
+
+ * Changelog entry
+
+ * Small update to comment
+
+ * Set back scipy version in setup.py and installed v 1.9.2 in CI workflow
+
+ * Updated CI workflow
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 1ad6de4249c3d317f1752fa4b1f8c26c0c49c0c3
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Oct 10 23:12:31 2022 +0200
+
+ Prepare release (#1132)
+
+commit a077e475c2fdbd8124821b780e696135f119b69d
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Wed Oct 5 12:07:33 2022 +0200
+
+ Fix `ConversionError` in `callback_typecheck`. (#1129)
+
+ * Fix typecheck error
+
+ * Updated type hinting and added stretch=True
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 99212d61fa7cb9e808b592ca22eeb6db375b6f90
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Oct 5 10:21:14 2022 +0200
+
+ Fix `pandas` `FutureWarnings` (#1128)
+
+commit eb0a7e3dd7ed3d700bc3c5d9115ce5100c98a94e
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Tue Oct 4 09:58:16 2022 +0200
+
+ Option to remove header from parameter filter (#1125)
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit b3702ca319ccb295e22d356d75a3e2e25ea2209b
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Mon Oct 3 15:40:43 2022 +0200
+
+ Fix initial open state to prevent undefined type (#1121)
+
+ open is not required prop for wcc.Dialog, thus initial value was undefined and type in Python was `None`. Resolved by defining initial state False.
+
+commit ea2f9550c2ff42685195213646146374b368fd56
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Sep 29 16:15:44 2022 +0200
+
+ `RftPlotter` to WLF (#1113)
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit f9662a272ef1cefd223d2d9e7abb756ed45bd029
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Sep 29 15:47:32 2022 +0200
+
+ Do not use pandas dataframe as argument to webvizstore function (#1061)
+
+commit 939fa89a56cdb3013241c93bf3e2a10278e89d26
+Author: EirikPeirik <104941095+EirikPeirik@users.noreply.github.com>
+Date: Thu Sep 29 13:53:08 2022 +0200
+
+ `ProdMisfit` moved to WLF (#1085)
+
+ Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
+ Co-authored-by: Roger Nybø
+
+commit deef26fe2c4bf94bb1f7c2325c5fe24a3f1d77ca
+Author: Viktoria Vahlin <107865041+vvahlin@users.noreply.github.com>
+Date: Thu Sep 29 13:25:34 2022 +0200
+
+ Parameter vs parameter (#1083)
+
+ Co-authored-by: Kasper Seglem (OG SUB RPE)
+ Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
+ Co-authored-by: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
+
+commit c2e073f04c2f2b7459cb33977b937a9af6663652
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Sep 29 13:02:07 2022 +0200
+
+ Fix `pandas` `FutureWarnings` (#1116)
+
+commit f162f0f623acafcc7bfec708c13ad6d5ce463d63
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Wed Sep 28 20:56:23 2022 +0200
+
+ Minor fixes to `MapViewerFMU` (#1114)
+
+ * minor fixes
+
+ * minor fixes
+
+ Co-authored-by: Hans Kallekleiv
+
+commit 4fe0e9ebd4c752722cdbda70049c23f96440ed8d
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Wed Sep 28 12:12:06 2022 +0200
+
+ Update MapViewerFMU to new changes in DeckGLMap components (#1118)
+
+commit b19406ea7fe3e1d4f623b09b43b34aebe3580c3e
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Tue Sep 27 19:04:59 2022 +0200
+
+ Fix mypy errors in Tornado plot (#1117)
+
+commit 89cd868d4be45ef0d312cbd943476993b1957d89
+Author: Viktoria Vahlin <107865041+vvahlin@users.noreply.github.com>
+Date: Thu Sep 22 12:41:55 2022 +0200
+
+ Tornado plotter (#1092)
+
+ Converted `TornadoPlotterFMU` plugin to WLF
+ Co-authored-by: Viktoria Christine Vahlin (OG SUB RPE)
+ Co-authored-by: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
+ Co-authored-by: Ruben
+
+commit 7ff7635cd15dbbd65e42e753e8d1e1e67cebe922
+Author: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
+Date: Thu Sep 22 09:15:09 2022 +0200
+
+ Pvt trail (#1078)
+
+ *Refactored PVT plugin to new layout framework (WLF)
+
+ Co-authored-by: Kasper Seglem (OG SUB RPE)
+ Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
+ Co-authored-by: Ruben
+
+commit e94ca641a691d262ee42c244470bf337dc2f379d
+Author: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
+Date: Wed Sep 21 11:06:55 2022 +0200
+
+ Refactor SimulationTimeSeries plugin to WLF (#1086)
+
+ - Convert the plugin to use `WLF` for enhanced layout and improved code separation.
+ - Number of maximum allowed initial selected vector increased from 3 to 5.
+
+commit 6d093ef0473d574edb681c64f1ee04a02175105d
+Author: EirikPeirik <104941095+EirikPeirik@users.noreply.github.com>
+Date: Thu Sep 15 10:16:27 2022 +0200
+
+ Well analysis trail (#1089)
+
+ * Refactored the code according to the WLF best practice
+
+ * Removed well attributes filter, and more code improvements
+
+ * Refactored code again, putting figures in view utils folders
+
+ * Introduced a view element and got rid of the last store
+
+ * Simplified tour_steps and removed some imports from init files
+
+ * Added label to layout options checkbox
+
+ * Implemented a view element also for the well control view
+
+ * Added changelog
+
+ * Removed the error layout
+
+ * Implemented StrEnum and callback_typecheck
+
+ * Fixed bug in callback so that only layout is updated if data is unchanged
+
+ * Implemented new callback_typecheck that handles Optional type
+
+ * Minor updates to tour_steps
+
+ Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
+ Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 251810d452a5b53b6f3a00a8964f496c262ec476
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Sep 15 09:20:32 2022 +0200
+
+ New implementation of the `WellCompletion` plugin (with WLF). (#1058)
+
+ * Initial commit
+
+ started on reading of arrow files
+
+ Added WellCompletionNew
+
+ Implemented using EnsembleTableProvider to load arrow files
+
+ Started on the create_ensemble_dataset function
+
+ First implementation of create_ensemble_dataset
+
+ Some improvements to create dataset code
+
+ started implementing views
+
+ Implemented WLF structure
+
+ Implemented single realization
+
+ Implemented a view element
+
+ Wrote main plugin docstring
+
+ * Started implementing portable
+
+ * started implementing StratigraphyModel
+
+ * Stratigraphy model and portable
+
+ * webviz-store also on get_unit
+
+ * Docstrings and some changes to what is returned if file is not found
+
+ * Docstrings
+
+ * Cleaned up naming confusion
+
+ * logger and timer
+
+ * Renamed the plugin WellCompletion, removed kh arguments
+
+ * Removed print
+
+ * Sorting
+
+ * Deprecated old plugin
+
+ * changelog entry
+
+ * Formatting
+
+ * Review related changes
+
+ * Refactored the code according to new WLF best practice
+
+ * Removed plugin_ids file and added str and Enum to Ids.
+
+ * Moved Ids class into plugin class
+
+ * Added tour steps and removed imports from _views
+
+ * StrEnum and callback_typecheck
+
+ * callback_typecheck imported from webviz_config.utils
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 271cc5f47206a6c2663507fa1c396a78df1de203
+Author: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
+Date: Wed Sep 14 14:08:16 2022 +0200
+
+ `GroupTree` to WLF (#1080)
+
+ * Refactored the code in line with new WLF best practice
+
+ * Added missing init files
+
+ * renamed business_logic file
+
+ * Fixed grouptree tests
+
+ * Ids to Enums
+
+ * Review related updates
+
+ * Removed Settings groups from init functions
+
+ * Fixed group_tree_component_id problem
+
+ * Removed imports from _views init function
+
+ * StrEnum and callback_typecheck
+
+ * Added a comment about callback_typecheck
+
+ * Implemented callback_checktype with Optional
+
+ Co-authored-by: Jincheng Liu (OG SUB RPE)
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 1c4692728c70df53ab93deefa68fa667a704f617
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Tue Sep 13 09:16:35 2022 +0200
+
+ Remove Python `3.6` and `3.7` support (#1109)
+
+commit b9a29e31c400291f90db0e93ca91dfbb3c83ffb4
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Wed Aug 24 08:18:09 2022 +0200
+
+ Bugfix in `ParameterResponseCorrelation` (#1107)
+
+ * Removed if-statement for filters layout
+
+ * Simplified layout and added changelog entry
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 15815e282b05fd6640f4ba40f9a9d4c4e0b68da1
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Wed Aug 10 15:28:50 2022 +0200
+
+ Fixed issue with ambigious truth of `pd.Series` in `EnsembleSummaryProvider` (#1094)
+
+commit 6f4bb4185491fe920eb91ec64131ee49d2a12e26
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Aug 5 10:49:41 2022 +0200
+
+ Support `dash>=2.6` (#1098)
+
+commit e84c30a7f4396958e37600f014307572f980b0ce
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Aug 4 11:28:15 2022 +0200
+
+ removed requirement of "" around wildcarded paths in smry2arrow_batch (#1097)
+
+ Removed requirement of "" around wildcarded paths in smry2arrow_batch
+
+commit 65ca35eb21c4d7a7c839e38c8d3ae9eda3d51495
+Author: rubenthoms <69145689+rubenthoms@users.noreply.github.com>
+Date: Wed Jul 20 09:37:56 2022 +0200
+
+ Pinned `dash` to `<2.6.0` in order to keep `_NoUpdate` class available. (#1087)
+
+commit f28f9998a6a4044fdf0341b1463aaa8f87952d10
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Jun 30 14:32:07 2022 +0200
+
+ New implementation of `EnsembleTableProvider` (#1057)
+
+ * Initial commit for new ensemble_table_provider
+
+ * Added method docstrings and removed the EnsembleTableProviderSet class
+
+ * Improved tests
+
+ * Removed Table provider set from parameter response correlation
+
+ * Adapted 4 plugins to new table provider and added a new function in the table provider factory
+
+ * Adapted tornado_plotter_fmu to new table provider
+
+ * Improved table provider tests
+
+ * Worked more on table provider tests
+
+ * one more test and updated docstring
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 824672eed99783f8adab6c918b889f9d8272fd18
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Tue Jun 28 09:14:47 2022 +0200
+
+ Prepare release (#1059)
+
+commit 0f05a533bd0e6ae2ab18148eb80a467744ca3247
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Tue Jun 14 09:58:08 2022 +0200
+
+ `ProdMisfit`- bugfix related to the use of excl_name_contains. (#1055)
+
+commit d74a8694804c4a3688f8defdf5cc2b39da2563ed
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Jun 9 16:16:04 2022 +0200
+
+ Fix relative path issue in SwatinitQC (#1053)
+
+ * Fix relative path issue in SwatinitQC
+
+ * changelog
+
+commit 20afc6d16fd0221b1c8ae681a2a71d8f5a40662a
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Wed Jun 8 10:02:40 2022 +0200
+
+ Fix for layer changes in map component (#1046)
+
+ * Fix for layer changes in map component
+
+commit 50266076b133a671bf39f79fc46279edffe8b73d
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Sun May 29 20:53:41 2022 +0200
+
+ Add color tables to `MapViewer` (#1037)
+
+commit 970e609c24798cd500739813b2bd0555e75c3dd4
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Sun May 29 20:12:48 2022 +0200
+
+ `BhpQc` - Read from `.arrow` files instead of `.UNSMRY` files (#1028)
+
+commit a8d3646501d9c2d8dc1a65f3f3cec534858b61a2
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Sun May 29 19:36:22 2022 +0200
+
+ Remove `pydeck` dependency (#1035)
+
+commit 7e8ad2ab48464f08e790e26d0844c02ac5d2299b
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Sun May 29 19:13:31 2022 +0200
+
+ Add missing dependency upstream (#1042)
+
+commit 9bb7e3781ef68a24279ce7875c53fcafcfb3de7c
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Fri May 27 11:45:33 2022 +0200
+
+ Increased maximum number of selected vectors in SimulationTimeSeries (#1041)
+
+commit b66f55a28df4241969d09ae0edcd8c03b3b4ebcf
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Fri May 27 08:36:09 2022 +0200
+
+ `WellAnalysis` improvements (#1020)
+
+ * Updated repr string
+
+ * Implemented pressure plot mode type
+
+ * Handling gruptrees that are different over realizations
+
+ * New type NodeType and handling of interpolated wmctl values
+
+ * Removed TERMINAL_NODE type
+
+ * Well attribute filter
+
+ * Refactored well_attributes_model a bit and extended the tests
+
+ * Handling of undefined well attributes
+
+ * Implemented production after date with a date selector dropdown
+
+ * Prod after date also for the area chart
+
+ * Implemented ChartType Enum
+
+ * Date in title and clearable false on response selector
+
+ * Changelog entry
+
+ * Fixed the problem of well changing when changing ensemble
+
+ * Bugfix: gruptree_model was crashing if file did not exist
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 6c56649299cf8e51400a94ef81ea29356ea7bf26
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Wed May 25 17:13:02 2022 +0200
+
+ New data provider in `ParameterResponseCorrelation` (#1030)
+
+ * added function to match column_keys
+
+ * Implemented new data provider
+
+ * Updated docstring
+
+ * Moved get_matching_vector_names function to new utils module
+
+ * changelog entry
+
+ * Error message when column keys are not matching any vectors
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 616ee7c70cf74e02c172342c70c3e4447025d6e8
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Mon May 23 18:15:12 2022 +0200
+
+ `SeismicMisfit` - support new polygon header standard (#1017)
+
+commit 18318bf396068d5598cc8e623455a6224c8f7517
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Mon May 23 15:35:22 2022 +0200
+
+ `ParameterResponseCorrelation`: parameter filter, correlation and aggregation selectors, and correlation cut-off (#936)
+
+commit fe697ef0212a984779dec9048f4fd858e84cd4d8
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Mon May 23 14:24:52 2022 +0200
+
+ Use latest official `webviz-subsurface-components` release in CI (#1036)
+
+commit 32b16382dd1463c91025cf0a72a460c2710fd4c9
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon May 23 08:53:27 2022 +0200
+
+ Add Python 3.10 to CI (#897)
+
+commit 994dca86b85a487dd952d90f4cc53c3ca4dcdc02
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu May 19 15:30:39 2022 +0200
+
+ Fix new `pylint` and `dash` test error (#1032)
+
+commit 8dc83877e23f3d0013acf5afc95dc1f1a6808317
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu May 5 20:49:41 2022 +0200
+
+ Prepare release (#1019)
+
+commit 4026d92382de3c69ffdbbe89706fe9d0a9b7e62d
+Author: Sigurd Pettersen
+Date: Mon May 2 21:07:09 2022 +0200
+
+ Improved error reporting for `.arrow` files where dates are not monotonically increasing (#1015)
+
+commit 4cce8cdfe33e9c0945a32fbc8aed15878e92d939
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Apr 28 15:29:24 2022 +0200
+
+ Various bugfixes (#1014)
+
+ * various bugfixes
+
+commit 9362b3374d53146608eea613b52d80ecde769b5c
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Apr 27 13:57:44 2022 +0200
+
+ Expose surface folder as an argument in `MapViewerFMU` (#1013)
+
+ * Expose surface folder as argument in MapViewerFMU
+
+commit 4e572eee56a01132f10f75c260333feb0149f38f
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Apr 25 18:46:24 2022 +0200
+
+ Fix `CHANGELOG.md` (#1012)
+
+commit 831bef5071d66c975979084023995cfad6100123
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Apr 25 12:48:30 2022 +0200
+
+ Well attribute tests with mock data (#1010)
+
+ * Well attribute tests with mock data
+
+ * added pytest-mock to test requirements
+
+ * bugfix
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 89d76ddd86342ba803a80301c80b5226607a1f66
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Sun Apr 24 22:17:47 2022 +0200
+
+ Fix store for `ProdMisfit` (#1009)
+
+commit 08cc8ee08549aea9577bfce559ecdc4e6f1978a4
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Sat Apr 23 08:31:13 2022 +0200
+
+ New `ProdMisfit` plugin (#938)
+
+commit 56a9607b4f4607620799152630c8014f14e16eff
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Fri Apr 22 11:54:37 2022 +0200
+
+ General `WellAttributesModel` class (#1006)
+
+ * New class WellAttributesModel
+
+ * function that returns well attributes as dataframe
+
+ * dataframe_melted function
+
+ * Capital letters in dataframes and logging of well attributes file used
+
+ * First saving the raw dict, then transforming it to simple form
+
+ * ValueError changed to NotImplementedError
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit b09884d8abac086633c159f31283cb97412de72f
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Apr 21 12:15:42 2022 +0200
+
+ Fixes issues with just one parameter and for aggregated data in ParameterResponseCorrelation (#1001)
+
+commit 7e8b4d390b3138194ab59807c3692be0a9dc342b
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Apr 21 08:03:27 2022 +0200
+
+ `GroupTree` improvements (#999)
+
+ * implemented property types
+
+ * LayoutElements class
+
+ * Using general class GruptreeModel to load gruptree data
+
+ * Fixed tour_steps
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit df5e762f2b39dc06854b2fb521e301c61ea8a1a0
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Apr 20 20:12:34 2022 +0200
+
+ Fix test input argument for `SurfaceWithGridCrossSection` (#1005)
+
+commit 3b8be31c38f46e1137d39cf9feb2695655de17ef
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu Apr 7 23:51:33 2022 +0200
+
+ Prepare release (#1002)
+
+commit e25e8cb82b7e206aaad7837f2c5613080a2636b7
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Mar 30 09:19:53 2022 +0200
+
+ Add backwards compatibility for older portables using `ParameterAnalysis` and `PropertyStatistic` (#995)
+
+ * add backwards compatibility for older portables
+
+ * get run_mode from WEBVIZ_INSTANCE_INFO
+
+commit c72a9e2fb00e32c74b32c2d4b29ec6d09823ebd1
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Mar 30 08:45:38 2022 +0200
+
+ Bugfix `VolumetricAnalysis` - tornados hidden if both dynamic and static sources (#996)
+
+ * bugfix tornados not appering if both dynamic and static sources
+
+commit c5825b02946f84b53245df7a843beb23cf1330ea
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Tue Mar 29 16:30:55 2022 +0200
+
+ Temporarily pin `werkzeug` in CI (#997)
+
+commit 5dac1edd8fab54883f9b86a1b63b6048d6c890ef
+Author: Sigurd Pettersen
+Date: Mon Mar 28 09:29:06 2022 +0200
+
+ Avoid copying surfaces when using `MapViewerFMU` in non-portable mode (#986)
+
+commit b5ef68c846b75921cb099d52d230bd0a60f3f637
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Sun Mar 27 20:20:51 2022 +0200
+
+ Arrow support and other improvements to `ParameterAnalysis` and `PropertyStatistics` (#988)
+
+ * Arrow support and fixes to ParameterAnalysis and PropertyStatistics
+
+ * use table provider for aggregated smry [deploy test]
+
+ * reintroduce column_keys argument for filtering of available vectors [deploy test]
+
+ * some bugfixes
+
+ * workaround for flaky test [deploy test]
+
+ * [deploy test]
+
+commit 272496df43d3b4de2e66b96c6277cbd4323d779c
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Sun Mar 27 11:03:05 2022 +0200
+
+ New Water Initialization QC plugin `SwatinitQC` (#987)
+
+ * New Water Initialization QC plugin
+
+ * logarithic colors for PERMX and information in wcc.dialog
+
+commit 452fc6ca6938c9c9851d35d8be44998288ed38a2
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Fri Mar 25 17:47:21 2022 +0100
+
+ Place VectorCalculator in Div with fixed height (#989)
+
+ Place in div with fixed height for new VectorCalculator refactoring.
+ Possible to control/adjust height of VectorCalculaotr
+
+commit d2b381f662cb30330f6cceba50d9f720bccef0a2
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Mar 25 16:16:59 2022 +0100
+
+ Update according to latest `pylint` (#991)
+
+commit 687a5b36c3b9ecced8b3f559294f96a975baf7a6
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Tue Mar 22 14:03:07 2022 +0100
+
+ Well analysis plugin (#981)
+
+ * Basic file structure of new plugin
+
+ * implemented the summary data provider
+
+ * main layout for well control tab
+
+ * well control layout in separate file
+
+ * factored out well overview layout in separate file
+
+ * split callbacks on two files
+
+ * added well_control_figure
+
+ * added node info code
+
+ * gruptree model class implemented
+
+ * started implementing the well control callbacks
+
+ * Well control plot implemented
+
+ * basic setup for the well overview charts
+
+ * first version of the well overview barchart
+
+ * chart type buttons logic implemented
+
+ * started implementing pie charts and many other improvements
+
+ * pie chart implemented
+
+ * merged prod plots into one class
+
+ * implemented display of only charttype settings
+
+ * implemented area chart
+
+ * Well filter implemented
+
+ * Improved figure formatting
+
+ * network pressures not added multiple times if they are in multiple networks
+
+ * plugin docstring and renamed _ensemble_data.py to _ensemble_well_analysis_data.py
+
+ * implemented webvizstore
+
+ * standardized oil, water, gas colors
+
+ * docstrings and some improvements
+
+ * plot formatting without reloading the data
+
+ * improved class docstring
+
+ * Changelog entry
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 08335cfb094c588dd32a46f228cc70bfc434471b
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Mon Mar 21 10:32:28 2022 +0100
+
+ Update `WellLogViewer` data format to latest version (#985)
+
+ * Update WellLogViewer data format to latest version
+
+ * Update CHANGELOG.md
+
+ Co-authored-by: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+
+ Co-authored-by: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+
+commit ef0d69f8ff952ce675b28b9bfff0dadf1cd46e7c
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Mar 14 13:20:54 2022 +0100
+
+ Prepare release (#983)
+
+commit a9f3145a2da3b3063552aed6cfed1785829ce82e
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Mon Mar 14 09:31:55 2022 +0100
+
+ Deprecate `SurfaceViewerFMU` (#980)
+
+commit cf0e90bef4a02cac5d2d69b73805c043381b2b5b
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Fri Mar 11 15:02:19 2022 +0100
+
+ Fix documentation in MapViewer (#975)
+
+commit d57bc2e697b0329c01dc24ef97cc7af0aea1228e
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Fri Feb 25 17:45:07 2022 +0100
+
+ Handle missing well picks (#977)
+
+commit 993b08c64a0772699b14a07bc1ca4a8d67ea491d
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Fri Feb 25 13:40:29 2022 +0100
+
+ Handle covisualizations of static and dynamic maps (#976)
+
+commit cfde8751429058663d2c8850d25024b4fb8aadaf
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Feb 24 22:43:19 2022 +0100
+
+ Replace modals with `wcc.Dialog` in `StructuralUncertainty` (#970)
+
+commit f717fa094c550e99443f4aeae7842ea5f63fe397
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Feb 24 21:43:49 2022 +0100
+
+ Allow filtered subset of surface names for multiple attributes in StructuralUncertainty (#965)
+
+commit 94a54c68fd22f1461169b6503031fb219a2885b2
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Feb 24 20:59:34 2022 +0100
+
+ Map Viewer Plugin (#971)
+
+ Co-Authored-By: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+ Co-Authored-By: Sigurd Pettersen
+
+ Co-authored-by: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+ Co-authored-by: Sigurd Pettersen
+
+commit 7372653bea0df3abce7cc098f1f4e567f9aa6bf7
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Feb 24 20:22:38 2022 +0100
+
+ Two bugfxes in VolumetricAnalysis (#972)
+
+commit ec067f315d24a2de3949b126ebce6850812fd44c
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Feb 24 09:51:40 2022 +0100
+
+ SimulationTimeSeries: Handle defaulted options in deprecation check (#969)
+
+commit 8ab46229236c6eb6e82d6796536c9cb72e9f1af2
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Wed Feb 23 14:39:59 2022 +0100
+
+ Disable rangeslider marks in cross-section plugins (#958)
+
+ * Disable rangeslider marks in cross-section plugins
+
+commit 4f7d31d8c95cfda9dd6fd2713bb16404a1d3e4e4
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Feb 23 10:35:58 2022 +0100
+
+ Improve error message when there are zero valid realizations (#961)
+
+commit 2d63edfab5105a6cf279921600db46962eb3a0b0
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Feb 21 14:48:19 2022 +0100
+
+ Zone filter and parameter filter in `RftPlotter` (#949)
+
+ * Map zone filter functionality
+
+ * Added date to title
+
+ * parameter filter in parameter response tab
+
+ * Sorting observations by MD instead of TVD in the errorplot
+
+ * Depth option in the formations plot in the paramresponse tab
+
+ * changelog entry
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 172d6890fe07d6dc38a39abfaa52fcb42b5b55d0
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Wed Feb 16 18:05:48 2022 +0100
+
+ Replace modal with draggable dialog for VectorCalculator (#960)
+
+ Replace the Modal-component from Dash Bootstrap Components with new draggable Dialog-component in wcc.
+
+commit fc22e36c3228b25932ccdbd28abb13b34850c406
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Fri Feb 11 10:24:29 2022 +0100
+
+ Add list of vectors as user input for `SimulationTimeSeries` (#956)
+
+ - Add list of vectors as user input for initially selected vectors.
+ - Deprecate usage of {vector1, vector2, vector3}
+ - Add ValueError for missing vectors
+
+commit 9609bb0403e92e0ce2dcad6f681cd15960f876f8
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Fri Feb 11 08:25:02 2022 +0100
+
+ Delta relative to date within ensemble `SimulationTimeSeries` (#951)
+
+ Calculate delta relative to date within ensemble for SimulationTimeSeries-plugin.
+
+ - Selectable dates in dropdown
+ - Calculate vector data in dataframes relative to selected date
+ - Calculate statistics afterwards, i.e. "resetting" the statistics calculation!
+
+commit 1785f150f66fd1d3f3c6b08067787522dede9e86
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Feb 10 11:54:02 2022 +0100
+
+ `WellCompletion` handling different zone → layer mappings over realizations (#944)
+
+ * Import the zone->layer mappings for all realizations and return the data as a dataframe
+
+ * merge the zone->layer dataframe with the compdat data on layer and realization
+
+ * changelog entry
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 106c5c926eae828e4be59310fe22b98fa43ad512
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Wed Feb 9 15:56:38 2022 +0100
+
+ User defined vector definition in SimulationTimeSeries plugin (#940)
+
+ - Added configurable user defined vector definitions.
+ - Changed vector annotation from "AVG_" with suffix "R" and "INTVL_" to "PER_DAY_" and "PER_INTVL_". Retrieve `VectorDefinitions` via Python-API for `webviz-subsurface-components`.
+
+commit 32bb6b074b84786ae13997253120013eba595c73
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Feb 9 12:30:17 2022 +0100
+
+ Prepare release (#952)
+
+commit 927ef9ab071b59a0532dc5ba4c79a3a9ae9290d4
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Feb 9 12:29:26 2022 +0100
+
+ Temp. CI/CD workaround `statsmodels` (#953)
+
+commit ce18444470c3b321ed53977fa77ccc9e8dae841d
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Jan 31 14:51:23 2022 +0100
+
+ Adjustments in `RftPlotter` due to changes in `ParametersModel` (#945)
+
+ * Pass dummy dataframe to ParametersModel
+
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 415d8697bdba9c999bffab6a8286e957b46a2ffb
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Jan 31 11:46:20 2022 +0100
+
+ Update according to new `black` version (#947)
+
+commit 0fd30b1f6e82d2a4bb05e6725729567e0d8ff102
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Fri Jan 28 13:38:58 2022 +0100
+
+ Fix hover info for observation trace in `SimulationTimeSeries` (#937)
+
+commit e759bc691a39b376570a0e4f0197e6f97853508a
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Fri Jan 28 13:24:47 2022 +0100
+
+ Fix `is_integer()` issue in `ParameterFilter` (#939)
+
+commit c73a699e1e31b2efa384cba3e0b8ad5f2d1cb586
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu Jan 20 22:43:20 2022 +0100
+
+ Deprecate `ReservoirSimulationTimeSeries` (#935)
+
+commit 8cebeb1ae60cdb5cfb7fe0e2a127c3ec609addf4
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Jan 20 21:48:48 2022 +0100
+
+ Bugfixes and improvements to `ParameterFilter` and `ParameterAnalysis` (#924)
+
+ Co-authored-by: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+
+commit 996b773684e1799cb24b79981a270eee7bbc00b7
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Jan 20 21:36:39 2022 +0100
+
+ Don't skip `SENSNAME` `ref` if multiple realizations in tornado (#929)
+
+commit 2011f0e7d537ee57b13b38af68d3c2482cde4a93
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Jan 20 21:08:35 2022 +0100
+
+ `RftPlotter` fix: Handle correlate function returning `NaN` values (#932)
+
+commit dab94696d2c6c6af6c0ca4404a44e02818f3970d
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Jan 20 17:42:20 2022 +0100
+
+ Fix: correct labels in tornado when both cases are on same side of ref (#934)
+
+commit 05b1c8ea7813e8c0ad0f10c1f82039994e13c61b
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Thu Jan 20 16:44:38 2022 +0100
+
+ Unit tests new SimulationTimeSeries plugin (#923)
+
+ Unit tests for types, utility and general "business logic" in new `SimulationTimeSeries` plugin.
+
+ - Unit tests for files in `utils/` and `types/`-folder.
+ - Resolve issue with conversion of `datetime.datetime` to `pd.Timestamp` for `pd.DataFrame` by making utility functions.
+ - Minor fixes/updates to code based on issues found during testing.
+
+commit 39db9b92ad17f0ca0af27b15f8d674d2ab9c8108
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Wed Jan 19 14:06:29 2022 +0100
+
+ Fix: Skip adding emodel to webvizstore in VolumetricAnalysis when using csv input (#926)
+
+commit 10b792bed9ccc948095855582f102ee44a4c79e3
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Mon Jan 17 15:41:35 2022 +0100
+
+ Ensure valid provider realization for History Vectors in new `SimulationTimeSeries` (#921)
+
+ Replace usage of realization = 0, with retrieving valid realization numbers for provider and use lowest realization number to create history vector.
+
+commit a5a7e410206ae0fede15a358922e3bd539fb7c6d
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Jan 17 13:41:05 2022 +0100
+
+ General figures in `ParameterAnalysis` (#919)
+
+ * changed CorrelationFigure to general BarChart
+
+ * Generalized scatter plot
+
+ * bug fix and activated trendline in scatter plot
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 8f5e0e719664516e1b9c31f197dcffc8d567f435
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Jan 13 14:21:22 2022 +0100
+
+ New data provider in GroupTree plugin (#902)
+
+ * new data provider
+
+ * converted files and file structure to best practice
+
+ * gruptree testing rewritten for new data provider
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 0ac74cc619ca8e7808da2958eb53eeba8fa07679
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Jan 13 12:32:58 2022 +0100
+
+ Update param response selections by clicking in bar chart (#914)
+
+ * click response in bar chart also in param_vs_sim case
+
+ * Fixed bug related to updating formations well by clicking in map
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit ab38a567e84067d31cdde4cecb32f26fd98ee124
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Fri Jan 7 12:43:39 2022 +0100
+
+ `SimulationTimeSeries`: Add statistics after realizations (#913)
+
+ `SimulationTimeSeries`: Add statistics after realizations
+
+commit a8701c76e2e329795d586fa5fc3e6b3b74c6830a
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu Jan 6 15:33:29 2022 +0100
+
+ Prepare release (#912)
+
+commit e84317cd2d1ef898260683c86deb83ac33725952
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Jan 6 13:52:29 2022 +0100
+
+ Handle ensembles with missing surface folders (#911)
+
+commit 011d37440a27cffe4205168995a1eeb809072e5c
+Author: Sigurd Pettersen
+Date: Wed Jan 5 15:26:18 2022 +0100
+
+ Fixed typing/mypy issues (#907)
+
+commit 32b7352dae0ae1258a898a0c683f1a3b7acd8760
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu Dec 23 23:13:58 2021 +0100
+
+ Workaround `astroid`/`pylint` bug (#901)
+
+commit 91cdd14eb159f582de1fd283ce76115f209cdc1a
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Dec 22 11:31:25 2021 +0100
+
+ General improvements to VolumetricAnalysis (#895)
+
+ * General improvements to VolumetricAnalysis
+
+ * changelog
+
+commit 4aebb47887a4c15dd20a7a63b7ef37cbf30e4a6e
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Wed Dec 22 09:03:13 2021 +0100
+
+ Format dates in download for resampled date in SimulationTimeSeries (#898)
+
+commit 4db719bb418e6c4ba3d70e8960a40c80b1d7fdd2
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Tue Dec 21 14:25:48 2021 +0100
+
+ Add quarterly sampling frequency to summary provider and SimulationTimeSeries (#896)
+
+commit ed92862c7ec9a87027a51f636604e5d1e1df69c0
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Tue Dec 21 13:26:38 2021 +0100
+
+ Parameter response tab in RFT plotter (#884)
+
+ * change data loading to EnsembleSetModel
+
+ * Put figures in separate folder
+
+ * new tab for correlations and class for layout element names
+
+ * Main layout for correlations tab
+
+ * loading of parameters
+
+ * put callbacks in folder and renamed figures folder
+
+ * Renamed correlations to parameter response
+
+ * Added param respons layout element names
+
+ * moved functionality from processing to business logic
+
+ * first version of parameter response callbacks
+
+ * param respon plugin framework
+
+ * correlation bar chart implemented. some functionality generalized
+
+ * general barchart implemented
+
+ * generalized colors functionality
+
+ * implemented scatterplot
+
+ * clickdata callback
+
+ * started implementing formations figure
+
+ * added formation plot
+
+ * Color coding of the formations plot
+
+ * function to get ensemble wells and parameters
+
+ * removed zone values from initial layout
+
+ * implemented param_vs_sim correlation option
+
+ * title option
+
+ * made formation lines thinner and grayer
+
+ * Updated plugin docstring
+
+ * updated colors utils
+
+ * fixed problems related to rebasing of colors file
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 59528d2449103e7bc142a147b7b6f610e5b35756
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Tue Dec 21 11:03:37 2021 +0100
+
+ Change label and add hoverinfo for uncertainty envelope in StructuralUncertainty (#880)
+
+commit 43543f1b23d14b3a8bced4bf87a08faf72be5420
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Fri Dec 17 16:11:52 2021 +0100
+
+ `SeismicMisfit` - improved polygon plotting performance (#888)
+
+commit 15966e1ecb116ac17f6bee97f374ad31a50d2b7e
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Fri Dec 17 11:18:15 2021 +0100
+
+ Add "Statistics + realizations"-plot to New SimulationTimeSeries plugin (#883)
+
+ Added `Statistics + Realizations`-plot for New `SimulationTimeSeries` plugin.
+
+ Includes:
+ - Statistics and individual realizations traces in same plot - realizations gets scaled color lightness on traces.
+ - Filtering of realizations to include in visualization
+ - Selection to calculate statistics from all realizations or selected subset of realizations
+ - Update download of user data based on the new visualization mode
+
+commit ab1a8334f1d8a26edaf646133f8739d27b8a45d3
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Thu Dec 16 21:24:38 2021 +0100
+
+ Added new simulation time series plugin
+
+ New `SimulationTimeSeries` plugin, with code structure according to best practice plugin example `webviz-plugin-boilerplate` and usage of `EnsembleSummaryProvider`. New functionality as multiple Delta Ensembles in same plot, selectable resampling frequency and possibility to group subplots per selected ensemble or per selected vector.
+
+commit 465eb1f5f3d65fe5dc88ac9c2fce748b2bd64fff
+Author: Sigurd Pettersen
+Date: Thu Dec 16 15:21:38 2021 +0100
+
+ Added `rel_file_pattern` argument to EnsembleSummaryProviderFactory methods (#889)
+
+commit d6560660a7143c3f81add8d6eee32aaf697bb4ed
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Dec 10 08:51:41 2021 +0100
+
+ Prepare release (#879)
+
+commit a55058b49291b96dc181bd8b054c36cc674d3c3f
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Fri Dec 10 08:37:39 2021 +0100
+
+ Use regular `numpy` for all map statistic calculations (#878)
+
+commit 6f45250e5874a9cfac0aaec0aeb1e84427558545
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Fri Dec 10 08:35:23 2021 +0100
+
+ Fix issues with `WellLogViewer` prop changes (#877)
+
+commit f961069a27850b8c9d81a04e48b0e8cef18c34e1
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Dec 9 14:35:50 2021 +0100
+
+ Handle fancharts with intermittent nan values (#875)
+
+commit 9bed882f3a86cfaaa30efd6568d08200262f9778
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Wed Dec 8 12:08:09 2021 +0100
+
+ `GroupTree` bug fix related to `BRANPROP` group leaf nodes (#873)
+
+commit 3477e94cdd6604beb6fa629f31472eb233c89634
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Tue Dec 7 15:29:57 2021 +0100
+
+ Comply with latest `pylint` version (#872)
+
+ iterating the dictionary directly instead of calling .keys()
+
+commit a930a86f17d83e7e5bc092ef8d5c786b0d1843a1
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Tue Dec 7 13:47:40 2021 +0100
+
+ Remove `CODEOWNERS` (#868)
+
+commit 710a5f455bf7646d3a472c430eef2ff9d667e84c
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Thu Dec 2 12:59:29 2021 +0100
+
+ Fix `xtgeo` lint issue (#869)
+
+commit 924ac97a1e73a27d88c853950c1aa9161d544550
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Dec 1 10:31:46 2021 +0100
+
+ Second bugfix on sensitivity comparison in VolumetricAnalysis (#863)
+
+commit 0771e9f2c74465c7b2bf5764470a18ddd4f249e4
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Tue Nov 30 16:02:41 2021 +0100
+
+ Fix xtgeo/pylint linting issues (#865)
+
+commit 3302f0c694d590522cde560535d975a356acc383
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Fri Nov 26 13:32:06 2021 +0100
+
+ Regression fix after sensitivity comparison (#860)
+
+commit 0ac83c421d6377a2e92915253b2f9981e6f62605
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Thu Nov 25 20:40:13 2021 +0100
+
+ Update to latest `pylint` (#857)
+
+commit edfec8e88867b3a5c0e5201e3be83f5771adf1d4
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Nov 25 16:00:22 2021 +0100
+
+ `RftPlotter` bug fixes and improvements (#854)
+
+ * refactored code into files for layout, callbacks and business logic
+
+ * fixed deselecting all ensembles bug
+
+ * Fixed problem with no data matching filters
+
+ * added title to the formations plot
+
+ * Removed one date mark from the slider in the map controls
+
+ * simplified title placement
+
+ * updated links in documentation
+
+ * fixed the problem of map plot changing size
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit a3043fd76f8905fb028a079694e8abbc50f5a1ff
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Nov 25 14:49:28 2021 +0100
+
+ Sensitivity comparison in `VolumetricAnalysis` (#856)
+
+commit 8fd9504e4dc6ddefea68360d173000d7fc56eed0
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Nov 25 12:02:17 2021 +0100
+
+ support both sensitivity and gen_kw ensembles (#855)
+
+commit 9297c35f5efe4b861ba1abdde0d443bfc20bd18a
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Nov 25 09:45:47 2021 +0100
+
+ Groups as leaf nodes in the `GroupTree` plugin (#842)
+
+ * implemented nodes as leaf nodes
+
+ * implemented tests for add_nodetype function
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit 4398f481298bb5db7ffc2cc172112d9cd524c7c3
+Author: Sigurd Pettersen
+Date: Wed Nov 24 22:31:14 2021 +0100
+
+ Added ensemble summary provider (#721)
+
+commit 8d3442a343b5d45f47d9febb9b8601e7afd96dc7
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Wed Nov 24 17:45:23 2021 +0100
+
+ Refactoring `WellCompletions` code (#847)
+
+ `WellCompletions` code refactored according to the best practice
+
+commit 2ad114470b54215006e16ca66e57fcb28a4cbd0e
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Nov 24 15:06:17 2021 +0100
+
+ added realplot to tornadopage in VolumetricAnalysis (#845)
+
+commit cf0eeff730f67d172b22f52e9f7c03bcdd46bc43
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Nov 24 14:02:17 2021 +0100
+
+ added combined sensname-senscase column (#851)
+
+commit 35763e82982df6d34d6feefd076bb4971561fb52
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Nov 24 09:47:54 2021 +0100
+
+ Fixes to ParameterResponseCorrelation (#853)
+
+commit 39ad4bc6e64d4f0036ba98faaf27808b97514110
+Author: Sigurd Pettersen
+Date: Wed Nov 17 15:16:28 2021 +0100
+
+ Updated target values in tests due to fixes in ecl 2.13.1 (#848)
+
+ Updated target values in tests due to fixes in ecl 2.13.1
+
+commit 6c8c719ac38620e591067b9ec4871aa1aee937f5
+Author: Sigurd Pettersen
+Date: Wed Nov 17 08:29:17 2021 +0100
+
+ Removed ert from test dependencies (#846)
+
+commit 8b6187a8d8aca38a8f0205e43ae91040931ec854
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Fri Nov 12 10:21:55 2021 +0100
+
+ Seismic misfit improvements (#844)
+
+commit b75e88d924509de60c456a2725a938dd545588b7
+Author: Sigurd Pettersen
+Date: Thu Nov 11 18:22:44 2021 +0100
+
+ Add script for doing batch conversion of UNSMRY files to .arrow (#772)
+
+ Added script for doing batch conversion of UNSMRY files to Arrow
+ Smry data in arrow format for SOME.UNSMRY will now be stored in the file share/results/unsmry/SOME.arrow
+
+commit f61ad71498fd7c4158721ab2d57c1b8d1a47ad8a
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Nov 11 13:04:43 2021 +0100
+
+ Changed well connection status filetype to csv and updated docstring (#832)
+
+ * renamed wellconnstatus filetype to csv and updated docstring
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit edf06baaba276d1a27a007e9694866605e643cd7
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Nov 11 10:07:26 2021 +0100
+
+ Deleted files related to `ert` jobs (#831)
+
+ * deleted files related to ert jobs
+
+ * removed ert jobs and console scripts from setup.py
+
+ Co-authored-by: Øyvind Lind-Johansen
+
+commit ed38ad57e01733aad9fbef0d73fb0e9f4d0c2f3c
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Nov 8 11:22:58 2021 +0100
+
+ Prepare release (#843)
+
+commit 451912aa0ba41899688bd46951b14ea445f100cd
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Mon Nov 8 11:20:17 2021 +0100
+
+ Bugfixes and improved hoverlabels for `Tornado component` (#841)
+
+ Co-authored-by: Asgeir Nyvoll
+
+commit 4a08827598d90615fbe46dce956a445013fb1946
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Wed Nov 3 15:38:31 2021 +0100
+
+ Fix timing bug in `AssistedHistoryMatchingAnalysis` by preventing initial callback (#838)
+
+commit 7e7b92a10681f187e2b322f794c5918f741c2714
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Nov 3 13:09:06 2021 +0100
+
+ Bugfixes (#833)
+
+commit 9df1a7f0c9345795b5545b5796bf8f0347fe08cb
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Mon Nov 1 22:31:48 2021 +0100
+
+ `SeismicMisfit` - fixes to doc and polygon selector (#830)
+
+commit 08483d0e1912105e0dbd91a6e8950e6d02d7fe32
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Oct 28 09:08:05 2021 +0200
+
+ Change from ensembles to ensemble in TornadoPlotterFMU doc (#828)
+
+commit dc8494099d65601a18fa2d822f29102dd604586a
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Mon Oct 25 11:32:07 2021 +0200
+
+ Tornado improvements (#825)
+
+commit 04a66158234b8781404dd262b4062c48757ff5dc
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Sun Oct 24 23:56:15 2021 +0200
+
+ Handle invalid subgrid definition in `SurfaceWithGridCrossSection` (#820)
+
+ * Handle invalid subgrid definition
+
+commit a0806d8d36f63a2d812c851479228cd01d917d63
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Sun Oct 24 13:56:42 2021 +0200
+
+ `SeismicMisfit` update (#821)
+
+commit 1a7fe1dff94e598b5d4824583987a1027e495ece
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Fri Oct 15 08:37:21 2021 +0200
+
+ Fixed formatting error in `DiskUsage` bar chart tooltip (#817)
+
+commit 9b78322aa22eeeb0335353318f33615977f975bc
+Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
+Date: Tue Oct 12 11:29:55 2021 +0200
+
+ Add new `SeismicMisfit` plugin (#734)
+
+commit a8852ccbf32daef4852aceb8ce143ed5596747b3
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Oct 11 11:53:10 2021 +0200
+
+ More statistical options in GroupTree plugin (#809)
+
+ More statistical options and better menu behavior.
+
+ Co-authored-by: Øyvind Lind-Johansen (CCI RPT RES1)
+
+commit f57bff775bbc09becbce4a10710f18d69b23f589
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Oct 8 21:29:09 2021 +0200
+
+ Add Python 3.9 to CI (#588)
+
+commit f4673f66da568572d17ad1b17f91fb3ae63efb38
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Oct 8 15:03:58 2021 +0200
+
+ Prepare release (#812)
+
+commit e2a9a0df327b92de51375d4ebe869170242306a8
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Oct 7 15:31:49 2021 +0200
+
+ Bugfixes VolumetricAnalysis (#810)
+
+commit 259f678650e7d8bf84914d6f7e58914d4b82b090
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Oct 4 15:08:50 2021 +0200
+
+ Runtime improvement in `GroupTree` plugin (#807)
+
+commit 8f6bd76b2cba38efda2e3a95d363b3bd1de7a03e
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Oct 4 08:01:45 2021 +0200
+
+ Update according to new data (#805)
+
+commit 7c5f23da87c464e7ae16e7cbc891ff4b7c84b6a2
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Sep 30 08:13:48 2021 +0200
+
+ Bugfixes `VolumetricAnalysis` (#802)
+
+ * Bugfixes VolumetricsAnalysis
+
+commit adccf1029baa85a747664bde9bf2a181c032dbb5
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Sep 28 12:26:18 2021 +0200
+
+ Bugfix ParametersModel sensrun check logic (#794)
+
+commit 263fe9b22411c59faac4eb73ef28b4ca7951306f
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Sep 27 19:05:24 2021 +0200
+
+ Update tests based on change in testdata set (#792)
+
+commit ea0e22a16d298b00a5be2dbf87a9f9d163625985
+Author: Håvard Berland
+Date: Mon Sep 27 17:48:55 2021 +0200
+
+ Import sorting with `isort` (#795)
+
+commit 0a4d12e73096d4f141be353aae20b37f096f865a
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Fri Sep 24 20:09:08 2021 +0200
+
+ `GroupTree` plugin for network visualization (#771)
+
+commit 8ebbfa64c6ece0eec8e425ce4f7d632c321c23fa
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Fri Sep 24 19:19:47 2021 +0200
+
+ Ensure map bounds are updated when switching attribute (#791)
+
+commit d5f446e6bf0bfdddbab0c2f35f3b8f5367bab037
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Fri Sep 24 16:29:20 2021 +0200
+
+ Remove REAL grouping on ensemble comparison (#784)
+
+commit d6172ea2086c5847ed4420ee165ee10bbb22443b
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Fri Sep 24 15:41:09 2021 +0200
+
+ Added fipfile QC tab to VolumetricAnalysis (#783)
+
+commit b6bdd88d729e76384b9493d45c589aeeee0001c4
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Fri Sep 24 14:08:10 2021 +0200
+
+ Prvent possibility of calculating statistics over different SENSNAME's in VolumetricAnalysis (#788)
+
+commit f52650c7455feb09c2ec6a14f44db2278243f056
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Sep 23 19:46:33 2021 +0200
+
+ Fix bug when no predefined_expressions are defined (#779)
+
+commit 0815246b62f86db3a552c10a8e87b024e35117fb
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Sep 23 18:48:13 2021 +0200
+
+ Bugfix property calculation in mean table `VolumetricAnalysis` (#782)
+
+ * Bugfix property calculation in mean table VolumetricAnalysis
+
+commit c62ecb931057addf2a022870820ccfb84bb8a9c1
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Sep 23 14:29:27 2021 +0200
+
+ Reset `dash` imports in `volumetric_analysis.py` to Dash 2.0 format (#780)
+
+commit bf1bff60ce3ee8cfe67ece084f62a8e2a37b7265
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Sep 23 10:29:10 2021 +0200
+
+ Added source and ensemble comparison tabs in VolumetricAnalysis (#777)
+
+commit bb960afa95230ccc69e424e64711c6c7bcaa6a8b
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Sep 21 19:20:17 2021 +0200
+
+ Added region/zone vs fipnum filter switch (#773)
+
+commit b747851a32d896da56cafe51fb730f5f803e4ac4
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Tue Sep 21 16:01:17 2021 +0200
+
+ Add `VectorCalculator` in `ReservoirSimulationTimeseries` plugin (#709)
+
+ Add usage of `VectorCalculator` component in reservoir simulation timeseries plugin for calculation and graphing of custom simulation time series vectors.
+
+ - Add usage of `VectorCalculator` react component in `ReservoirSimulationTimeSeries` plugin
+ - Add utility functions for handling vector calculator functionality
+ - Add utility functions for predefining calculated expressions in configuration file (test data)
+ - Add calculated vector expressions into vector selectors
+
+
+ Closes issue https://github.com/equinor/webviz-subsurface/issues/293
+
+commit 9621b0f30730664a0b2f118cdf16e1c8f52f9696
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Sep 21 13:53:10 2021 +0200
+
+ Support eclipse volumes in VolumetricAnalysis (#770)
+
+commit dc50f8e9e4cf0fa1f1ad6bf2b4a02eed009c5fc4
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Sep 17 13:34:18 2021 +0200
+
+ Adjust to latest `pylint` (#768)
+
+commit 1257f54e9e3213277a861b0081bafa2ba5c4d0bb
+Author: Åshild Skålnes <35798031+ashildskalnes@users.noreply.github.com>
+Date: Wed Sep 15 09:19:35 2021 +0200
+
+ Use correct inline/xline ranges in ` SegyViewer` (#765)
+
+commit 25314f5ba6ad88d20e285d30007600f243458e32
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Tue Sep 14 11:49:38 2021 +0200
+
+ Lint tests (#766)
+
+commit 617f717b9277cbd9691036ce26c2c98a65d8efbf
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Mon Sep 13 14:54:43 2021 +0200
+
+ Bump Dash to 2.0.0 (#760)
+
+commit 2562a2f306201f82cc155e12221cfabe8b6ac747
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Mon Sep 13 14:16:13 2021 +0200
+
+ Load/Save xtgeo.RegularSurface as bytestream (#761)
+
+commit 6dfc70364045d5bb905b123179eb06762aae7ed2
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Mon Sep 13 12:26:01 2021 +0200
+
+ Skip dash-renderer errors in VolumetricAnalysis log assertion test (#763)
+
+commit cf5f97eee2ffb549733df5339d91c712bab81eba
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Sep 10 11:18:16 2021 +0200
+
+ Add `useless-suppression` to `pylint` checks (#759)
+
+commit 895455e068285a607d229ec73a23de2bdd504839
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Tue Sep 7 14:42:15 2021 +0200
+
+ Updated tests for Drogon (#755)
+
+commit 51f9cf331298766bf4a7573a890ea24f3722b4d7
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Sep 3 14:41:42 2021 +0200
+
+ Prepare for release (#757)
+
+commit edd9675eabc25ad793f21e7ef5bd53b5e0fcfbb4
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Fri Sep 3 13:30:57 2021 +0200
+
+ 🩹 for flaky test (#756)
+
+commit bd84101ca577a54152f7f3e9612dac0e2e9c518f
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Wed Sep 1 14:58:06 2021 +0200
+
+ Handle missing surfaces in PropertyStatistics (#753)
+
+commit 86ac51b206f84094545a6871c4cd574a73b5987c
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Wed Sep 1 10:04:54 2021 +0200
+
+ Filter on OK in `ensemble_table_provider_factory` (#747)
+
+commit 64ec6054f614d462fc424b71f25740aac2205fcf
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Sep 1 09:22:57 2021 +0200
+
+ Fix for single valued columns in `LinePlotterFMU` (#749)
+
+commit b12c3d142f95b4a374d08a3367e7412e92d84d13
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Aug 31 17:45:29 2021 +0200
+
+ Bugfix in `VolumetricAnalysis` to trigger callbacks on page refresh (#748)
+
+commit ec5aad348915ad2f38115f661ecc313ae38038a9
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Tue Aug 24 22:11:23 2021 +0200
+
+ Removed warning from well completion documentation (#744)
+
+commit 7eea7c6642f5bef3f95768995fbe2437bb661fe7
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Aug 24 22:05:16 2021 +0200
+
+ Generalize plot functions (#707)
+
+commit 5af705e2f4a5398f0555479cc0328147235d7f3c
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Tue Aug 24 21:31:31 2021 +0200
+
+ Move `types-dataclasses` to test requirements (#742)
+
+commit 07d4c5531808ab7ba08cfa517a00dd23824ed713
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Tue Aug 24 20:00:14 2021 +0200
+
+ Well Log Viewer (#733)
+
+commit 2c14fd9d768affadadf4f4007ef6a1a59511129b
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Aug 24 19:09:35 2021 +0200
+
+ Bugfix for the case of missing `BULK` column (#741)
+
+commit 2e60b901c28006fa0858b64c0934f90ae09ae25e
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Tue Aug 24 13:46:17 2021 +0200
+
+ Common fan chart input utility (#719)
+
+commit c2e9e62c215557a3913720142993c855dfe686f0
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Mon Aug 23 20:42:37 2021 +0200
+
+ Tables as tab for easier access (#724)
+
+commit ac5485f0e5d6bc08e14fa59c5f1ccb22a804b15e
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Mon Aug 23 16:38:17 2021 +0200
+
+ Use `ParametersModel` in `InplaceVolumesModel` and `ParameterAnalysis` (#700)
+
+commit ca01f4c2cdf36bc97611956b481bf2e8fb204720
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Mon Aug 23 13:32:52 2021 +0200
+
+ Use dict literal and add exception for encoding in pylint (#739)
+
+commit 97ddbc3ffb2e41c9bff257f049b54cbe2c4bbb3b
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Aug 18 14:08:05 2021 +0200
+
+ Layout updates to ParameterFilter (#729)
+
+commit e321f960e06f64d3413bcd456032259370695b3d
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Aug 17 16:22:38 2021 +0200
+
+ Added parameter filter to ParameterAnalysis (#730)
+
+commit 674bff65e121cca59999802ddc5d86df8d9ee805
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Tue Aug 17 10:21:44 2021 +0200
+
+ Preserve uirevision in timeseries and relperm plugins (#717)
+
+commit 8561b9d97cd5f102e4460537ad4420eb9a03cef7
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Mon Aug 16 11:25:03 2021 +0200
+
+ Table fixes to `ParameterAnalysis` and `PropertyStatistics` (#728)
+
+commit 2f09c3f8474f98733b2e0bd62b500b8f513d475b
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Aug 12 12:23:14 2021 +0200
+
+ Update DiskUsage to support new format (#708)
+
+commit 5947d01b3d501fcc6ae37fa4cd8278a7aab6ca0d
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Aug 12 10:59:38 2021 +0200
+
+ Set required init values to `xtgeo.RegularSurface()` (#726)
+
+ * Set required init values to xtgeo.RegularSurface()
+ * Initialize RegularSurface using from_file()
+
+ Co-authored-by: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+
+commit bd7aa85ff559e5c8447de25cdfa02d3245221113
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Wed Aug 11 11:35:32 2021 +0200
+
+ Custom tornado plot response option in `VolumetricAnalysis` (#723)
+
+commit 85994d8782809319a695cc47bfa1091bf81a5602
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Wed Jul 14 10:43:49 2021 +0200
+
+ Prepare for new release (#720)
+
+commit 25b5dfa60594f9da1b61726110dde996c6facfb7
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Fri Jul 9 12:29:20 2021 +0200
+
+ Avoided recalculation of unique dates in `WellCompletions` (#718)
+
+commit a331f2884c785ffff63fc791666ac292438e060a
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Thu Jul 8 09:24:56 2021 +0200
+
+ Improved search for unit system + ERT-job user interface (#715)
+
+commit 52507febfb702fb53c42d575e2bdf1e493835879
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Tue Jul 6 09:39:33 2021 +0200
+
+ Fix callback issue `VolumetricAnalysis` (#712)
+
+commit 66486740369b38a0119ae997d4327ad9af31bf97
+Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
+Date: Mon Jul 5 22:18:26 2021 +0200
+
+ Removed `output` argument from ERT jobs (#710)
+
+commit f69a545b3d895208de663a604a5a0d81a6a1248a
+Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
+Date: Mon Jul 5 21:32:52 2021 +0200
+
+ Change usage of `df.all()` (#714)
+
+commit cf253fd8384f08b1bb2e68b867865e72984b3f87
+Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
+Date: Sun Jul 4 21:51:19 2021 +0200
+
+ Update `dash` version to 1.20 (#711)
+
+commit 554a609eb9e32df618c7556421c1452f6f87a157
+Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
+Date: Thu Jul 1 12:22:25 2021 +0200
+
+ Bugfix TornadoPlot when no sensitivities have impact (#704)
+
+commit 3653f79e89b855dccca32cf1a22d853919b84902
+Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
+Date: Thu Jul 1 10:38:36 2021 +0200
+
+ adhere to pylint 2.9.0 (#705)
+
+commit 3cf03cbef68a7120471a771eb11dbd7dc6fa1538
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Sun Jun 27 17:01:12 2021 +0200
+
+ Remove Frame wrapper from WellCompletions (#691)
+
+commit 23b3e10250ebced51aedb7712c284ec0f39c75ca
+Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
+Date: Sun Jun 27 16:15:07 2021 +0200
+
+ Add deprecation warning to InplaceVolumesOneByOne (#683)
+
+ Co-authored-by: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
diff --git a/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py b/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py
index 5f5583a09..4d9307180 100644
--- a/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py
+++ b/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py
@@ -130,12 +130,12 @@ def _update_graphs(
scatter_fig.update_color(color, options["opacity"])
# Make timeseries graph
- df_value_norm = parametermodel.get_real_and_value_df(
- ensemble, parameter=parameter, normalize=True
- )
+ param_df = parametermodel.get_parameter_df_for_ensemble(
+ ensemble, reals=realizations)
+
timeseries_fig = TimeSeriesFigure(
dframe=merge_dataframes_on_realization(
- vector_df[["DATE", "REAL", vector]], df_value_norm
+ vector_df[["DATE", "REAL", vector]], param_df[["REAL", parameter]]
),
visualization=visualization,
vector=vector,
diff --git a/webviz_subsurface/plugins/_parameter_analysis/models/parameters_model.py b/webviz_subsurface/plugins/_parameter_analysis/models/parameters_model.py
index e2d746262..873cf3ddf 100644
--- a/webviz_subsurface/plugins/_parameter_analysis/models/parameters_model.py
+++ b/webviz_subsurface/plugins/_parameter_analysis/models/parameters_model.py
@@ -187,22 +187,6 @@ def get_stat_value(self, parameter: str, ensemble: str, stat_column: str):
& (self.statframe["ENSEMBLE"] == ensemble)
].iloc[0][stat_column]
- def get_real_and_value_df(
- self, ensemble: str, parameter: str, normalize: bool = False
- ) -> pd.DataFrame:
- """
- Return dataframe with ralization and values for selected parameter for an ensemble.
- A column with normalized parameter values can be added.
- """
- df = self.dataframe_melted.copy()
- df = df[["VALUE", "REAL"]].loc[
- (df["ENSEMBLE"] == ensemble) & (df["PARAMETER"] == parameter)
- ]
- if normalize:
- df["VALUE_NORM"] = (df["VALUE"] - df["VALUE"].min()) / (
- df["VALUE"].max() - df["VALUE"].min()
- )
- return df.reset_index(drop=True)
def get_parameter_df_for_ensemble(self, ensemble: str, reals: list):
return self._dataframe[
From bfad7de069aa567e77d356568224e8d3c419e96a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Therese=20Natter=C3=B8y?=
<61694854+tnatt@users.noreply.github.com>
Date: Tue, 8 Nov 2022 16:59:02 +0100
Subject: [PATCH 3/4] remove q
---
q | 1962 -------------------------------------------------------------
1 file changed, 1962 deletions(-)
delete mode 100644 q
diff --git a/q b/q
deleted file mode 100644
index 840fb3312..000000000
--- a/q
+++ /dev/null
@@ -1,1962 +0,0 @@
-commit 7d1c9d8b79a8b4d2d88b00f5d5cdf5e6c4070b48
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Nov 8 11:57:20 2022 +0100
-
- arrow implementation and improvements to TimeseriesOneByOne
-
-commit b6e7763c21e5f34865395290bd8207b1a6e9f39b
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Tue Nov 8 10:32:32 2022 +0100
-
- `GroupTree`: Improved terminal_node filtering (#1152)
-
- * Improved terminal_node filtering
-
- * Pinned mypy to <0.990
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 59a1e103be3155416c746d3d617934d377f80f1f
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Oct 27 10:56:26 2022 +0200
-
- Metadata functionality in `EnsembleTableProvider` (#1135)
-
-commit 7c35594495cebb4d57584e7c2f8b347751b9f778
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Wed Oct 26 12:02:37 2022 +0200
-
- More flexibility in `GroupTree` (#1138)
-
- * Two new parameters in GroupTree for more flexibility, terminal_node and excl_well_startswith
-
- * Implemented new function get_filtered_dataframe in gruptree_model
-
- * New input excl_well_endswith
-
- * Improved Exception message for injection nodes in BRANPROP trees
-
- * Started on unit tests for the gruptree model
-
- * Fixed CI workflow issues
-
- * Improved tests with fixture creating the gruptree model
-
- * Improved handling of injection for BRANPROP nodes
-
- * Made terminal_node optional in get_filtered_dataframe
-
- * New input parameter tree_type which is GRUPTREE by default, and some other improvements
-
- * Relaxed the requirements on summary vectors
-
- * New StrEnum DataType for oilrate, gasrate etc
-
- * Eased the requirement on node summary vectors, they are now optional
-
- * New type EdgeOrNode
-
- * Small docstring update
-
- * Implemented mock GruptreeModel class with some new tests
-
- * Allowed tree_type to be defaulted in gruptree_model, in which case the tree is automatically selected
-
- * Changelog entry
-
- * Small update to comment
-
- * Set back scipy version in setup.py and installed v 1.9.2 in CI workflow
-
- * Updated CI workflow
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 1ad6de4249c3d317f1752fa4b1f8c26c0c49c0c3
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Oct 10 23:12:31 2022 +0200
-
- Prepare release (#1132)
-
-commit a077e475c2fdbd8124821b780e696135f119b69d
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Wed Oct 5 12:07:33 2022 +0200
-
- Fix `ConversionError` in `callback_typecheck`. (#1129)
-
- * Fix typecheck error
-
- * Updated type hinting and added stretch=True
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 99212d61fa7cb9e808b592ca22eeb6db375b6f90
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Oct 5 10:21:14 2022 +0200
-
- Fix `pandas` `FutureWarnings` (#1128)
-
-commit eb0a7e3dd7ed3d700bc3c5d9115ce5100c98a94e
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Tue Oct 4 09:58:16 2022 +0200
-
- Option to remove header from parameter filter (#1125)
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit b3702ca319ccb295e22d356d75a3e2e25ea2209b
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Mon Oct 3 15:40:43 2022 +0200
-
- Fix initial open state to prevent undefined type (#1121)
-
- open is not required prop for wcc.Dialog, thus initial value was undefined and type in Python was `None`. Resolved by defining initial state False.
-
-commit ea2f9550c2ff42685195213646146374b368fd56
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Sep 29 16:15:44 2022 +0200
-
- `RftPlotter` to WLF (#1113)
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit f9662a272ef1cefd223d2d9e7abb756ed45bd029
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Sep 29 15:47:32 2022 +0200
-
- Do not use pandas dataframe as argument to webvizstore function (#1061)
-
-commit 939fa89a56cdb3013241c93bf3e2a10278e89d26
-Author: EirikPeirik <104941095+EirikPeirik@users.noreply.github.com>
-Date: Thu Sep 29 13:53:08 2022 +0200
-
- `ProdMisfit` moved to WLF (#1085)
-
- Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
- Co-authored-by: Roger Nybø
-
-commit deef26fe2c4bf94bb1f7c2325c5fe24a3f1d77ca
-Author: Viktoria Vahlin <107865041+vvahlin@users.noreply.github.com>
-Date: Thu Sep 29 13:25:34 2022 +0200
-
- Parameter vs parameter (#1083)
-
- Co-authored-by: Kasper Seglem (OG SUB RPE)
- Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
- Co-authored-by: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
-
-commit c2e073f04c2f2b7459cb33977b937a9af6663652
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Sep 29 13:02:07 2022 +0200
-
- Fix `pandas` `FutureWarnings` (#1116)
-
-commit f162f0f623acafcc7bfec708c13ad6d5ce463d63
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Wed Sep 28 20:56:23 2022 +0200
-
- Minor fixes to `MapViewerFMU` (#1114)
-
- * minor fixes
-
- * minor fixes
-
- Co-authored-by: Hans Kallekleiv
-
-commit 4fe0e9ebd4c752722cdbda70049c23f96440ed8d
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Wed Sep 28 12:12:06 2022 +0200
-
- Update MapViewerFMU to new changes in DeckGLMap components (#1118)
-
-commit b19406ea7fe3e1d4f623b09b43b34aebe3580c3e
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Tue Sep 27 19:04:59 2022 +0200
-
- Fix mypy errors in Tornado plot (#1117)
-
-commit 89cd868d4be45ef0d312cbd943476993b1957d89
-Author: Viktoria Vahlin <107865041+vvahlin@users.noreply.github.com>
-Date: Thu Sep 22 12:41:55 2022 +0200
-
- Tornado plotter (#1092)
-
- Converted `TornadoPlotterFMU` plugin to WLF
- Co-authored-by: Viktoria Christine Vahlin (OG SUB RPE)
- Co-authored-by: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
- Co-authored-by: Ruben
-
-commit 7ff7635cd15dbbd65e42e753e8d1e1e67cebe922
-Author: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
-Date: Thu Sep 22 09:15:09 2022 +0200
-
- Pvt trail (#1078)
-
- *Refactored PVT plugin to new layout framework (WLF)
-
- Co-authored-by: Kasper Seglem (OG SUB RPE)
- Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
- Co-authored-by: Ruben
-
-commit e94ca641a691d262ee42c244470bf337dc2f379d
-Author: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
-Date: Wed Sep 21 11:06:55 2022 +0200
-
- Refactor SimulationTimeSeries plugin to WLF (#1086)
-
- - Convert the plugin to use `WLF` for enhanced layout and improved code separation.
- - Number of maximum allowed initial selected vector increased from 3 to 5.
-
-commit 6d093ef0473d574edb681c64f1ee04a02175105d
-Author: EirikPeirik <104941095+EirikPeirik@users.noreply.github.com>
-Date: Thu Sep 15 10:16:27 2022 +0200
-
- Well analysis trail (#1089)
-
- * Refactored the code according to the WLF best practice
-
- * Removed well attributes filter, and more code improvements
-
- * Refactored code again, putting figures in view utils folders
-
- * Introduced a view element and got rid of the last store
-
- * Simplified tour_steps and removed some imports from init files
-
- * Added label to layout options checkbox
-
- * Implemented a view element also for the well control view
-
- * Added changelog
-
- * Removed the error layout
-
- * Implemented StrEnum and callback_typecheck
-
- * Fixed bug in callback so that only layout is updated if data is unchanged
-
- * Implemented new callback_typecheck that handles Optional type
-
- * Minor updates to tour_steps
-
- Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
- Co-authored-by: Eirik Sundby Håland (OG SUB RPE)
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 251810d452a5b53b6f3a00a8964f496c262ec476
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Sep 15 09:20:32 2022 +0200
-
- New implementation of the `WellCompletion` plugin (with WLF). (#1058)
-
- * Initial commit
-
- started on reading of arrow files
-
- Added WellCompletionNew
-
- Implemented using EnsembleTableProvider to load arrow files
-
- Started on the create_ensemble_dataset function
-
- First implementation of create_ensemble_dataset
-
- Some improvements to create dataset code
-
- started implementing views
-
- Implemented WLF structure
-
- Implemented single realization
-
- Implemented a view element
-
- Wrote main plugin docstring
-
- * Started implementing portable
-
- * started implementing StratigraphyModel
-
- * Stratigraphy model and portable
-
- * webviz-store also on get_unit
-
- * Docstrings and some changes to what is returned if file is not found
-
- * Docstrings
-
- * Cleaned up naming confusion
-
- * logger and timer
-
- * Renamed the plugin WellCompletion, removed kh arguments
-
- * Removed print
-
- * Sorting
-
- * Deprecated old plugin
-
- * changelog entry
-
- * Formatting
-
- * Review related changes
-
- * Refactored the code according to new WLF best practice
-
- * Removed plugin_ids file and added str and Enum to Ids.
-
- * Moved Ids class into plugin class
-
- * Added tour steps and removed imports from _views
-
- * StrEnum and callback_typecheck
-
- * callback_typecheck imported from webviz_config.utils
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 271cc5f47206a6c2663507fa1c396a78df1de203
-Author: JinCheng2022 <107854035+JinCheng2022@users.noreply.github.com>
-Date: Wed Sep 14 14:08:16 2022 +0200
-
- `GroupTree` to WLF (#1080)
-
- * Refactored the code in line with new WLF best practice
-
- * Added missing init files
-
- * renamed business_logic file
-
- * Fixed grouptree tests
-
- * Ids to Enums
-
- * Review related updates
-
- * Removed Settings groups from init functions
-
- * Fixed group_tree_component_id problem
-
- * Removed imports from _views init function
-
- * StrEnum and callback_typecheck
-
- * Added a comment about callback_typecheck
-
- * Implemented callback_checktype with Optional
-
- Co-authored-by: Jincheng Liu (OG SUB RPE)
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 1c4692728c70df53ab93deefa68fa667a704f617
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Tue Sep 13 09:16:35 2022 +0200
-
- Remove Python `3.6` and `3.7` support (#1109)
-
-commit b9a29e31c400291f90db0e93ca91dfbb3c83ffb4
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Wed Aug 24 08:18:09 2022 +0200
-
- Bugfix in `ParameterResponseCorrelation` (#1107)
-
- * Removed if-statement for filters layout
-
- * Simplified layout and added changelog entry
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 15815e282b05fd6640f4ba40f9a9d4c4e0b68da1
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Wed Aug 10 15:28:50 2022 +0200
-
- Fixed issue with ambigious truth of `pd.Series` in `EnsembleSummaryProvider` (#1094)
-
-commit 6f4bb4185491fe920eb91ec64131ee49d2a12e26
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Aug 5 10:49:41 2022 +0200
-
- Support `dash>=2.6` (#1098)
-
-commit e84c30a7f4396958e37600f014307572f980b0ce
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Aug 4 11:28:15 2022 +0200
-
- removed requirement of "" around wildcarded paths in smry2arrow_batch (#1097)
-
- Removed requirement of "" around wildcarded paths in smry2arrow_batch
-
-commit 65ca35eb21c4d7a7c839e38c8d3ae9eda3d51495
-Author: rubenthoms <69145689+rubenthoms@users.noreply.github.com>
-Date: Wed Jul 20 09:37:56 2022 +0200
-
- Pinned `dash` to `<2.6.0` in order to keep `_NoUpdate` class available. (#1087)
-
-commit f28f9998a6a4044fdf0341b1463aaa8f87952d10
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Jun 30 14:32:07 2022 +0200
-
- New implementation of `EnsembleTableProvider` (#1057)
-
- * Initial commit for new ensemble_table_provider
-
- * Added method docstrings and removed the EnsembleTableProviderSet class
-
- * Improved tests
-
- * Removed Table provider set from parameter response correlation
-
- * Adapted 4 plugins to new table provider and added a new function in the table provider factory
-
- * Adapted tornado_plotter_fmu to new table provider
-
- * Improved table provider tests
-
- * Worked more on table provider tests
-
- * one more test and updated docstring
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 824672eed99783f8adab6c918b889f9d8272fd18
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Tue Jun 28 09:14:47 2022 +0200
-
- Prepare release (#1059)
-
-commit 0f05a533bd0e6ae2ab18148eb80a467744ca3247
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Tue Jun 14 09:58:08 2022 +0200
-
- `ProdMisfit`- bugfix related to the use of excl_name_contains. (#1055)
-
-commit d74a8694804c4a3688f8defdf5cc2b39da2563ed
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Jun 9 16:16:04 2022 +0200
-
- Fix relative path issue in SwatinitQC (#1053)
-
- * Fix relative path issue in SwatinitQC
-
- * changelog
-
-commit 20afc6d16fd0221b1c8ae681a2a71d8f5a40662a
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Wed Jun 8 10:02:40 2022 +0200
-
- Fix for layer changes in map component (#1046)
-
- * Fix for layer changes in map component
-
-commit 50266076b133a671bf39f79fc46279edffe8b73d
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Sun May 29 20:53:41 2022 +0200
-
- Add color tables to `MapViewer` (#1037)
-
-commit 970e609c24798cd500739813b2bd0555e75c3dd4
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Sun May 29 20:12:48 2022 +0200
-
- `BhpQc` - Read from `.arrow` files instead of `.UNSMRY` files (#1028)
-
-commit a8d3646501d9c2d8dc1a65f3f3cec534858b61a2
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Sun May 29 19:36:22 2022 +0200
-
- Remove `pydeck` dependency (#1035)
-
-commit 7e8ad2ab48464f08e790e26d0844c02ac5d2299b
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Sun May 29 19:13:31 2022 +0200
-
- Add missing dependency upstream (#1042)
-
-commit 9bb7e3781ef68a24279ce7875c53fcafcfb3de7c
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Fri May 27 11:45:33 2022 +0200
-
- Increased maximum number of selected vectors in SimulationTimeSeries (#1041)
-
-commit b66f55a28df4241969d09ae0edcd8c03b3b4ebcf
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Fri May 27 08:36:09 2022 +0200
-
- `WellAnalysis` improvements (#1020)
-
- * Updated repr string
-
- * Implemented pressure plot mode type
-
- * Handling gruptrees that are different over realizations
-
- * New type NodeType and handling of interpolated wmctl values
-
- * Removed TERMINAL_NODE type
-
- * Well attribute filter
-
- * Refactored well_attributes_model a bit and extended the tests
-
- * Handling of undefined well attributes
-
- * Implemented production after date with a date selector dropdown
-
- * Prod after date also for the area chart
-
- * Implemented ChartType Enum
-
- * Date in title and clearable false on response selector
-
- * Changelog entry
-
- * Fixed the problem of well changing when changing ensemble
-
- * Bugfix: gruptree_model was crashing if file did not exist
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 6c56649299cf8e51400a94ef81ea29356ea7bf26
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Wed May 25 17:13:02 2022 +0200
-
- New data provider in `ParameterResponseCorrelation` (#1030)
-
- * added function to match column_keys
-
- * Implemented new data provider
-
- * Updated docstring
-
- * Moved get_matching_vector_names function to new utils module
-
- * changelog entry
-
- * Error message when column keys are not matching any vectors
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 616ee7c70cf74e02c172342c70c3e4447025d6e8
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Mon May 23 18:15:12 2022 +0200
-
- `SeismicMisfit` - support new polygon header standard (#1017)
-
-commit 18318bf396068d5598cc8e623455a6224c8f7517
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Mon May 23 15:35:22 2022 +0200
-
- `ParameterResponseCorrelation`: parameter filter, correlation and aggregation selectors, and correlation cut-off (#936)
-
-commit fe697ef0212a984779dec9048f4fd858e84cd4d8
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Mon May 23 14:24:52 2022 +0200
-
- Use latest official `webviz-subsurface-components` release in CI (#1036)
-
-commit 32b16382dd1463c91025cf0a72a460c2710fd4c9
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon May 23 08:53:27 2022 +0200
-
- Add Python 3.10 to CI (#897)
-
-commit 994dca86b85a487dd952d90f4cc53c3ca4dcdc02
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu May 19 15:30:39 2022 +0200
-
- Fix new `pylint` and `dash` test error (#1032)
-
-commit 8dc83877e23f3d0013acf5afc95dc1f1a6808317
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu May 5 20:49:41 2022 +0200
-
- Prepare release (#1019)
-
-commit 4026d92382de3c69ffdbbe89706fe9d0a9b7e62d
-Author: Sigurd Pettersen
-Date: Mon May 2 21:07:09 2022 +0200
-
- Improved error reporting for `.arrow` files where dates are not monotonically increasing (#1015)
-
-commit 4cce8cdfe33e9c0945a32fbc8aed15878e92d939
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Apr 28 15:29:24 2022 +0200
-
- Various bugfixes (#1014)
-
- * various bugfixes
-
-commit 9362b3374d53146608eea613b52d80ecde769b5c
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Apr 27 13:57:44 2022 +0200
-
- Expose surface folder as an argument in `MapViewerFMU` (#1013)
-
- * Expose surface folder as argument in MapViewerFMU
-
-commit 4e572eee56a01132f10f75c260333feb0149f38f
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Apr 25 18:46:24 2022 +0200
-
- Fix `CHANGELOG.md` (#1012)
-
-commit 831bef5071d66c975979084023995cfad6100123
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Apr 25 12:48:30 2022 +0200
-
- Well attribute tests with mock data (#1010)
-
- * Well attribute tests with mock data
-
- * added pytest-mock to test requirements
-
- * bugfix
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 89d76ddd86342ba803a80301c80b5226607a1f66
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Sun Apr 24 22:17:47 2022 +0200
-
- Fix store for `ProdMisfit` (#1009)
-
-commit 08cc8ee08549aea9577bfce559ecdc4e6f1978a4
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Sat Apr 23 08:31:13 2022 +0200
-
- New `ProdMisfit` plugin (#938)
-
-commit 56a9607b4f4607620799152630c8014f14e16eff
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Fri Apr 22 11:54:37 2022 +0200
-
- General `WellAttributesModel` class (#1006)
-
- * New class WellAttributesModel
-
- * function that returns well attributes as dataframe
-
- * dataframe_melted function
-
- * Capital letters in dataframes and logging of well attributes file used
-
- * First saving the raw dict, then transforming it to simple form
-
- * ValueError changed to NotImplementedError
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit b09884d8abac086633c159f31283cb97412de72f
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Apr 21 12:15:42 2022 +0200
-
- Fixes issues with just one parameter and for aggregated data in ParameterResponseCorrelation (#1001)
-
-commit 7e8b4d390b3138194ab59807c3692be0a9dc342b
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Apr 21 08:03:27 2022 +0200
-
- `GroupTree` improvements (#999)
-
- * implemented property types
-
- * LayoutElements class
-
- * Using general class GruptreeModel to load gruptree data
-
- * Fixed tour_steps
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit df5e762f2b39dc06854b2fb521e301c61ea8a1a0
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Apr 20 20:12:34 2022 +0200
-
- Fix test input argument for `SurfaceWithGridCrossSection` (#1005)
-
-commit 3b8be31c38f46e1137d39cf9feb2695655de17ef
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu Apr 7 23:51:33 2022 +0200
-
- Prepare release (#1002)
-
-commit e25e8cb82b7e206aaad7837f2c5613080a2636b7
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Mar 30 09:19:53 2022 +0200
-
- Add backwards compatibility for older portables using `ParameterAnalysis` and `PropertyStatistic` (#995)
-
- * add backwards compatibility for older portables
-
- * get run_mode from WEBVIZ_INSTANCE_INFO
-
-commit c72a9e2fb00e32c74b32c2d4b29ec6d09823ebd1
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Mar 30 08:45:38 2022 +0200
-
- Bugfix `VolumetricAnalysis` - tornados hidden if both dynamic and static sources (#996)
-
- * bugfix tornados not appering if both dynamic and static sources
-
-commit c5825b02946f84b53245df7a843beb23cf1330ea
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Tue Mar 29 16:30:55 2022 +0200
-
- Temporarily pin `werkzeug` in CI (#997)
-
-commit 5dac1edd8fab54883f9b86a1b63b6048d6c890ef
-Author: Sigurd Pettersen
-Date: Mon Mar 28 09:29:06 2022 +0200
-
- Avoid copying surfaces when using `MapViewerFMU` in non-portable mode (#986)
-
-commit b5ef68c846b75921cb099d52d230bd0a60f3f637
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Sun Mar 27 20:20:51 2022 +0200
-
- Arrow support and other improvements to `ParameterAnalysis` and `PropertyStatistics` (#988)
-
- * Arrow support and fixes to ParameterAnalysis and PropertyStatistics
-
- * use table provider for aggregated smry [deploy test]
-
- * reintroduce column_keys argument for filtering of available vectors [deploy test]
-
- * some bugfixes
-
- * workaround for flaky test [deploy test]
-
- * [deploy test]
-
-commit 272496df43d3b4de2e66b96c6277cbd4323d779c
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Sun Mar 27 11:03:05 2022 +0200
-
- New Water Initialization QC plugin `SwatinitQC` (#987)
-
- * New Water Initialization QC plugin
-
- * logarithic colors for PERMX and information in wcc.dialog
-
-commit 452fc6ca6938c9c9851d35d8be44998288ed38a2
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Fri Mar 25 17:47:21 2022 +0100
-
- Place VectorCalculator in Div with fixed height (#989)
-
- Place in div with fixed height for new VectorCalculator refactoring.
- Possible to control/adjust height of VectorCalculaotr
-
-commit d2b381f662cb30330f6cceba50d9f720bccef0a2
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Mar 25 16:16:59 2022 +0100
-
- Update according to latest `pylint` (#991)
-
-commit 687a5b36c3b9ecced8b3f559294f96a975baf7a6
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Tue Mar 22 14:03:07 2022 +0100
-
- Well analysis plugin (#981)
-
- * Basic file structure of new plugin
-
- * implemented the summary data provider
-
- * main layout for well control tab
-
- * well control layout in separate file
-
- * factored out well overview layout in separate file
-
- * split callbacks on two files
-
- * added well_control_figure
-
- * added node info code
-
- * gruptree model class implemented
-
- * started implementing the well control callbacks
-
- * Well control plot implemented
-
- * basic setup for the well overview charts
-
- * first version of the well overview barchart
-
- * chart type buttons logic implemented
-
- * started implementing pie charts and many other improvements
-
- * pie chart implemented
-
- * merged prod plots into one class
-
- * implemented display of only charttype settings
-
- * implemented area chart
-
- * Well filter implemented
-
- * Improved figure formatting
-
- * network pressures not added multiple times if they are in multiple networks
-
- * plugin docstring and renamed _ensemble_data.py to _ensemble_well_analysis_data.py
-
- * implemented webvizstore
-
- * standardized oil, water, gas colors
-
- * docstrings and some improvements
-
- * plot formatting without reloading the data
-
- * improved class docstring
-
- * Changelog entry
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 08335cfb094c588dd32a46f228cc70bfc434471b
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Mon Mar 21 10:32:28 2022 +0100
-
- Update `WellLogViewer` data format to latest version (#985)
-
- * Update WellLogViewer data format to latest version
-
- * Update CHANGELOG.md
-
- Co-authored-by: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-
- Co-authored-by: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-
-commit ef0d69f8ff952ce675b28b9bfff0dadf1cd46e7c
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Mar 14 13:20:54 2022 +0100
-
- Prepare release (#983)
-
-commit a9f3145a2da3b3063552aed6cfed1785829ce82e
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Mon Mar 14 09:31:55 2022 +0100
-
- Deprecate `SurfaceViewerFMU` (#980)
-
-commit cf0e90bef4a02cac5d2d69b73805c043381b2b5b
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Fri Mar 11 15:02:19 2022 +0100
-
- Fix documentation in MapViewer (#975)
-
-commit d57bc2e697b0329c01dc24ef97cc7af0aea1228e
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Fri Feb 25 17:45:07 2022 +0100
-
- Handle missing well picks (#977)
-
-commit 993b08c64a0772699b14a07bc1ca4a8d67ea491d
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Fri Feb 25 13:40:29 2022 +0100
-
- Handle covisualizations of static and dynamic maps (#976)
-
-commit cfde8751429058663d2c8850d25024b4fb8aadaf
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Feb 24 22:43:19 2022 +0100
-
- Replace modals with `wcc.Dialog` in `StructuralUncertainty` (#970)
-
-commit f717fa094c550e99443f4aeae7842ea5f63fe397
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Feb 24 21:43:49 2022 +0100
-
- Allow filtered subset of surface names for multiple attributes in StructuralUncertainty (#965)
-
-commit 94a54c68fd22f1461169b6503031fb219a2885b2
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Feb 24 20:59:34 2022 +0100
-
- Map Viewer Plugin (#971)
-
- Co-Authored-By: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
- Co-Authored-By: Sigurd Pettersen
-
- Co-authored-by: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
- Co-authored-by: Sigurd Pettersen
-
-commit 7372653bea0df3abce7cc098f1f4e567f9aa6bf7
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Feb 24 20:22:38 2022 +0100
-
- Two bugfxes in VolumetricAnalysis (#972)
-
-commit ec067f315d24a2de3949b126ebce6850812fd44c
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Feb 24 09:51:40 2022 +0100
-
- SimulationTimeSeries: Handle defaulted options in deprecation check (#969)
-
-commit 8ab46229236c6eb6e82d6796536c9cb72e9f1af2
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Wed Feb 23 14:39:59 2022 +0100
-
- Disable rangeslider marks in cross-section plugins (#958)
-
- * Disable rangeslider marks in cross-section plugins
-
-commit 4f7d31d8c95cfda9dd6fd2713bb16404a1d3e4e4
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Feb 23 10:35:58 2022 +0100
-
- Improve error message when there are zero valid realizations (#961)
-
-commit 2d63edfab5105a6cf279921600db46962eb3a0b0
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Feb 21 14:48:19 2022 +0100
-
- Zone filter and parameter filter in `RftPlotter` (#949)
-
- * Map zone filter functionality
-
- * Added date to title
-
- * parameter filter in parameter response tab
-
- * Sorting observations by MD instead of TVD in the errorplot
-
- * Depth option in the formations plot in the paramresponse tab
-
- * changelog entry
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 172d6890fe07d6dc38a39abfaa52fcb42b5b55d0
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Wed Feb 16 18:05:48 2022 +0100
-
- Replace modal with draggable dialog for VectorCalculator (#960)
-
- Replace the Modal-component from Dash Bootstrap Components with new draggable Dialog-component in wcc.
-
-commit fc22e36c3228b25932ccdbd28abb13b34850c406
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Fri Feb 11 10:24:29 2022 +0100
-
- Add list of vectors as user input for `SimulationTimeSeries` (#956)
-
- - Add list of vectors as user input for initially selected vectors.
- - Deprecate usage of {vector1, vector2, vector3}
- - Add ValueError for missing vectors
-
-commit 9609bb0403e92e0ce2dcad6f681cd15960f876f8
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Fri Feb 11 08:25:02 2022 +0100
-
- Delta relative to date within ensemble `SimulationTimeSeries` (#951)
-
- Calculate delta relative to date within ensemble for SimulationTimeSeries-plugin.
-
- - Selectable dates in dropdown
- - Calculate vector data in dataframes relative to selected date
- - Calculate statistics afterwards, i.e. "resetting" the statistics calculation!
-
-commit 1785f150f66fd1d3f3c6b08067787522dede9e86
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Feb 10 11:54:02 2022 +0100
-
- `WellCompletion` handling different zone → layer mappings over realizations (#944)
-
- * Import the zone->layer mappings for all realizations and return the data as a dataframe
-
- * merge the zone->layer dataframe with the compdat data on layer and realization
-
- * changelog entry
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 106c5c926eae828e4be59310fe22b98fa43ad512
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Wed Feb 9 15:56:38 2022 +0100
-
- User defined vector definition in SimulationTimeSeries plugin (#940)
-
- - Added configurable user defined vector definitions.
- - Changed vector annotation from "AVG_" with suffix "R" and "INTVL_" to "PER_DAY_" and "PER_INTVL_". Retrieve `VectorDefinitions` via Python-API for `webviz-subsurface-components`.
-
-commit 32bb6b074b84786ae13997253120013eba595c73
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Feb 9 12:30:17 2022 +0100
-
- Prepare release (#952)
-
-commit 927ef9ab071b59a0532dc5ba4c79a3a9ae9290d4
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Feb 9 12:29:26 2022 +0100
-
- Temp. CI/CD workaround `statsmodels` (#953)
-
-commit ce18444470c3b321ed53977fa77ccc9e8dae841d
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Jan 31 14:51:23 2022 +0100
-
- Adjustments in `RftPlotter` due to changes in `ParametersModel` (#945)
-
- * Pass dummy dataframe to ParametersModel
-
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 415d8697bdba9c999bffab6a8286e957b46a2ffb
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Jan 31 11:46:20 2022 +0100
-
- Update according to new `black` version (#947)
-
-commit 0fd30b1f6e82d2a4bb05e6725729567e0d8ff102
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Fri Jan 28 13:38:58 2022 +0100
-
- Fix hover info for observation trace in `SimulationTimeSeries` (#937)
-
-commit e759bc691a39b376570a0e4f0197e6f97853508a
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Fri Jan 28 13:24:47 2022 +0100
-
- Fix `is_integer()` issue in `ParameterFilter` (#939)
-
-commit c73a699e1e31b2efa384cba3e0b8ad5f2d1cb586
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu Jan 20 22:43:20 2022 +0100
-
- Deprecate `ReservoirSimulationTimeSeries` (#935)
-
-commit 8cebeb1ae60cdb5cfb7fe0e2a127c3ec609addf4
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Jan 20 21:48:48 2022 +0100
-
- Bugfixes and improvements to `ParameterFilter` and `ParameterAnalysis` (#924)
-
- Co-authored-by: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-
-commit 996b773684e1799cb24b79981a270eee7bbc00b7
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Jan 20 21:36:39 2022 +0100
-
- Don't skip `SENSNAME` `ref` if multiple realizations in tornado (#929)
-
-commit 2011f0e7d537ee57b13b38af68d3c2482cde4a93
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Jan 20 21:08:35 2022 +0100
-
- `RftPlotter` fix: Handle correlate function returning `NaN` values (#932)
-
-commit dab94696d2c6c6af6c0ca4404a44e02818f3970d
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Jan 20 17:42:20 2022 +0100
-
- Fix: correct labels in tornado when both cases are on same side of ref (#934)
-
-commit 05b1c8ea7813e8c0ad0f10c1f82039994e13c61b
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Thu Jan 20 16:44:38 2022 +0100
-
- Unit tests new SimulationTimeSeries plugin (#923)
-
- Unit tests for types, utility and general "business logic" in new `SimulationTimeSeries` plugin.
-
- - Unit tests for files in `utils/` and `types/`-folder.
- - Resolve issue with conversion of `datetime.datetime` to `pd.Timestamp` for `pd.DataFrame` by making utility functions.
- - Minor fixes/updates to code based on issues found during testing.
-
-commit 39db9b92ad17f0ca0af27b15f8d674d2ab9c8108
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Wed Jan 19 14:06:29 2022 +0100
-
- Fix: Skip adding emodel to webvizstore in VolumetricAnalysis when using csv input (#926)
-
-commit 10b792bed9ccc948095855582f102ee44a4c79e3
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Mon Jan 17 15:41:35 2022 +0100
-
- Ensure valid provider realization for History Vectors in new `SimulationTimeSeries` (#921)
-
- Replace usage of realization = 0, with retrieving valid realization numbers for provider and use lowest realization number to create history vector.
-
-commit a5a7e410206ae0fede15a358922e3bd539fb7c6d
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Jan 17 13:41:05 2022 +0100
-
- General figures in `ParameterAnalysis` (#919)
-
- * changed CorrelationFigure to general BarChart
-
- * Generalized scatter plot
-
- * bug fix and activated trendline in scatter plot
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 8f5e0e719664516e1b9c31f197dcffc8d567f435
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Jan 13 14:21:22 2022 +0100
-
- New data provider in GroupTree plugin (#902)
-
- * new data provider
-
- * converted files and file structure to best practice
-
- * gruptree testing rewritten for new data provider
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 0ac74cc619ca8e7808da2958eb53eeba8fa07679
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Jan 13 12:32:58 2022 +0100
-
- Update param response selections by clicking in bar chart (#914)
-
- * click response in bar chart also in param_vs_sim case
-
- * Fixed bug related to updating formations well by clicking in map
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit ab38a567e84067d31cdde4cecb32f26fd98ee124
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Fri Jan 7 12:43:39 2022 +0100
-
- `SimulationTimeSeries`: Add statistics after realizations (#913)
-
- `SimulationTimeSeries`: Add statistics after realizations
-
-commit a8701c76e2e329795d586fa5fc3e6b3b74c6830a
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu Jan 6 15:33:29 2022 +0100
-
- Prepare release (#912)
-
-commit e84317cd2d1ef898260683c86deb83ac33725952
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Jan 6 13:52:29 2022 +0100
-
- Handle ensembles with missing surface folders (#911)
-
-commit 011d37440a27cffe4205168995a1eeb809072e5c
-Author: Sigurd Pettersen
-Date: Wed Jan 5 15:26:18 2022 +0100
-
- Fixed typing/mypy issues (#907)
-
-commit 32b7352dae0ae1258a898a0c683f1a3b7acd8760
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu Dec 23 23:13:58 2021 +0100
-
- Workaround `astroid`/`pylint` bug (#901)
-
-commit 91cdd14eb159f582de1fd283ce76115f209cdc1a
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Dec 22 11:31:25 2021 +0100
-
- General improvements to VolumetricAnalysis (#895)
-
- * General improvements to VolumetricAnalysis
-
- * changelog
-
-commit 4aebb47887a4c15dd20a7a63b7ef37cbf30e4a6e
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Wed Dec 22 09:03:13 2021 +0100
-
- Format dates in download for resampled date in SimulationTimeSeries (#898)
-
-commit 4db719bb418e6c4ba3d70e8960a40c80b1d7fdd2
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Tue Dec 21 14:25:48 2021 +0100
-
- Add quarterly sampling frequency to summary provider and SimulationTimeSeries (#896)
-
-commit ed92862c7ec9a87027a51f636604e5d1e1df69c0
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Tue Dec 21 13:26:38 2021 +0100
-
- Parameter response tab in RFT plotter (#884)
-
- * change data loading to EnsembleSetModel
-
- * Put figures in separate folder
-
- * new tab for correlations and class for layout element names
-
- * Main layout for correlations tab
-
- * loading of parameters
-
- * put callbacks in folder and renamed figures folder
-
- * Renamed correlations to parameter response
-
- * Added param respons layout element names
-
- * moved functionality from processing to business logic
-
- * first version of parameter response callbacks
-
- * param respon plugin framework
-
- * correlation bar chart implemented. some functionality generalized
-
- * general barchart implemented
-
- * generalized colors functionality
-
- * implemented scatterplot
-
- * clickdata callback
-
- * started implementing formations figure
-
- * added formation plot
-
- * Color coding of the formations plot
-
- * function to get ensemble wells and parameters
-
- * removed zone values from initial layout
-
- * implemented param_vs_sim correlation option
-
- * title option
-
- * made formation lines thinner and grayer
-
- * Updated plugin docstring
-
- * updated colors utils
-
- * fixed problems related to rebasing of colors file
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 59528d2449103e7bc142a147b7b6f610e5b35756
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Tue Dec 21 11:03:37 2021 +0100
-
- Change label and add hoverinfo for uncertainty envelope in StructuralUncertainty (#880)
-
-commit 43543f1b23d14b3a8bced4bf87a08faf72be5420
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Fri Dec 17 16:11:52 2021 +0100
-
- `SeismicMisfit` - improved polygon plotting performance (#888)
-
-commit 15966e1ecb116ac17f6bee97f374ad31a50d2b7e
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Fri Dec 17 11:18:15 2021 +0100
-
- Add "Statistics + realizations"-plot to New SimulationTimeSeries plugin (#883)
-
- Added `Statistics + Realizations`-plot for New `SimulationTimeSeries` plugin.
-
- Includes:
- - Statistics and individual realizations traces in same plot - realizations gets scaled color lightness on traces.
- - Filtering of realizations to include in visualization
- - Selection to calculate statistics from all realizations or selected subset of realizations
- - Update download of user data based on the new visualization mode
-
-commit ab1a8334f1d8a26edaf646133f8739d27b8a45d3
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Thu Dec 16 21:24:38 2021 +0100
-
- Added new simulation time series plugin
-
- New `SimulationTimeSeries` plugin, with code structure according to best practice plugin example `webviz-plugin-boilerplate` and usage of `EnsembleSummaryProvider`. New functionality as multiple Delta Ensembles in same plot, selectable resampling frequency and possibility to group subplots per selected ensemble or per selected vector.
-
-commit 465eb1f5f3d65fe5dc88ac9c2fce748b2bd64fff
-Author: Sigurd Pettersen
-Date: Thu Dec 16 15:21:38 2021 +0100
-
- Added `rel_file_pattern` argument to EnsembleSummaryProviderFactory methods (#889)
-
-commit d6560660a7143c3f81add8d6eee32aaf697bb4ed
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Dec 10 08:51:41 2021 +0100
-
- Prepare release (#879)
-
-commit a55058b49291b96dc181bd8b054c36cc674d3c3f
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Fri Dec 10 08:37:39 2021 +0100
-
- Use regular `numpy` for all map statistic calculations (#878)
-
-commit 6f45250e5874a9cfac0aaec0aeb1e84427558545
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Fri Dec 10 08:35:23 2021 +0100
-
- Fix issues with `WellLogViewer` prop changes (#877)
-
-commit f961069a27850b8c9d81a04e48b0e8cef18c34e1
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Dec 9 14:35:50 2021 +0100
-
- Handle fancharts with intermittent nan values (#875)
-
-commit 9bed882f3a86cfaaa30efd6568d08200262f9778
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Wed Dec 8 12:08:09 2021 +0100
-
- `GroupTree` bug fix related to `BRANPROP` group leaf nodes (#873)
-
-commit 3477e94cdd6604beb6fa629f31472eb233c89634
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Tue Dec 7 15:29:57 2021 +0100
-
- Comply with latest `pylint` version (#872)
-
- iterating the dictionary directly instead of calling .keys()
-
-commit a930a86f17d83e7e5bc092ef8d5c786b0d1843a1
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Tue Dec 7 13:47:40 2021 +0100
-
- Remove `CODEOWNERS` (#868)
-
-commit 710a5f455bf7646d3a472c430eef2ff9d667e84c
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Thu Dec 2 12:59:29 2021 +0100
-
- Fix `xtgeo` lint issue (#869)
-
-commit 924ac97a1e73a27d88c853950c1aa9161d544550
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Dec 1 10:31:46 2021 +0100
-
- Second bugfix on sensitivity comparison in VolumetricAnalysis (#863)
-
-commit 0771e9f2c74465c7b2bf5764470a18ddd4f249e4
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Tue Nov 30 16:02:41 2021 +0100
-
- Fix xtgeo/pylint linting issues (#865)
-
-commit 3302f0c694d590522cde560535d975a356acc383
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Fri Nov 26 13:32:06 2021 +0100
-
- Regression fix after sensitivity comparison (#860)
-
-commit 0ac83c421d6377a2e92915253b2f9981e6f62605
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Thu Nov 25 20:40:13 2021 +0100
-
- Update to latest `pylint` (#857)
-
-commit edfec8e88867b3a5c0e5201e3be83f5771adf1d4
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Nov 25 16:00:22 2021 +0100
-
- `RftPlotter` bug fixes and improvements (#854)
-
- * refactored code into files for layout, callbacks and business logic
-
- * fixed deselecting all ensembles bug
-
- * Fixed problem with no data matching filters
-
- * added title to the formations plot
-
- * Removed one date mark from the slider in the map controls
-
- * simplified title placement
-
- * updated links in documentation
-
- * fixed the problem of map plot changing size
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit a3043fd76f8905fb028a079694e8abbc50f5a1ff
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Nov 25 14:49:28 2021 +0100
-
- Sensitivity comparison in `VolumetricAnalysis` (#856)
-
-commit 8fd9504e4dc6ddefea68360d173000d7fc56eed0
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Nov 25 12:02:17 2021 +0100
-
- support both sensitivity and gen_kw ensembles (#855)
-
-commit 9297c35f5efe4b861ba1abdde0d443bfc20bd18a
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Nov 25 09:45:47 2021 +0100
-
- Groups as leaf nodes in the `GroupTree` plugin (#842)
-
- * implemented nodes as leaf nodes
-
- * implemented tests for add_nodetype function
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit 4398f481298bb5db7ffc2cc172112d9cd524c7c3
-Author: Sigurd Pettersen
-Date: Wed Nov 24 22:31:14 2021 +0100
-
- Added ensemble summary provider (#721)
-
-commit 8d3442a343b5d45f47d9febb9b8601e7afd96dc7
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Wed Nov 24 17:45:23 2021 +0100
-
- Refactoring `WellCompletions` code (#847)
-
- `WellCompletions` code refactored according to the best practice
-
-commit 2ad114470b54215006e16ca66e57fcb28a4cbd0e
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Nov 24 15:06:17 2021 +0100
-
- added realplot to tornadopage in VolumetricAnalysis (#845)
-
-commit cf0eeff730f67d172b22f52e9f7c03bcdd46bc43
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Nov 24 14:02:17 2021 +0100
-
- added combined sensname-senscase column (#851)
-
-commit 35763e82982df6d34d6feefd076bb4971561fb52
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Nov 24 09:47:54 2021 +0100
-
- Fixes to ParameterResponseCorrelation (#853)
-
-commit 39ad4bc6e64d4f0036ba98faaf27808b97514110
-Author: Sigurd Pettersen
-Date: Wed Nov 17 15:16:28 2021 +0100
-
- Updated target values in tests due to fixes in ecl 2.13.1 (#848)
-
- Updated target values in tests due to fixes in ecl 2.13.1
-
-commit 6c8c719ac38620e591067b9ec4871aa1aee937f5
-Author: Sigurd Pettersen
-Date: Wed Nov 17 08:29:17 2021 +0100
-
- Removed ert from test dependencies (#846)
-
-commit 8b6187a8d8aca38a8f0205e43ae91040931ec854
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Fri Nov 12 10:21:55 2021 +0100
-
- Seismic misfit improvements (#844)
-
-commit b75e88d924509de60c456a2725a938dd545588b7
-Author: Sigurd Pettersen
-Date: Thu Nov 11 18:22:44 2021 +0100
-
- Add script for doing batch conversion of UNSMRY files to .arrow (#772)
-
- Added script for doing batch conversion of UNSMRY files to Arrow
- Smry data in arrow format for SOME.UNSMRY will now be stored in the file share/results/unsmry/SOME.arrow
-
-commit f61ad71498fd7c4158721ab2d57c1b8d1a47ad8a
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Nov 11 13:04:43 2021 +0100
-
- Changed well connection status filetype to csv and updated docstring (#832)
-
- * renamed wellconnstatus filetype to csv and updated docstring
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit edf06baaba276d1a27a007e9694866605e643cd7
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Nov 11 10:07:26 2021 +0100
-
- Deleted files related to `ert` jobs (#831)
-
- * deleted files related to ert jobs
-
- * removed ert jobs and console scripts from setup.py
-
- Co-authored-by: Øyvind Lind-Johansen
-
-commit ed38ad57e01733aad9fbef0d73fb0e9f4d0c2f3c
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Nov 8 11:22:58 2021 +0100
-
- Prepare release (#843)
-
-commit 451912aa0ba41899688bd46951b14ea445f100cd
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Mon Nov 8 11:20:17 2021 +0100
-
- Bugfixes and improved hoverlabels for `Tornado component` (#841)
-
- Co-authored-by: Asgeir Nyvoll
-
-commit 4a08827598d90615fbe46dce956a445013fb1946
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Wed Nov 3 15:38:31 2021 +0100
-
- Fix timing bug in `AssistedHistoryMatchingAnalysis` by preventing initial callback (#838)
-
-commit 7e7b92a10681f187e2b322f794c5918f741c2714
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Nov 3 13:09:06 2021 +0100
-
- Bugfixes (#833)
-
-commit 9df1a7f0c9345795b5545b5796bf8f0347fe08cb
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Mon Nov 1 22:31:48 2021 +0100
-
- `SeismicMisfit` - fixes to doc and polygon selector (#830)
-
-commit 08483d0e1912105e0dbd91a6e8950e6d02d7fe32
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Oct 28 09:08:05 2021 +0200
-
- Change from ensembles to ensemble in TornadoPlotterFMU doc (#828)
-
-commit dc8494099d65601a18fa2d822f29102dd604586a
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Mon Oct 25 11:32:07 2021 +0200
-
- Tornado improvements (#825)
-
-commit 04a66158234b8781404dd262b4062c48757ff5dc
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Sun Oct 24 23:56:15 2021 +0200
-
- Handle invalid subgrid definition in `SurfaceWithGridCrossSection` (#820)
-
- * Handle invalid subgrid definition
-
-commit a0806d8d36f63a2d812c851479228cd01d917d63
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Sun Oct 24 13:56:42 2021 +0200
-
- `SeismicMisfit` update (#821)
-
-commit 1a7fe1dff94e598b5d4824583987a1027e495ece
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Fri Oct 15 08:37:21 2021 +0200
-
- Fixed formatting error in `DiskUsage` bar chart tooltip (#817)
-
-commit 9b78322aa22eeeb0335353318f33615977f975bc
-Author: Roger Nybø <51825893+rnyb@users.noreply.github.com>
-Date: Tue Oct 12 11:29:55 2021 +0200
-
- Add new `SeismicMisfit` plugin (#734)
-
-commit a8852ccbf32daef4852aceb8ce143ed5596747b3
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Oct 11 11:53:10 2021 +0200
-
- More statistical options in GroupTree plugin (#809)
-
- More statistical options and better menu behavior.
-
- Co-authored-by: Øyvind Lind-Johansen (CCI RPT RES1)
-
-commit f57bff775bbc09becbce4a10710f18d69b23f589
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Oct 8 21:29:09 2021 +0200
-
- Add Python 3.9 to CI (#588)
-
-commit f4673f66da568572d17ad1b17f91fb3ae63efb38
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Oct 8 15:03:58 2021 +0200
-
- Prepare release (#812)
-
-commit e2a9a0df327b92de51375d4ebe869170242306a8
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Oct 7 15:31:49 2021 +0200
-
- Bugfixes VolumetricAnalysis (#810)
-
-commit 259f678650e7d8bf84914d6f7e58914d4b82b090
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Oct 4 15:08:50 2021 +0200
-
- Runtime improvement in `GroupTree` plugin (#807)
-
-commit 8f6bd76b2cba38efda2e3a95d363b3bd1de7a03e
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Oct 4 08:01:45 2021 +0200
-
- Update according to new data (#805)
-
-commit 7c5f23da87c464e7ae16e7cbc891ff4b7c84b6a2
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Sep 30 08:13:48 2021 +0200
-
- Bugfixes `VolumetricAnalysis` (#802)
-
- * Bugfixes VolumetricsAnalysis
-
-commit adccf1029baa85a747664bde9bf2a181c032dbb5
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Sep 28 12:26:18 2021 +0200
-
- Bugfix ParametersModel sensrun check logic (#794)
-
-commit 263fe9b22411c59faac4eb73ef28b4ca7951306f
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Sep 27 19:05:24 2021 +0200
-
- Update tests based on change in testdata set (#792)
-
-commit ea0e22a16d298b00a5be2dbf87a9f9d163625985
-Author: Håvard Berland
-Date: Mon Sep 27 17:48:55 2021 +0200
-
- Import sorting with `isort` (#795)
-
-commit 0a4d12e73096d4f141be353aae20b37f096f865a
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Fri Sep 24 20:09:08 2021 +0200
-
- `GroupTree` plugin for network visualization (#771)
-
-commit 8ebbfa64c6ece0eec8e425ce4f7d632c321c23fa
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Fri Sep 24 19:19:47 2021 +0200
-
- Ensure map bounds are updated when switching attribute (#791)
-
-commit d5f446e6bf0bfdddbab0c2f35f3b8f5367bab037
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Fri Sep 24 16:29:20 2021 +0200
-
- Remove REAL grouping on ensemble comparison (#784)
-
-commit d6172ea2086c5847ed4420ee165ee10bbb22443b
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Fri Sep 24 15:41:09 2021 +0200
-
- Added fipfile QC tab to VolumetricAnalysis (#783)
-
-commit b6bdd88d729e76384b9493d45c589aeeee0001c4
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Fri Sep 24 14:08:10 2021 +0200
-
- Prvent possibility of calculating statistics over different SENSNAME's in VolumetricAnalysis (#788)
-
-commit f52650c7455feb09c2ec6a14f44db2278243f056
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Sep 23 19:46:33 2021 +0200
-
- Fix bug when no predefined_expressions are defined (#779)
-
-commit 0815246b62f86db3a552c10a8e87b024e35117fb
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Sep 23 18:48:13 2021 +0200
-
- Bugfix property calculation in mean table `VolumetricAnalysis` (#782)
-
- * Bugfix property calculation in mean table VolumetricAnalysis
-
-commit c62ecb931057addf2a022870820ccfb84bb8a9c1
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Sep 23 14:29:27 2021 +0200
-
- Reset `dash` imports in `volumetric_analysis.py` to Dash 2.0 format (#780)
-
-commit bf1bff60ce3ee8cfe67ece084f62a8e2a37b7265
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Sep 23 10:29:10 2021 +0200
-
- Added source and ensemble comparison tabs in VolumetricAnalysis (#777)
-
-commit bb960afa95230ccc69e424e64711c6c7bcaa6a8b
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Sep 21 19:20:17 2021 +0200
-
- Added region/zone vs fipnum filter switch (#773)
-
-commit b747851a32d896da56cafe51fb730f5f803e4ac4
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Tue Sep 21 16:01:17 2021 +0200
-
- Add `VectorCalculator` in `ReservoirSimulationTimeseries` plugin (#709)
-
- Add usage of `VectorCalculator` component in reservoir simulation timeseries plugin for calculation and graphing of custom simulation time series vectors.
-
- - Add usage of `VectorCalculator` react component in `ReservoirSimulationTimeSeries` plugin
- - Add utility functions for handling vector calculator functionality
- - Add utility functions for predefining calculated expressions in configuration file (test data)
- - Add calculated vector expressions into vector selectors
-
-
- Closes issue https://github.com/equinor/webviz-subsurface/issues/293
-
-commit 9621b0f30730664a0b2f118cdf16e1c8f52f9696
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Sep 21 13:53:10 2021 +0200
-
- Support eclipse volumes in VolumetricAnalysis (#770)
-
-commit dc50f8e9e4cf0fa1f1ad6bf2b4a02eed009c5fc4
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Sep 17 13:34:18 2021 +0200
-
- Adjust to latest `pylint` (#768)
-
-commit 1257f54e9e3213277a861b0081bafa2ba5c4d0bb
-Author: Åshild Skålnes <35798031+ashildskalnes@users.noreply.github.com>
-Date: Wed Sep 15 09:19:35 2021 +0200
-
- Use correct inline/xline ranges in ` SegyViewer` (#765)
-
-commit 25314f5ba6ad88d20e285d30007600f243458e32
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Tue Sep 14 11:49:38 2021 +0200
-
- Lint tests (#766)
-
-commit 617f717b9277cbd9691036ce26c2c98a65d8efbf
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Mon Sep 13 14:54:43 2021 +0200
-
- Bump Dash to 2.0.0 (#760)
-
-commit 2562a2f306201f82cc155e12221cfabe8b6ac747
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Mon Sep 13 14:16:13 2021 +0200
-
- Load/Save xtgeo.RegularSurface as bytestream (#761)
-
-commit 6dfc70364045d5bb905b123179eb06762aae7ed2
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Mon Sep 13 12:26:01 2021 +0200
-
- Skip dash-renderer errors in VolumetricAnalysis log assertion test (#763)
-
-commit cf5f97eee2ffb549733df5339d91c712bab81eba
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Sep 10 11:18:16 2021 +0200
-
- Add `useless-suppression` to `pylint` checks (#759)
-
-commit 895455e068285a607d229ec73a23de2bdd504839
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Tue Sep 7 14:42:15 2021 +0200
-
- Updated tests for Drogon (#755)
-
-commit 51f9cf331298766bf4a7573a890ea24f3722b4d7
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Sep 3 14:41:42 2021 +0200
-
- Prepare for release (#757)
-
-commit edd9675eabc25ad793f21e7ef5bd53b5e0fcfbb4
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Fri Sep 3 13:30:57 2021 +0200
-
- 🩹 for flaky test (#756)
-
-commit bd84101ca577a54152f7f3e9612dac0e2e9c518f
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Wed Sep 1 14:58:06 2021 +0200
-
- Handle missing surfaces in PropertyStatistics (#753)
-
-commit 86ac51b206f84094545a6871c4cd574a73b5987c
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Wed Sep 1 10:04:54 2021 +0200
-
- Filter on OK in `ensemble_table_provider_factory` (#747)
-
-commit 64ec6054f614d462fc424b71f25740aac2205fcf
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Sep 1 09:22:57 2021 +0200
-
- Fix for single valued columns in `LinePlotterFMU` (#749)
-
-commit b12c3d142f95b4a374d08a3367e7412e92d84d13
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Aug 31 17:45:29 2021 +0200
-
- Bugfix in `VolumetricAnalysis` to trigger callbacks on page refresh (#748)
-
-commit ec5aad348915ad2f38115f661ecc313ae38038a9
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Tue Aug 24 22:11:23 2021 +0200
-
- Removed warning from well completion documentation (#744)
-
-commit 7eea7c6642f5bef3f95768995fbe2437bb661fe7
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Aug 24 22:05:16 2021 +0200
-
- Generalize plot functions (#707)
-
-commit 5af705e2f4a5398f0555479cc0328147235d7f3c
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Tue Aug 24 21:31:31 2021 +0200
-
- Move `types-dataclasses` to test requirements (#742)
-
-commit 07d4c5531808ab7ba08cfa517a00dd23824ed713
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Tue Aug 24 20:00:14 2021 +0200
-
- Well Log Viewer (#733)
-
-commit 2c14fd9d768affadadf4f4007ef6a1a59511129b
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Aug 24 19:09:35 2021 +0200
-
- Bugfix for the case of missing `BULK` column (#741)
-
-commit 2e60b901c28006fa0858b64c0934f90ae09ae25e
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Tue Aug 24 13:46:17 2021 +0200
-
- Common fan chart input utility (#719)
-
-commit c2e9e62c215557a3913720142993c855dfe686f0
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Mon Aug 23 20:42:37 2021 +0200
-
- Tables as tab for easier access (#724)
-
-commit ac5485f0e5d6bc08e14fa59c5f1ccb22a804b15e
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Mon Aug 23 16:38:17 2021 +0200
-
- Use `ParametersModel` in `InplaceVolumesModel` and `ParameterAnalysis` (#700)
-
-commit ca01f4c2cdf36bc97611956b481bf2e8fb204720
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Mon Aug 23 13:32:52 2021 +0200
-
- Use dict literal and add exception for encoding in pylint (#739)
-
-commit 97ddbc3ffb2e41c9bff257f049b54cbe2c4bbb3b
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Aug 18 14:08:05 2021 +0200
-
- Layout updates to ParameterFilter (#729)
-
-commit e321f960e06f64d3413bcd456032259370695b3d
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Aug 17 16:22:38 2021 +0200
-
- Added parameter filter to ParameterAnalysis (#730)
-
-commit 674bff65e121cca59999802ddc5d86df8d9ee805
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Tue Aug 17 10:21:44 2021 +0200
-
- Preserve uirevision in timeseries and relperm plugins (#717)
-
-commit 8561b9d97cd5f102e4460537ad4420eb9a03cef7
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Mon Aug 16 11:25:03 2021 +0200
-
- Table fixes to `ParameterAnalysis` and `PropertyStatistics` (#728)
-
-commit 2f09c3f8474f98733b2e0bd62b500b8f513d475b
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Aug 12 12:23:14 2021 +0200
-
- Update DiskUsage to support new format (#708)
-
-commit 5947d01b3d501fcc6ae37fa4cd8278a7aab6ca0d
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Aug 12 10:59:38 2021 +0200
-
- Set required init values to `xtgeo.RegularSurface()` (#726)
-
- * Set required init values to xtgeo.RegularSurface()
- * Initialize RegularSurface using from_file()
-
- Co-authored-by: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-
-commit bd7aa85ff559e5c8447de25cdfa02d3245221113
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Wed Aug 11 11:35:32 2021 +0200
-
- Custom tornado plot response option in `VolumetricAnalysis` (#723)
-
-commit 85994d8782809319a695cc47bfa1091bf81a5602
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Wed Jul 14 10:43:49 2021 +0200
-
- Prepare for new release (#720)
-
-commit 25b5dfa60594f9da1b61726110dde996c6facfb7
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Fri Jul 9 12:29:20 2021 +0200
-
- Avoided recalculation of unique dates in `WellCompletions` (#718)
-
-commit a331f2884c785ffff63fc791666ac292438e060a
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Thu Jul 8 09:24:56 2021 +0200
-
- Improved search for unit system + ERT-job user interface (#715)
-
-commit 52507febfb702fb53c42d575e2bdf1e493835879
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Tue Jul 6 09:39:33 2021 +0200
-
- Fix callback issue `VolumetricAnalysis` (#712)
-
-commit 66486740369b38a0119ae997d4327ad9af31bf97
-Author: Øyvind Lind-Johansen <47847084+lindjoha@users.noreply.github.com>
-Date: Mon Jul 5 22:18:26 2021 +0200
-
- Removed `output` argument from ERT jobs (#710)
-
-commit f69a545b3d895208de663a604a5a0d81a6a1248a
-Author: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
-Date: Mon Jul 5 21:32:52 2021 +0200
-
- Change usage of `df.all()` (#714)
-
-commit cf253fd8384f08b1bb2e68b867865e72984b3f87
-Author: Jørgen Herje <82032112+jorgenherje@users.noreply.github.com>
-Date: Sun Jul 4 21:51:19 2021 +0200
-
- Update `dash` version to 1.20 (#711)
-
-commit 554a609eb9e32df618c7556421c1452f6f87a157
-Author: Therese Natterøy <61694854+tnatt@users.noreply.github.com>
-Date: Thu Jul 1 12:22:25 2021 +0200
-
- Bugfix TornadoPlot when no sensitivities have impact (#704)
-
-commit 3653f79e89b855dccca32cf1a22d853919b84902
-Author: Asgeir Nyvoll <47146384+asnyv@users.noreply.github.com>
-Date: Thu Jul 1 10:38:36 2021 +0200
-
- adhere to pylint 2.9.0 (#705)
-
-commit 3cf03cbef68a7120471a771eb11dbd7dc6fa1538
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Sun Jun 27 17:01:12 2021 +0200
-
- Remove Frame wrapper from WellCompletions (#691)
-
-commit 23b3e10250ebced51aedb7712c284ec0f39c75ca
-Author: Hans Kallekleiv <16436291+HansKallekleiv@users.noreply.github.com>
-Date: Sun Jun 27 16:15:07 2021 +0200
-
- Add deprecation warning to InplaceVolumesOneByOne (#683)
-
- Co-authored-by: Anders Fredrik Kiær <31612826+anders-kiaer@users.noreply.github.com>
From 696384b719dc8376664abac18a619d5ddafe185b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Therese=20Natter=C3=B8y?=
<61694854+tnatt@users.noreply.github.com>
Date: Mon, 21 Nov 2022 13:39:24 +0100
Subject: [PATCH 4/4] make separate plugin
---
.github/workflows/subsurface.yml | 146 +----
setup.py | 1 +
webviz_subsurface/plugins/__init__.py | 5 +-
.../parameter_response_controller.py | 5 +-
...eservoir_simulation_timeseries_onebyone.py | 574 +++++++++++-------
.../__init__.py | 2 +-
.../_callbacks.py | 13 +-
.../_plugin.py | 2 +-
8 files changed, 386 insertions(+), 362 deletions(-)
diff --git a/.github/workflows/subsurface.yml b/.github/workflows/subsurface.yml
index 398442a37..b111cec73 100644
--- a/.github/workflows/subsurface.yml
+++ b/.github/workflows/subsurface.yml
@@ -173,130 +173,28 @@ jobs:
matrix:
python-version: ["3.8"]
- - name: 🧹 Remove unused pre-installed software
- run: |
- # https://github.com/actions/virtual-environments/issues/751
- # https://github.com/actions/virtual-environments/issues/709
- sudo apt-get purge p7zip* yarn ruby-full ghc* php7*
- sudo apt-get autoremove
- sudo apt-get clean
- df -h
-
- - name: 📖 Checkout commit locally
- uses: actions/checkout@v2
-
- - name: 🐍 Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v2
- with:
- python-version: ${{ matrix.python-version }}
-
- - name: 📦 Install webviz-subsurface with dependencies
- run: |
- pip install --upgrade pip
- if [[ $(pip freeze) ]]; then
- pip freeze | grep -vw "pip" | xargs pip uninstall -y
- fi
- pip install "bleach<5" # https://github.com/equinor/webviz-config/issues/586
- pip install "werkzeug<2.1" # ...while waiting for https://github.com/plotly/dash/issues/1992
- pip install "selenium<4.3" # breaking change in selenium==4.3
- pip install "scipy<1.9.3" # breaking change in scipy==1.9.3
- pip install "pytest<7.2.0"
- pip install "pytest-xdist<3.0"
- pip install "xtgeo<2.20.2"
- pip install "mypy<0.990"
- pip install .
-
- # Testing against our latest release (including pre-releases)
- pip install --pre --upgrade webviz-config webviz-core-components webviz-subsurface-components
-
- - name: 📦 Install test dependencies
- run: |
- pip install .[tests]
- wget https://chromedriver.storage.googleapis.com/$(wget https://chromedriver.storage.googleapis.com/LATEST_RELEASE -q -O -)/chromedriver_linux64.zip
- unzip chromedriver_linux64.zip
- export PATH=$PATH:$PWD
-
- - name: 🧾 List all installed packages
- run: pip freeze
-
- - name: 🕵️ Check code style & linting
- run: |
- black --check webviz_subsurface tests setup.py
- pylint webviz_subsurface tests setup.py
- bandit -r -c ./bandit.yml webviz_subsurface tests setup.py
- isort --check-only webviz_subsurface tests setup.py
- mypy --package webviz_subsurface
-
- - name: 🤖 Run tests
- env:
- # If you want the CI to (temporarily) run against your fork of the testdada,
- # change the value her from "equinor" to your username.
- TESTDATA_REPO_OWNER: equinor
- # If you want the CI to (temporarily) run against another branch than master,
- # change the value her from "master" to the relevant branch name.
- TESTDATA_REPO_BRANCH: master
- run: |
- git clone --depth 1 --branch $TESTDATA_REPO_BRANCH https://github.com/$TESTDATA_REPO_OWNER/webviz-subsurface-testdata.git
- # Copy any clientside script to the test folder before running tests
- mkdir ./tests/assets && cp ./webviz_subsurface/_assets/js/* ./tests/assets
- pytest ./tests --headless --forked --testdata-folder ./webviz-subsurface-testdata
- rm -rf ./tests/assets
- webviz docs --portable ./docs_build --skip-open
-
- - name: 🐳 Build Docker example image
- run: |
- pip install --pre webviz-config-equinor
- export SOURCE_URL_WEBVIZ_SUBSURFACE=https://github.com/$GITHUB_REPOSITORY
- export GIT_POINTER_WEBVIZ_SUBSURFACE=$GITHUB_REF
- webviz build ./webviz-subsurface-testdata/webviz_examples/webviz-full-demo.yml --portable ./example_subsurface_app --theme equinor
- rm -rf ./webviz-subsurface-testdata
- pushd example_subsurface_app
- docker build -t webviz/example_subsurface_image:equinor-theme .
- popd
-
- - name: 🐳 Update Docker Hub example image
- if: github.event_name != 'schedule' && github.ref == 'refs/heads/master' && matrix.python-version == '3.8'
- run: |
- echo ${{ secrets.dockerhub_webviz_token }} | docker login --username webviz --password-stdin
- docker push webviz/example_subsurface_image:equinor-theme
-
- - name: 🐳 Update review/test Docker example image
- if: github.ref != 'refs/heads/master' && contains(github.event.head_commit.message, '[deploy test]') && matrix.python-version == '3.8'
- run: |
- docker tag webviz/example_subsurface_image:equinor-theme ${{ secrets.review_docker_registry_url }}/${{ secrets.review_container_name }}
-
- echo ${{ secrets.review_docker_registry_token }} | docker login ${{ secrets.review_docker_registry_url }} --username ${{ secrets.review_docker_registry_username }} --password-stdin
- docker push ${{ secrets.review_docker_registry_url }}/${{ secrets.review_container_name }}
-
- - name: 🚢 Build and deploy Python package
- if: github.event_name == 'release' && matrix.python-version == '3.8'
- env:
- TWINE_USERNAME: __token__
- TWINE_PASSWORD: ${{ secrets.pypi_webviz_token }}
- run: |
- python -m pip install --upgrade setuptools wheel twine
- python setup.py sdist bdist_wheel
- twine upload dist/*
-
- - name: 📚 Update GitHub pages
- if: github.event_name == 'release' && matrix.python-version == '3.8'
- run: |
- cp -R ./docs_build ../docs_build
-
- git config --local user.email "webviz-github-action"
- git config --local user.name "webviz-github-action"
- git fetch origin gh-pages
- git checkout --track origin/gh-pages
- git clean -f -f -d -x
- git rm -r *
+ steps:
+ - name: 📖 Checkout commit locally
+ uses: actions/checkout@v2
- cp -R ../docs_build/* .
+ - name: 🐍 Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
- git add .
+ - name: 📦 Install webviz-subsurface with dependencies
+ run: |
+ pip install --upgrade pip
+ pip install "bleach<5" # https://github.com/equinor/webviz-config/issues/586
+ pip install "werkzeug<2.1" # ...while waiting for https://github.com/plotly/dash/issues/1992
+ pip install "selenium<4.3" # breaking change in selenium==4.3
+ pip install "scipy<1.9.3" # breaking change in scipy==1.9.3
+ pip install "pytest<7.2.0"
+ pip install "pytest-xdist<3.0"
+ pip install "xtgeo<2.20.2"
+ pip install .
- if git diff-index --quiet HEAD; then
- echo "No changes in documentation. Skip documentation deploy."
- else
- git commit -m "Update Github Pages"
- git push "https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git" gh-pages
- fi
+ - name: Test import
+ run: |
+ import webviz_subsurface
+ shell: python
diff --git a/setup.py b/setup.py
index 565612b07..c8ce0006a 100644
--- a/setup.py
+++ b/setup.py
@@ -60,6 +60,7 @@
"RelativePermeability = webviz_subsurface.plugins:RelativePermeability",
"ReservoirSimulationTimeSeries = webviz_subsurface.plugins:ReservoirSimulationTimeSeries",
"ReservoirSimulationTimeSeriesOneByOne = webviz_subsurface.plugins:ReservoirSimulationTimeSeriesOneByOne",
+ "SimulationTimeSeriesOneByOne = webviz_subsurface.plugins:SimulationTimeSeriesOneByOne",
"ReservoirSimulationTimeSeriesRegional = webviz_subsurface.plugins:ReservoirSimulationTimeSeriesRegional",
"RftPlotter = webviz_subsurface.plugins:RftPlotter",
"RunningTimeAnalysisFMU = webviz_subsurface.plugins:RunningTimeAnalysisFMU",
diff --git a/webviz_subsurface/plugins/__init__.py b/webviz_subsurface/plugins/__init__.py
index cc724ae2b..af8d99977 100644
--- a/webviz_subsurface/plugins/__init__.py
+++ b/webviz_subsurface/plugins/__init__.py
@@ -51,7 +51,10 @@
from ._segy_viewer import SegyViewer
from ._seismic_misfit import SeismicMisfit
from ._simulation_time_series import SimulationTimeSeries
-from ._simulation_timeseries_onebyone import ReservoirSimulationTimeSeriesOneByOne
+from ._simulation_timeseries_onebyone import SimulationTimeSeriesOneByOne
+from ._reservoir_simulation_timeseries_onebyone import (
+ ReservoirSimulationTimeSeriesOneByOne,
+)
from ._structural_uncertainty import StructuralUncertainty
from ._subsurface_map import SubsurfaceMap
from ._surface_viewer_fmu import SurfaceViewerFMU
diff --git a/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py b/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py
index 4d9307180..3a9bbe7cd 100644
--- a/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py
+++ b/webviz_subsurface/plugins/_parameter_analysis/controllers/parameter_response_controller.py
@@ -131,8 +131,9 @@ def _update_graphs(
# Make timeseries graph
param_df = parametermodel.get_parameter_df_for_ensemble(
- ensemble, reals=realizations)
-
+ ensemble, reals=realizations
+ )
+
timeseries_fig = TimeSeriesFigure(
dframe=merge_dataframes_on_realization(
vector_df[["DATE", "REAL", vector]], param_df[["REAL", parameter]]
diff --git a/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py b/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py
index a38830ff6..acab713fa 100644
--- a/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py
+++ b/webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py
@@ -1,13 +1,12 @@
import datetime
import json
from pathlib import Path
-from typing import Callable, List, Optional, Tuple, Union
+from typing import Callable, List, Tuple, Union
from uuid import uuid4
import numpy as np
import pandas as pd
import webviz_core_components as wcc
-import webviz_subsurface_components as wsc
from dash import Dash, Input, Output, State, callback_context, dash_table, dcc, html
from dash.exceptions import PreventUpdate
from webviz_config import WebvizPluginABC, WebvizSettings
@@ -15,19 +14,9 @@
from webviz_config.webviz_store import webvizstore
from webviz_subsurface._components import TornadoWidget
-from webviz_subsurface._figures import TimeSeriesFigure
-from webviz_subsurface._models.parameter_model import ParametersModel
-from webviz_subsurface._providers import (
- EnsembleSummaryProviderFactory,
- EnsembleTableProviderFactory,
- EnsembleTableProviderSet,
- Frequency,
-)
-from webviz_subsurface._utils.dataframe_utils import merge_dataframes_on_realization
-from webviz_subsurface._utils.datetime_utils import from_str, to_str
-from webviz_subsurface.plugins._parameter_analysis.models import (
- ProviderTimeSeriesDataModel,
- SimulationTimeSeriesModel,
+from webviz_subsurface._models import (
+ EnsembleSetModel,
+ caching_ensemble_set_model_factory,
)
from .._abbreviations.number_formatting import table_statistics_base
@@ -123,6 +112,11 @@ class ReservoirSimulationTimeSeriesOneByOne(WebvizPluginABC):
"RUNPATH",
]
+ TABLE_STAT: List[Tuple[str, dict]] = [
+ ("Sensitivity", {}),
+ ("Case", {}),
+ ] + table_statistics_base()
+
# pylint: disable=too-many-arguments
def __init__(
self,
@@ -130,24 +124,19 @@ def __init__(
webviz_settings: WebvizSettings,
csvfile_smry: Path = None,
csvfile_parameters: Path = None,
- time_index: str = "monthly",
- sampling: str = "monthly",
- rel_file_pattern: str = "share/results/unsmry/*.arrow",
ensembles: list = None,
column_keys: list = None,
initial_vector: str = None,
+ sampling: str = "monthly",
line_shape_fallback: str = "linear",
) -> None:
super().__init__()
+ self.time_index = sampling
+ self.column_keys = column_keys
self.csvfile_smry = csvfile_smry
self.csvfile_parameters = csvfile_parameters
- self.ensembles = ensembles
- self.vmodel: Optional[
- Union[SimulationTimeSeriesModel, ProviderTimeSeriesDataModel]
- ] = None
- table_provider = EnsembleTableProviderFactory.instance()
if csvfile_smry and ensembles:
raise ValueError(
@@ -155,72 +144,54 @@ def __init__(
'"ensembles"'
)
if csvfile_smry and csvfile_parameters:
- smry_df = read_csv(csvfile_smry)
- parameter_df = read_csv(csvfile_parameters)
-
- self.vmodel = SimulationTimeSeriesModel(
- dataframe=smry_df, line_shape_fallback=line_shape_fallback
+ self.smry = read_csv(csvfile_smry)
+ self.parameters = read_csv(csvfile_parameters)
+ self.parameters["SENSTYPE"] = self.parameters.apply(
+ lambda row: find_sens_type(row.SENSCASE), axis=1
)
+ self.smry_meta = None
elif ensembles:
-
- ensemble_paths = {
- ensemble_name: webviz_settings.shared_settings["scratch_ensembles"][
- ensemble_name
- ]
- for ensemble_name in ensembles
+ self.ens_paths = {
+ ensemble: webviz_settings.shared_settings["scratch_ensembles"][ensemble]
+ for ensemble in ensembles
}
-
- resampling_frequency = Frequency(time_index)
- provider_factory = EnsembleSummaryProviderFactory.instance()
-
- try:
- provider_set = {
- ens: provider_factory.create_from_arrow_unsmry_presampled(
- str(ens_path), rel_file_pattern, resampling_frequency
- )
- for ens, ens_path in ensemble_paths.items()
- }
- self.vmodel = ProviderTimeSeriesDataModel(
- provider_set=provider_set, column_keys=column_keys
- )
-
- except ValueError as error:
- message = (
- f"Some/all ensembles are missing arrow files at {rel_file_pattern}.\n"
- "If no arrow files have been generated with `ERT` using `ECL2CSV`, "
- "the commandline tool `smry2arrow_batch` can be used to generate arrow "
- "files for an ensemble"
- )
- raise ValueError(message) from error
-
- parameter_df = self.create_df_from_table_provider(
- table_provider.create_provider_set_from_per_realization_parameter_file(
- ensemble_paths
+ self.emodel: EnsembleSetModel = (
+ caching_ensemble_set_model_factory.get_or_create_model(
+ ensemble_paths=self.ens_paths,
+ time_index=self.time_index,
+ column_keys=self.column_keys,
)
)
+ self.smry = self.emodel.get_or_load_smry_cached()
+ self.smry_meta = self.emodel.load_smry_meta()
+ # Extract realizations and sensitivity information
+ self.parameters = get_realizations(
+ ensemble_paths=self.ens_paths, ensemble_set_name="EnsembleSet"
+ )
else:
raise ValueError(
'Incorrent arguments. Either provide a "csvfile_smry" and "csvfile_parameters" or '
'"ensembles"'
)
-
- self.pmodel = ParametersModel(dataframe=parameter_df, drop_constants=True)
- self.parameter_df = self.pmodel.dataframe
-
- self.vectors = self.vmodel.vectors
- self.smry_meta = None
-
+ self.smry_cols = [
+ c
+ for c in self.smry.columns
+ if c not in ReservoirSimulationTimeSeriesOneByOne.ENSEMBLE_COLUMNS
+ and historical_vector(c, self.smry_meta, False) not in self.smry.columns
+ ]
self.initial_vector = (
initial_vector
- if initial_vector and initial_vector in self.vectors
- else self.vectors[0]
+ if initial_vector and initial_vector in self.smry_cols
+ else self.smry_cols[0]
+ )
+ self.ensembles = list(self.parameters["ENSEMBLE"].unique())
+ self.line_shape_fallback = set_simulation_line_shape_fallback(
+ line_shape_fallback
)
- self.ensembles = list(self.parameter_df["ENSEMBLE"].unique())
- self.realizations = list(self.parameter_df["REAL"].unique())
self.tornadoplot = TornadoWidget(
- app, webviz_settings, self.parameter_df, allow_click=True
+ app, webviz_settings, self.parameters, allow_click=True
)
self.uid = uuid4()
self.theme = webviz_settings.theme
@@ -230,18 +201,6 @@ def ids(self, element: str) -> str:
"""Generate unique id for dom element"""
return f"{element}-id-{self.uid}"
- def create_df_from_table_provider(
- self, provider: EnsembleTableProviderSet
- ) -> pd.DataFrame:
- dfs = []
- for ens in provider.ensemble_names():
- df = provider.ensemble_provider(ens).get_column_data(
- column_names=provider.ensemble_provider(ens).column_names()
- )
- df["ENSEMBLE"] = df.get("ENSEMBLE", ens)
- dfs.append(df)
- return pd.concat(dfs)
-
@property
def tour_steps(self) -> List[dict]:
return [
@@ -283,54 +242,26 @@ def ensemble_selector(self) -> html.Div:
)
@property
- def visualization_selector(self) -> html.Div:
+ def smry_selector(self) -> html.Div:
"""Dropdown to select ensemble"""
- return wcc.RadioItems(
- id=self.ids("visualization"),
+ return wcc.Dropdown(
+ label="Time series",
+ id=self.ids("vector"),
options=[
- {"label": "Individual realizations", "value": "realizations"},
- {"label": "Mean over Sensitivities", "value": "sensmean"},
+ {
+ "label": f"{simulation_vector_description(vec)} ({vec})",
+ "value": vec,
+ }
+ for vec in self.smry_cols
],
- value="realizations",
- )
-
- @property
- def sensitivity_selector(self) -> html.Div:
- """Dropdown to select ensemble"""
- return wcc.SelectWithLabel(
- id=self.ids("sensitivity_filter"),
- options=[{"label": i, "value": i} for i in self.pmodel.sensitivities],
- value=self.pmodel.sensitivities,
- size=min(20, len(self.pmodel.sensitivities)),
- )
-
- @property
- def vector_selector(self) -> html.Div:
- """Dropdown to select ensemble"""
- return wsc.VectorSelector(
- id=self.ids("vector"),
- maxNumSelectedNodes=1,
- data=self.vmodel.vector_selector_data,
- persistence=True,
- persistence_type="session",
- selectedTags=[self.initial_vector],
- numSecondsUntilSuggestionsAreShown=0.5,
- lineBreakAfterTag=True,
+ clearable=False,
+ value=self.initial_vector,
)
@property
- def colormap(self) -> dict:
- return {
- sens: color
- for sens, color in zip(
- self.parameter_df["SENSNAME_CASE"],
- (self.theme.plotly_theme["layout"]["colorway"] * 3),
- )
- }
-
- @property
- def initial_date(self) -> str:
- return to_str(max(self.vmodel.dates))
+ def initial_date(self) -> datetime.date:
+ df = self.smry[["ENSEMBLE", "DATE"]]
+ return df.loc[df["ENSEMBLE"] == df["ENSEMBLE"].unique()[0]]["DATE"].max()
def add_webvizstore(self) -> List[Tuple[Callable, list]]:
return (
@@ -344,7 +275,18 @@ def add_webvizstore(self) -> List[Tuple[Callable, list]]:
)
]
if self.csvfile_smry and self.csvfile_parameters
- else []
+ else self.emodel.webvizstore
+ + [
+ (
+ get_realizations,
+ [
+ {
+ "ensemble_paths": self.ens_paths,
+ "ensemble_set_name": "EnsembleSet",
+ }
+ ],
+ )
+ ]
)
@property
@@ -359,36 +301,51 @@ def layout(self) -> html.Div:
children=[
wcc.Selectors(
label="Selectors",
- children=[
- self.ensemble_selector,
- self.vector_selector,
- ],
- ),
- wcc.Selectors(
- label="Visualization",
- children=self.visualization_selector,
+ children=[self.ensemble_selector, self.smry_selector],
),
- wcc.Selectors(
- label="Sensitivity filter",
- children=[self.sensitivity_selector],
+ dcc.Store(
+ id=self.ids("date-store"),
+ storage_type="session",
),
],
),
),
wcc.FlexColumn(
flex=3,
- children=[
- wcc.Frame(
- style={"height": "48vh"},
- color="white",
- highlight=False,
- children=wcc.Graph(
- id=self.ids("graph"),
- style={"height": "46vh"},
- clickData={"points": [{"x": self.initial_date}]},
+ children=wcc.Frame(
+ style={"height": "90vh"},
+ color="white",
+ highlight=False,
+ children=[
+ html.Div(
+ id=self.ids("graph-wrapper"),
+ style={"height": "450px"},
+ children=wcc.Graph(
+ id=self.ids("graph"),
+ clickData={"points": [{"x": self.initial_date}]},
+ ),
),
- ),
- ],
+ html.Div(
+ children=[
+ html.Div(
+ id=self.ids("table_title"),
+ style={"textAlign": "center"},
+ children="",
+ ),
+ html.Div(
+ style={"fontSize": "15px"},
+ children=dash_table.DataTable(
+ id=self.ids("table"),
+ sort_action="native",
+ filter_action="native",
+ page_action="native",
+ page_size=10,
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
),
wcc.FlexColumn(
flex=3,
@@ -403,24 +360,20 @@ def layout(self) -> html.Div:
],
)
- def create_vectors_statistics_df(self, dframe, vector) -> pd.DataFrame:
- return (
- dframe[["DATE", vector, "SENSNAME_CASE"]]
- .groupby(["DATE", "SENSNAME_CASE"])
- .mean()
- .reset_index()
- )
-
# pylint: disable=too-many-statements
def set_callbacks(self, app: Dash) -> None:
@app.callback(
[
+ # Output(self.ids("date-store"), "children"),
+ Output(self.ids("table"), "data"),
+ Output(self.ids("table"), "columns"),
+ Output(self.ids("table_title"), "children"),
Output(self.tornadoplot.storage_id, "data"),
],
[
Input(self.ids("ensemble"), "value"),
Input(self.ids("graph"), "clickData"),
- Input(self.ids("vector"), "selectedNodes"),
+ Input(self.ids("vector"), "value"),
],
)
def _render_date(
@@ -432,19 +385,25 @@ def _render_date(
date = clickdata["points"][0]["x"]
except TypeError as exc:
raise PreventUpdate from exc
- vector = vector[0]
-
- vector_df = self.vmodel.get_vector_df(
- ensemble=ensemble, realizations=self.realizations, vectors=[vector]
- )
-
- vector_df = vector_df.loc[vector_df["DATE"] == from_str(date)]
-
+ data = filter_ensemble(self.smry, self.parameters, ensemble, [vector])
+ data = data.loc[data["DATE"].astype(str) == date]
+ table_rows, table_columns = calculate_table(data, vector)
return (
+ # json.dumps(f"{date}"),
+ table_rows,
+ table_columns,
+ (
+ f"{simulation_vector_description(vector)} ({vector})"
+ + (
+ ""
+ if get_unit(self.smry_meta, vector) is None
+ else f" [{get_unit(self.smry_meta, vector)}]"
+ )
+ ),
json.dumps(
{
"ENSEMBLE": ensemble,
- "data": vector_df[["REAL", vector]].values.tolist(),
+ "data": data[["REAL", vector]].values.tolist(),
"number_format": "#.4g",
"unit": (
""
@@ -457,20 +416,20 @@ def _render_date(
@app.callback(
Output(self.ids("graph"), "figure"),
- Input(self.tornadoplot.click_id, "data"),
- Input(self.tornadoplot.high_low_storage_id, "data"),
- Input(self.ids("sensitivity_filter"), "value"),
- Input(self.ids("visualization"), "value"),
- State(self.ids("ensemble"), "value"),
- State(self.ids("vector"), "selectedNodes"),
- State(self.ids("graph"), "clickData"),
- State(self.ids("graph"), "figure"),
+ [
+ Input(self.tornadoplot.click_id, "data"),
+ Input(self.tornadoplot.high_low_storage_id, "data"),
+ ],
+ [
+ State(self.ids("ensemble"), "value"),
+ State(self.ids("vector"), "value"),
+ State(self.ids("graph"), "clickData"),
+ State(self.ids("graph"), "figure"),
+ ],
)
def _render_tornado( # pylint: disable=too-many-branches, too-many-locals
tornado_click_data_str: Union[str, None],
high_low_storage: dict,
- sensitivites,
- visualization,
ensemble: str,
vector: str,
date_click: dict,
@@ -480,7 +439,7 @@ def _render_tornado( # pylint: disable=too-many-branches, too-many-locals
if callback_context.triggered is None:
raise PreventUpdate
ctx = callback_context.triggered[0]["prop_id"].split(".")[0]
- vector = vector[0]
+
tornado_click: Union[dict, None] = (
json.loads(tornado_click_data_str) if tornado_click_data_str else None
)
@@ -488,68 +447,223 @@ def _render_tornado( # pylint: disable=too-many-branches, too-many-locals
reset_click = tornado_click["sens_name"] is None
else:
reset_click = False
- print(ctx)
- # # Draw initial figure and redraw if ensemble/vector changes
- # if ctx in ["", self.tornadoplot.high_low_storage_id] or reset_click:
-
- realizations = list(
- self.parameter_df[self.parameter_df["SENSNAME"].isin(sensitivites)][
- "REAL"
- ].unique()
- )
+
+ # Draw initial figure and redraw if ensemble/vector changes
+ if ctx in ["", self.tornadoplot.high_low_storage_id] or reset_click:
+ vectors = [vector]
+ historical_vector_name = historical_vector(vector, self.smry_meta, True)
+
+ if (
+ historical_vector_name is not None
+ and historical_vector_name in self.smry.columns
+ ):
+ vectors.append(historical_vector_name)
+ data = filter_ensemble(
+ self.smry,
+ self.parameters,
+ ensemble,
+ vectors,
+ )
+
+ line_shape = get_simulation_line_shape(
+ line_shape_fallback=self.line_shape_fallback,
+ vector=vector,
+ smry_meta=self.smry_meta,
+ )
+ traces = [
+ {
+ "type": "line",
+ "marker": {"color": "grey"},
+ "hoverinfo": "x+y+text",
+ "hovertext": f"Real: {r}",
+ "x": df["DATE"],
+ "y": df[vector],
+ "customdata": r,
+ "line": {"shape": line_shape},
+ "meta": {
+ "SENSCASE": df["SENSCASE"].values[0],
+ "SENSTYPE": df["SENSTYPE"].values[0],
+ },
+ "name": ensemble,
+ "legendgroup": ensemble,
+ "showlegend": r == data["REAL"][0],
+ }
+ for r, df in data.groupby(["REAL"])
+ ]
+ if historical_vector(vector, self.smry_meta, True) in data.columns:
+ hist = data[data["REAL"] == data["REAL"][0]]
+ traces.append(
+ {
+ "type": "line",
+ "x": hist["DATE"],
+ "y": hist[historical_vector(vector, self.smry_meta, True)],
+ "line": {
+ "shape": line_shape,
+ "color": "black",
+ "width": 3,
+ },
+ "name": "History",
+ "legendgroup": "History",
+ "showlegend": True,
+ }
+ )
+ # traces[0]["hoverinfo"] = "x"
+ figure = {
+ "data": traces,
+ "layout": {"margin": {"t": 60}, "hovermode": "closest"},
+ }
+
# Update line colors if a sensitivity is selected in tornado
# pylint: disable=too-many-nested-blocks
- # if tornado_click and tornado_click["sens_name"] in high_low_storage:
- if tornado_click and ctx in [
- self.tornadoplot.click_id,
- self.tornadoplot.high_low_storage_id,
- ]:
- tornado_click["real_low"] = high_low_storage[
- tornado_click["sens_name"]
- ].get("real_low")
- tornado_click["real_high"] = high_low_storage[
- tornado_click["sens_name"]
- ].get("real_high")
- realizations = tornado_click["real_low"] + tornado_click["real_high"]
- print(realizations)
-
- # Get dataframe with vectors and dataframe with parameters and merge
- vector_df = self.vmodel.get_vector_df(
- ensemble=ensemble, realizations=realizations, vectors=[vector]
- )
-
- param_df = self.parameter_df[
- self.parameter_df["ENSEMBLE"] == ensemble
- ].copy()
- data = merge_dataframes_on_realization(dframe1=vector_df, dframe2=param_df)
+ if tornado_click and tornado_click["sens_name"] in high_low_storage:
+ if ctx == self.tornadoplot.high_low_storage_id:
+ tornado_click["real_low"] = high_low_storage[
+ tornado_click["sens_name"]
+ ].get("real_low")
+ tornado_click["real_high"] = high_low_storage[
+ tornado_click["sens_name"]
+ ].get("real_high")
+ if reset_click:
+ add_legend = True
+ for trace in figure["data"]:
+ if trace["name"] != "History":
+ if add_legend:
+ trace["showlegend"] = True
+ add_legend = False
+ else:
+ trace["showlegend"] = False
+ trace["marker"] = {"color": "grey"}
+ trace["opacity"] = 1
+ trace["name"] = ensemble
+ trace["legendgroup"] = ensemble
+ trace["hoverinfo"] = "all"
+ trace["hovertext"] = f"Real: {trace['customdata']}"
+
+ else:
+ add_legend_low = True
+ add_legend_high = True
+ for trace in figure["data"]:
+ if trace["name"] != "History":
+ if trace["customdata"] in tornado_click["real_low"]:
+ trace["marker"] = {
+ "color": self.theme.plotly_theme["layout"][
+ "colorway"
+ ][0]
+ }
+ trace["opacity"] = 1
+ trace["legendgroup"] = "real_low"
+ trace["hoverinfo"] = "all"
+ trace["name"] = (
+ "Below ref"
+ if trace["meta"]["SENSTYPE"] == "mc"
+ else trace["meta"]["SENSCASE"]
+ )
+ if add_legend_low:
+ add_legend_low = False
+ trace["showlegend"] = True
+ else:
+ trace["showlegend"] = False
+ elif trace["customdata"] in tornado_click["real_high"]:
+ trace["marker"] = {
+ "color": self.theme.plotly_theme["layout"][
+ "colorway"
+ ][1]
+ }
+ trace["opacity"] = 1
+ trace["legendgroup"] = "real_high"
+ trace["hoverinfo"] = "all"
+ trace["name"] = (
+ "Above ref"
+ if trace["meta"]["SENSTYPE"] == "mc"
+ else trace["meta"]["SENSCASE"]
+ )
+ if add_legend_high:
+ add_legend_high = False
+ trace["showlegend"] = True
+ else:
+ trace["showlegend"] = False
+ else:
+ trace["marker"] = {"color": "lightgrey"}
+ trace["opacity"] = 0.02
+ trace["showlegend"] = False
+ trace["hoverinfo"] = "skip"
date = date_click["points"][0]["x"]
-
- if visualization == "sensmean":
- data = self.create_vectors_statistics_df(data, vector)
-
- figure = TimeSeriesFigure(
- dframe=data,
- visualization="realizations",
- vector=vector,
- ensemble=ensemble,
- dateline=from_str(date),
- historical_vector_df=self.vmodel.get_historical_vector_df(
- vector, ensemble
- ),
- color_col="SENSNAME_CASE",
- line_shape_fallback=self.vmodel.line_shape_fallback,
- discrete_color=True,
- discrete_color_map=self.colormap,
- groupby="SENSNAME_CASE" if visualization == "sensmean" else "REAL",
- ).figure
+ if figure is None:
+ raise PreventUpdate
+ ymin = min([min(trace["y"]) for trace in figure["data"]])
+ ymax = max([max(trace["y"]) for trace in figure["data"]])
+ figure["layout"]["shapes"] = [
+ {"type": "line", "x0": date, "x1": date, "y0": ymin, "y1": ymax}
+ ]
figure["layout"]["title"] = (
f"Date: {date}, "
f"Sensitivity: {tornado_click['sens_name'] if tornado_click else None}"
)
+ figure["layout"]["yaxis"] = {
+ "title": f"{simulation_vector_description(vector)} ({vector})"
+ + (
+ ""
+ if get_unit(self.smry_meta, vector) is None
+ else f" [{get_unit(self.smry_meta, vector)}]"
+ ),
+ "uirevision": vector,
+ }
+ figure["layout"]["xaxis"] = {"uirevision": "locked"}
+ figure["layout"]["legend"] = {
+ "orientation": "h",
+ # "traceorder": "reversed",
+ "y": 1.1,
+ "x": 1,
+ "xanchor": "right",
+ }
+ figure["layout"] = self.theme.create_themed_layout(figure["layout"])
return figure
+@CACHE.memoize(timeout=CACHE.TIMEOUT)
+def calculate_table(df: pd.DataFrame, vector: str) -> Tuple[List[dict], List[dict]]:
+ table = []
+ for (sensname, senscase), dframe in df.groupby(["SENSNAME", "SENSCASE"]):
+ values = dframe[vector]
+ try:
+ table.append(
+ {
+ "Sensitivity": str(sensname),
+ "Case": str(senscase),
+ "Minimum": values.min(),
+ "Maximum": values.max(),
+ "Mean": values.mean(),
+ "Stddev": values.std(),
+ "P10": np.percentile(values, 90),
+ "P90": np.percentile(values, 10),
+ }
+ )
+ except KeyError:
+ pass
+ columns = [
+ {**{"name": i[0], "id": i[0]}, **i[1]}
+ for i in ReservoirSimulationTimeSeriesOneByOne.TABLE_STAT
+ ]
+ return table, columns
+
+
+def filter_ensemble(
+ smry: pd.DataFrame, parameters: pd.DataFrame, ensemble: str, vector: List[str]
+) -> pd.DataFrame:
+ smry_columns = ["DATE", "REAL"] + vector
+ parameter_columns = ["REAL", "SENSCASE", "SENSNAME", "SENSTYPE"]
+ return pd.merge(
+ smry[smry_columns + ["ENSEMBLE"]].loc[smry["ENSEMBLE"] == ensemble][
+ smry_columns
+ ],
+ parameters[parameter_columns + ["ENSEMBLE"]].loc[
+ parameters["ENSEMBLE"] == ensemble
+ ][parameter_columns],
+ on=["REAL"],
+ )
+
+
@CACHE.memoize(timeout=CACHE.TIMEOUT)
@webvizstore
def read_csv(csv_file: Path) -> pd.DataFrame:
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py
index 84d0252ab..884005c53 100644
--- a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/__init__.py
@@ -1 +1 @@
-from ._plugin import ReservoirSimulationTimeSeriesOneByOne
+from ._plugin import SimulationTimeSeriesOneByOne
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py
index fcdcb35eb..f2d8ad4f3 100644
--- a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_callbacks.py
@@ -67,6 +67,7 @@ def _update_sensitivity_filter_and_reference(
vector_selector_data = datamodel.vmodel.create_vector_selector_data(
available_vectors
)
+
vector = vector if vector[0] in available_vectors else [available_vectors[0]]
return (
[{"label": elm, "value": elm} for elm in sensitivities],
@@ -132,8 +133,12 @@ def _render_date_selector(
)
def _update_date_text(dateidx: List[int], ensemble: str) -> List[str]:
"""Update selected date text on date-slider drag"""
- dates = datamodel.vmodel.dates_for_ensemble(ensemble)
- return [datetime_utils.to_str(dates[dateidx[0]])]
+ if ctx.triggered_id == get_uuid("ensemble"):
+ date = datamodel.vmodel.get_last_date(ensemble)
+ else:
+ dates = datamodel.vmodel.dates_for_ensemble(ensemble)
+ date = dates[dateidx[0]]
+ return [to_str(date)]
@callback(
Output(get_uuid("graph"), "figure"),
@@ -178,7 +183,9 @@ def _update_tornadoplot(
date: str, selections: dict, vector: str, ensemble: str
) -> tuple:
- if selections is None:
+ if selections is None or selections[
+ "Reference"
+ ] not in datamodel.get_unique_sensitivities_for_ensemble(ensemble):
raise PreventUpdate
# Get dataframe with vectors and dataframe with parameters and merge
diff --git a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py
index 3b3549a0f..8a6f5a906 100644
--- a/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py
+++ b/webviz_subsurface/plugins/_simulation_timeseries_onebyone/_plugin.py
@@ -19,7 +19,7 @@
from .models import ProviderTimeSeriesDataModel
-class ReservoirSimulationTimeSeriesOneByOne(WebvizPluginABC):
+class SimulationTimeSeriesOneByOne(WebvizPluginABC):
"""Visualizes reservoir simulation time series data for sensitivity studies based \
on a design matrix.