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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/ert/config/everest_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ class EverestControl(ParameterConfig):
"""

type: Literal["everest_parameters"] = "everest_parameters"
dimensionality: Literal[1] = 1
input_key: str
forward_init: bool = False
output_file: str = ""
Expand Down
1 change: 0 additions & 1 deletion src/ert/config/field.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@

class Field(ParameterConfig):
type: Literal["field"] = "field"
dimensionality: Literal[3] = 3
ertbox_params: ErtboxParameters
file_format: FieldFileFormat
output_transformation: str | None = None
Expand Down
1 change: 0 additions & 1 deletion src/ert/config/gen_kw_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ class _ParsedGenKwConfig:

class GenKwConfig(ParameterConfig):
type: Literal["gen_kw"] = "gen_kw"
dimensionality: Literal[1] = 1
distribution: DistributionSettings
forward_init: bool = False
update_strategy: LocalizationType | None = LocalizationType.GLOBAL
Expand Down
1 change: 0 additions & 1 deletion src/ert/config/surface_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ def __init__(

class SurfaceConfig(ParameterConfig):
type: Literal["surface"] = "surface"
dimensionality: Literal[2] = 2
ncol: int
nrow: int
xori: float
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/cesp.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@

class CrossEnsembleStatisticsPlot:
def __init__(self) -> None:
self.dimensionality = 1
self.requires_observations = False

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/distribution.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

class DistributionPlot:
def __init__(self) -> None:
self.dimensionality = 1
self.requires_observations = False

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/gaussian_kde.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

class GaussianKDEPlot:
def __init__(self) -> None:
self.dimensionality = 1
self.requires_observations = False

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/histogram.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

class HistogramPlot:
def __init__(self) -> None:
self.dimensionality = 1
self.requires_observations = False

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/misfits.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ class MisfitsPlot:
"""

def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = True

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@

class StatisticsPlot:
def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False

@staticmethod
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/ert_plots/std_dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

class StdDevPlot:
def __init__(self) -> None:
self.dimensionality = 3
self.requires_observations = False

def plot(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ class EverestBatchObjectiveFunctionPlot:
"""

def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False

def plot(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class EverestConstraintsPlot:
"""

def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False

def plot(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class EverestControlsPlot:
"""

def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False
self.selected_controls: list[str] = []

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

class EverestGradientsPlot:
def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False
self.selected_controls: list[str] = []

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ class EverestObjectiveFunctionPlot:
"""

def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False

def plot(
Expand Down
5 changes: 0 additions & 5 deletions src/ert/gui/plotting/plot_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ class PlotApiKeyDefinition(NamedTuple):
key: str
index_type: str | None
observations: bool
dimensionality: int
metadata: dict[Any, Any]
filter_on: dict[Any, Any] | None = None
parameter: ParameterConfig | None = None
Expand Down Expand Up @@ -171,7 +170,6 @@ def parameters_api_key_defs(self) -> list[PlotApiKeyDefinition]:
key=param_key,
index_type=None,
observations=False,
dimensionality=metadata["dimensionality"],
metadata={"data_origin": metadata["type"]},
parameter=param_cfg,
)
Expand Down Expand Up @@ -219,7 +217,6 @@ def update_keydef(plot_key_def: PlotApiKeyDefinition) -> None:
key=subkey,
index_type="VALUE",
observations=has_obs,
dimensionality=2,
metadata={
"data_origin": response_type,
},
Expand All @@ -233,7 +230,6 @@ def update_keydef(plot_key_def: PlotApiKeyDefinition) -> None:
key=key,
index_type="VALUE",
observations=has_obs,
dimensionality=2,
metadata={"data_origin": response_type},
response=response_config,
)
Expand All @@ -245,7 +241,6 @@ def update_keydef(plot_key_def: PlotApiKeyDefinition) -> None:
key="total objective value",
index_type="VALUE",
observations=False,
dimensionality=2,
metadata={"data_origin": "everest_batch_objectives"},
)
)
Expand Down
77 changes: 17 additions & 60 deletions src/ert/gui/plotting/plot_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
ENSEMBLE,
ERT_PLOT_MAP,
EVEREST_BATCH_OBJECTIVE_FUNCTION_PLOT,
EVEREST_CONSTRAINT_PLOT,
EVEREST_CONTROLS_PLOT,
EVEREST_GRADIENTS_PLOT,
EVEREST_OBJECTIVE_FUNCTION_PLOT,
Expand All @@ -46,6 +45,7 @@
SHARED_PLOT_MAP,
STATISTICS,
STD_DEV,
TABS_FOR_DATA_ORIGIN,
)
from ert.gui.plotting.widgets.plot_side_panel import PlotSidePanel
from ert.gui.utils import is_everest_application
Expand Down Expand Up @@ -235,21 +235,10 @@ def __init__(
self._central_tab.currentChanged.connect(self.current_tab_changed)
self.log_plot_tab_usage(self._central_tab.tabText(0), default=True)

self._prev_key_dimensionality = -1
self._prev_key: str | None = None
self._prev_key_origin: str | None = None
if self.is_everest:
self._default_tab_for_dimensionality = {
1: self._widget_by_name(ENSEMBLE),
2: self._widget_by_name(EVEREST_BATCH_OBJECTIVE_FUNCTION_PLOT),
3: self._widget_by_name(ENSEMBLE), # Fallback
}
else:
self._default_tab_for_dimensionality = {
1: self._widget_by_name(HISTOGRAM),
2: self._widget_by_name(ENSEMBLE),
3: self._widget_by_name(STD_DEV),
}
self._prev_available_tabs: frozenset[str] | None = None
self._default_tab_for_available_tabs: dict[frozenset[str], PlotWidget] = {}

QApplication.setOverrideCursor(Qt.CursorShape.WaitCursor)
try:
Expand Down Expand Up @@ -436,19 +425,8 @@ def update_plot(self, layer: int | None = None) -> None:
require_gradient=is_gradient_plot,
)

if (
plot_widget._plotter.dimensionality == key_def.dimensionality
or (
plot_widget.name
in {
EVEREST_BATCH_OBJECTIVE_FUNCTION_PLOT,
EVEREST_OBJECTIVE_FUNCTION_PLOT,
EVEREST_CONTROLS_PLOT,
EVEREST_GRADIENTS_PLOT,
EVEREST_CONSTRAINT_PLOT,
}
)
or (key_def.metadata.get("data_origin") == "everest_batch_objectives")
if plot_widget.name in TABS_FOR_DATA_ORIGIN.get(
key_def.metadata.get("data_origin", ""), []
):
selected_ensembles = (
self._ensemble_selection_widget.get_selected_ensembles()
Expand Down Expand Up @@ -772,37 +750,12 @@ def keySelected(self) -> None:
available_widgets = [
widget
for widget in self._plot_widgets
if widget._plotter.dimensionality == key_def.dimensionality
if widget.name
in TABS_FOR_DATA_ORIGIN.get(key_def.metadata.get("data_origin", ""), [])
and (key_def.observations or not widget._plotter.requires_observations)
and not is_everest_specific_widget
and (not is_observed_seismic or widget.name == MISFITS)
]

def everest_data_origin_check(origin: list[str]) -> bool:
return key_def.metadata.get("data_origin") in origin

everest_plot_and_origin = [
(EVEREST_OBJECTIVE_FUNCTION_PLOT, ["everest_objectives"]),
(EVEREST_BATCH_OBJECTIVE_FUNCTION_PLOT, ["everest_batch_objectives"]),
(EVEREST_CONSTRAINT_PLOT, ["everest_constraints"]),
(EVEREST_CONTROLS_PLOT, ["everest_parameters"]),
(EVEREST_GRADIENTS_PLOT, ["everest_constraints", "everest_objectives"]),
]

def everest_available_widget_selection(
widget_tuple_list: list[tuple[str, list[str]]],
) -> None:
for widget_name, origin in widget_tuple_list:
widget = self._widget_by_name(widget_name)
if everest_data_origin_check(origin):
if widget not in available_widgets:
available_widgets.append(widget)
elif widget in available_widgets:
available_widgets.remove(widget)

if self.is_everest:
everest_available_widget_selection(everest_plot_and_origin)

previous_widget = self._central_tab.currentWidget()

# Enabling/disabling tab triggers the
Expand All @@ -818,21 +771,25 @@ def everest_available_widget_selection(
)
current_widget = self._central_tab.currentWidget()

if 0 < self._prev_key_dimensionality != key_def.dimensionality:
available_tabs = frozenset(widget.name for widget in available_widgets)
if (
self._prev_available_tabs is not None
and self._prev_available_tabs != available_tabs
):
if isinstance(previous_widget, PlotWidget):
self._default_tab_for_dimensionality[self._prev_key_dimensionality] = (
self._default_tab_for_available_tabs[self._prev_available_tabs] = (
previous_widget
)
current_widget = self._default_tab_for_dimensionality[
key_def.dimensionality
]
remembered_widget = self._default_tab_for_available_tabs.get(available_tabs)
if remembered_widget is not None:
current_widget = remembered_widget

if current_widget not in available_widgets and available_widgets:
current_widget = available_widgets[0]

self._central_tab.setCurrentWidget(current_widget)
self._central_tab.currentChanged.connect(self.current_tab_changed)
self._prev_key_dimensionality = key_def.dimensionality
self._prev_available_tabs = available_tabs
self._prev_key = key_def.key
self._prev_key_origin = key_def.metadata.get("data_origin")
self.update_plot()
Expand Down
1 change: 0 additions & 1 deletion src/ert/gui/plotting/shared_plots/ensemble.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

class EnsemblePlot:
def __init__(self) -> None:
self.dimensionality = 2
self.requires_observations = False

def plot(
Expand Down
22 changes: 22 additions & 0 deletions src/ert/gui/plotting/utils/plot_maps.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from collections.abc import Callable

from ert.config.known_response_types import KNOWN_ERT_RESPONSE_TYPES
from ert.gui.plotting.ert_plots import (
CrossEnsembleStatisticsPlot,
DistributionPlot,
Expand Down Expand Up @@ -52,3 +53,24 @@
SHARED_PLOT_MAP: dict[str, Callable[[], Plotter]] = {
ENSEMBLE: EnsemblePlot,
}

ERT_RESPONSE_ORIGINS: frozenset[str] = frozenset(
response_type.model_fields["type"].default
for response_type in KNOWN_ERT_RESPONSE_TYPES
)

_ERT_RESPONSE_TABS = [ENSEMBLE, STATISTICS, MISFITS]

TABS_FOR_DATA_ORIGIN: dict[str, list[str]] = {
"gen_kw": [HISTOGRAM, GAUSSIAN_KDE, DISTRIBUTION, CROSS_ENSEMBLE_STATISTICS],
"surface": _ERT_RESPONSE_TABS,
"field": [STD_DEV],
"everest_parameters": [EVEREST_CONTROLS_PLOT],
"everest_objectives": [
EVEREST_OBJECTIVE_FUNCTION_PLOT,
EVEREST_GRADIENTS_PLOT,
],
"everest_constraints": [EVEREST_CONSTRAINT_PLOT, EVEREST_GRADIENTS_PLOT],
"everest_batch_objectives": [EVEREST_BATCH_OBJECTIVE_FUNCTION_PLOT],
**dict.fromkeys(ERT_RESPONSE_ORIGINS, _ERT_RESPONSE_TABS),
}
1 change: 0 additions & 1 deletion src/ert/gui/plotting/widgets/plot_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
class Plotter(Protocol):
"""Protocol for plot strategies used by PlotWidget."""

dimensionality: int
requires_observations: bool

def plot(
Expand Down
6 changes: 5 additions & 1 deletion tests/ert/ui_tests/gui/test_breakthrough_visualization.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from ert.gui.plotting.utils.plot_maps import (
ENSEMBLE,
STD_DEV,
TABS_FOR_DATA_ORIGIN,
)
from ert.gui.plotting.widgets import DataTypeKeysWidget
from ert.gui.tools.event_viewer import GUILogHandler
Expand Down Expand Up @@ -71,7 +72,10 @@ def select_plotter_figure(plot_window: PlotWindow, key: str, plot_tab_name: str)
found_selected_key = True
assert central_tab.isTabEnabled(tab_index)
central_tab.setCurrentWidget(tab)
assert key_def.dimensionality == tab._plotter.dimensionality
assert (
tab.name
in TABS_FOR_DATA_ORIGIN[key_def.metadata["data_origin"]]
)
if plot_tab_name == STD_DEV:
# we need a better resolution for box plots
tab._figure.set_size_inches(
Expand Down
Loading