webviz-subsurface 0.2.33__py3-none-any.whl → 0.2.34__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. webviz_subsurface/_models/parameter_model.py +1 -0
  2. webviz_subsurface/_providers/ensemble_grid_provider/grid_viz_service.py +3 -1
  3. webviz_subsurface/_utils/parameter_response.py +3 -1
  4. webviz_subsurface/plugins/_map_viewer_fmu/_tmp_well_pick_provider.py +3 -1
  5. webviz_subsurface/plugins/_map_viewer_fmu/_types.py +1 -0
  6. webviz_subsurface/plugins/_map_viewer_fmu/_utils.py +18 -1
  7. webviz_subsurface/plugins/_map_viewer_fmu/callbacks.py +38 -12
  8. webviz_subsurface/plugins/_map_viewer_fmu/layout.py +30 -16
  9. webviz_subsurface/plugins/_map_viewer_fmu/map_viewer_fmu.py +33 -5
  10. webviz_subsurface/plugins/_segy_viewer.py +6 -26
  11. webviz_subsurface/plugins/_surface_with_grid_cross_section.py +3 -16
  12. webviz_subsurface/plugins/_surface_with_seismic_cross_section.py +3 -16
  13. webviz_subsurface/plugins/_volumetric_analysis/controllers/distribution_controllers.py +33 -29
  14. webviz_subsurface/plugins/_volumetric_analysis/controllers/selections_controllers.py +8 -12
  15. webviz_subsurface/plugins/_volumetric_analysis/views/main_view.py +0 -3
  16. webviz_subsurface/plugins/_volumetric_analysis/views/selections_view.py +2 -12
  17. webviz_subsurface/plugins/_volumetric_analysis/volumetric_analysis.py +45 -3
  18. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/METADATA +1 -1
  19. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/RECORD +24 -24
  20. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/LICENSE +0 -0
  21. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/LICENSE.chromedriver +0 -0
  22. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/WHEEL +0 -0
  23. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/entry_points.txt +0 -0
  24. {webviz_subsurface-0.2.33.dist-info → webviz_subsurface-0.2.34.dist-info}/top_level.txt +0 -0
@@ -151,6 +151,7 @@ class ParametersModel:
151
151
  # if mix of gen_kw and sensitivity ensembles add
152
152
  # dummy sensitivvity columns to gen_kw ensembles
153
153
  gen_kw_mask = self._dataframe["SENSNAME"].isnull()
154
+ self._dataframe["SENSNAME"] = self._dataframe["SENSNAME"].astype(str)
154
155
  self._dataframe.loc[gen_kw_mask, "SENSNAME"] = "🎲"
155
156
  self._dataframe.loc[gen_kw_mask, "SENSCASE"] = "p10_p90"
156
157
 
@@ -478,7 +478,9 @@ class GridVizService:
478
478
  i_ref = reference(0)
479
479
  j_ref = reference(0)
480
480
  k_ref = reference(0)
481
- grid.ComputeCellStructuredCoords(cell_id, i_ref, j_ref, k_ref, True) # type: ignore[arg-type]
481
+ grid.ComputeCellStructuredCoords(
482
+ cell_id, i_ref, j_ref, k_ref, True # type: ignore[arg-type]
483
+ )
482
484
 
483
485
  cell_property_val: Optional[np.ndarray] = None
484
486
  if property_spec:
@@ -37,7 +37,9 @@ def filter_and_sum_responses(
37
37
  if aggregation == "sum":
38
38
  return df.groupby("REAL").sum().reset_index()[["REAL", response]]
39
39
  if aggregation == "mean":
40
- return df.groupby("REAL").mean().reset_index()[["REAL", response]]
40
+ return (
41
+ df.groupby("REAL").mean(numeric_only=True).reset_index()[["REAL", response]]
42
+ )
41
43
  raise ValueError(f"Unknown aggregation '{aggregation}'.")
42
44
 
43
45
 
@@ -3,6 +3,7 @@ from typing import Dict, List, Optional
3
3
  import geojson
4
4
  import pandas as pd
5
5
 
6
+ from webviz_subsurface._utils.colors import hex_to_rgb
6
7
  from webviz_subsurface._utils.enum_shim import StrEnum
7
8
 
8
9
 
@@ -64,10 +65,11 @@ class WellPickProvider:
64
65
  point = geojson.Point(coordinates=coords, validate=validate_geometry)
65
66
 
66
67
  geocoll = geojson.GeometryCollection(geometries=[point])
67
-
68
68
  properties = {
69
69
  "name": row[WellPickTableColumns.WELL],
70
70
  "attribute": str(row[attribute]),
71
+ "point_color": hex_to_rgb(row.get("point_color", "#000")),
72
+ "text_color": hex_to_rgb(row.get("text_color", "#000")),
71
73
  }
72
74
 
73
75
  feature = geojson.Feature(
@@ -9,6 +9,7 @@ class LayerTypes(StrEnum):
9
9
  WELLTOPSLAYER = "GeoJsonLayer"
10
10
  DRAWING = "DrawingLayer"
11
11
  FAULTPOLYGONS = "FaultPolygonsLayer"
12
+ FIELD_OUTLINE = "GeoJsonLayer"
12
13
  GEOJSON = "GeoJsonLayer"
13
14
 
14
15
 
@@ -1,8 +1,10 @@
1
1
  import base64
2
2
  import io
3
3
  import math
4
- from typing import List
4
+ from typing import Dict, List
5
5
 
6
+ import geojson
7
+ import xtgeo
6
8
  from PIL import Image, ImageDraw
7
9
 
8
10
 
@@ -39,3 +41,18 @@ def create_colormap_image_string(
39
41
  draw.rectangle([(x_0, 0), (x_1, height)], fill=rgb_to_hex(color))
40
42
 
41
43
  return f"data:image/png;base64,{image_to_base64(img)}"
44
+
45
+
46
+ def xtgeo_polygons_to_geojson(polygons: xtgeo.Polygons) -> Dict:
47
+ feature_arr = []
48
+ for name, polygon in polygons.dataframe.groupby("POLY_ID"):
49
+ coords = [list(zip(polygon.X_UTME, polygon.Y_UTMN))]
50
+ feature = geojson.Feature(
51
+ geometry=geojson.Polygon(coords),
52
+ properties={
53
+ "name": f"id:{name}",
54
+ "color": [200, 200, 200],
55
+ },
56
+ )
57
+ feature_arr.append(feature)
58
+ return geojson.FeatureCollection(features=feature_arr)
@@ -9,6 +9,7 @@ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
9
9
 
10
10
  import numpy as np
11
11
  import webviz_subsurface_components as wsc
12
+ import xtgeo
12
13
  from dash import ALL, MATCH, Input, Output, State, callback, callback_context, no_update
13
14
  from dash.exceptions import PreventUpdate
14
15
  from webviz_config import EncodedFile
@@ -32,7 +33,7 @@ from webviz_subsurface._providers import (
32
33
  from ._layer_model import DeckGLMapLayersModel
33
34
  from ._tmp_well_pick_provider import WellPickProvider
34
35
  from ._types import LayerTypes, SurfaceMode
35
- from ._utils import round_to_significant
36
+ from ._utils import round_to_significant, xtgeo_polygons_to_geojson
36
37
  from .layout import (
37
38
  DefaultSettings,
38
39
  LayoutElements,
@@ -51,6 +52,8 @@ def plugin_callbacks(
51
52
  surface_server: Union[SurfaceArrayServer, SurfaceImageServer],
52
53
  ensemble_fault_polygons_providers: Dict[str, EnsembleFaultPolygonsProvider],
53
54
  fault_polygons_server: FaultPolygonsServer,
55
+ field_outline_polygons: xtgeo.Polygons,
56
+ field_outline_color: Tuple[float, float, float],
54
57
  map_surface_names_to_fault_polygons: Dict[str, str],
55
58
  well_picks_provider: Optional[WellPickProvider],
56
59
  fault_polygon_attribute: Optional[str],
@@ -518,9 +521,27 @@ def plugin_callbacks(
518
521
  layer_data={
519
522
  "data": well_picks_provider.get_geojson(
520
523
  selected_wells, horizon_name
521
- )
524
+ ),
525
+ "getLineColor": "@@=properties.point_color",
526
+ "getFillColor": "@@=properties.point_color",
527
+ "getTextColor": "@@=properties.text_color",
528
+ },
529
+ )
530
+ if (
531
+ LayoutLabels.SHOW_FIELD_OUTLINE in options
532
+ and field_outline_polygons is not None
533
+ ):
534
+ layer_model.update_layer_by_id(
535
+ layer_id=f"{LayoutElements.FIELD_OUTLINE_LAYER}-{idx}",
536
+ layer_data={
537
+ "data": xtgeo_polygons_to_geojson(field_outline_polygons),
538
+ "filled": False,
539
+ "depthTest": False,
540
+ "lineWidthMinPixels": 2,
541
+ "getLineColor": field_outline_color,
522
542
  },
523
543
  )
544
+
524
545
  viewports = []
525
546
  view_annotations = []
526
547
  for idx, data in enumerate(surface_elements):
@@ -550,10 +571,13 @@ def plugin_callbacks(
550
571
  "show3D": False,
551
572
  "isSync": True,
552
573
  "layerIds": [
553
- f"{LayoutElements.MAP3D_LAYER}-{idx}"
554
- if isinstance(surface_server, SurfaceArrayServer)
555
- else f"{LayoutElements.COLORMAP_LAYER}-{idx}",
574
+ (
575
+ f"{LayoutElements.MAP3D_LAYER}-{idx}"
576
+ if isinstance(surface_server, SurfaceArrayServer)
577
+ else f"{LayoutElements.COLORMAP_LAYER}-{idx}"
578
+ ),
556
579
  f"{LayoutElements.FAULTPOLYGONS_LAYER}-{idx}",
580
+ f"{LayoutElements.FIELD_OUTLINE_LAYER}-{idx}",
557
581
  f"{LayoutElements.WELLS_LAYER}-{idx}",
558
582
  ],
559
583
  "name": make_viewport_label(data, tab_name, multi),
@@ -851,13 +875,15 @@ def plugin_callbacks(
851
875
  "colormap": {"value": colormap, "options": colormaps},
852
876
  "color_range": {
853
877
  "value": color_range,
854
- "step": calculate_slider_step(
855
- min_value=value_range[0],
856
- max_value=value_range[1],
857
- steps=100,
858
- )
859
- if value_range[0] != value_range[1]
860
- else 0,
878
+ "step": (
879
+ calculate_slider_step(
880
+ min_value=value_range[0],
881
+ max_value=value_range[1],
882
+ steps=100,
883
+ )
884
+ if value_range[0] != value_range[1]
885
+ else 0
886
+ ),
861
887
  "range": value_range,
862
888
  },
863
889
  }
@@ -37,15 +37,17 @@ class LayoutElements(StrEnum):
37
37
  RANGE_RESET = "color-range-reset-button"
38
38
  RESET_BUTTOM_CLICK = "color-range-reset-stored-state"
39
39
  FAULTPOLYGONS = "fault-polygon-toggle"
40
+ FIELD_OUTLINE_TOGGLE = "field-outline-toggle"
40
41
  WRAPPER = "wrapper-for-selector-component"
41
42
  COLORWRAPPER = "wrapper-for-color-selector-component"
42
43
  OPTIONS = "options"
43
44
 
44
45
  COLORMAP_LAYER = "deckglcolormaplayer"
45
- HILLSHADING_LAYER = "deckglhillshadinglayer"
46
+
46
47
  WELLS_LAYER = "deckglwelllayer"
47
48
  MAP3D_LAYER = "deckglmap3dlayer"
48
49
  FAULTPOLYGONS_LAYER = "deckglfaultpolygonslayer"
50
+ FIELD_OUTLINE_LAYER = "deckglfieldoutlinelayer"
49
51
  REALIZATIONS_FILTER = "realization-filter-selector"
50
52
  OPTIONS_DIALOG = "options-dialog"
51
53
 
@@ -69,8 +71,8 @@ class LayoutLabels(StrEnum):
69
71
  LINK = "🔗 Link"
70
72
  FAULTPOLYGONS = "Fault polygons"
71
73
  SHOW_FAULTPOLYGONS = "Show fault polygons"
74
+ SHOW_FIELD_OUTLINE = "Show field outline"
72
75
  SHOW_WELLS = "Show wells"
73
- SHOW_HILLSHADING = "Hillshading"
74
76
  COMMON_SELECTIONS = "Options and global filters"
75
77
  REAL_FILTER = "Realization filter"
76
78
  WELL_FILTER = "Well filter"
@@ -183,7 +185,7 @@ def main_layout(
183
185
  realizations: List[int],
184
186
  color_tables: List[Dict],
185
187
  show_fault_polygons: bool = True,
186
- hillshading_enabled: bool = True,
188
+ show_field_outline: bool = False,
187
189
  render_surfaces_as_images: bool = True,
188
190
  ) -> html.Div:
189
191
  return html.Div(
@@ -240,9 +242,9 @@ def main_layout(
240
242
  DialogLayout(
241
243
  get_uuid,
242
244
  show_fault_polygons,
245
+ show_field_outline,
243
246
  well_names,
244
247
  realizations,
245
- hillshading_enabled,
246
248
  ),
247
249
  ]
248
250
  )
@@ -304,18 +306,20 @@ class DialogLayout(wcc.Dialog):
304
306
  self,
305
307
  get_uuid: Callable,
306
308
  show_fault_polygons: bool,
309
+ show_field_outline: bool,
307
310
  well_names: List[str],
308
311
  realizations: List[int],
309
- hillshading_enabled: bool = True,
310
312
  ) -> None:
311
- checklist_options = [LayoutLabels.SHOW_HILLSHADING]
312
- checklist_values = (
313
- [LayoutLabels.SHOW_HILLSHADING] if hillshading_enabled else []
314
- )
313
+ checklist_options = []
314
+ checklist_values = []
315
315
  if show_fault_polygons:
316
316
  checklist_options.append(LayoutLabels.SHOW_FAULTPOLYGONS)
317
317
  checklist_values.append(LayoutLabels.SHOW_FAULTPOLYGONS)
318
318
 
319
+ if show_field_outline:
320
+ checklist_options.append(LayoutLabels.SHOW_FIELD_OUTLINE)
321
+ checklist_values.append(LayoutLabels.SHOW_FIELD_OUTLINE)
322
+
319
323
  if well_names:
320
324
  checklist_options.append(LayoutLabels.SHOW_WELLS)
321
325
  checklist_values.append(LayoutLabels.SHOW_FAULTPOLYGONS)
@@ -358,9 +362,11 @@ class LinkCheckBox(wcc.Checklist):
358
362
  clicked = selector in DefaultSettings.LINKED_SELECTORS.get(tab, [])
359
363
  super().__init__(
360
364
  id={
361
- "id": get_uuid(LayoutElements.LINK)
362
- if selector not in ["color_range", "colormap"]
363
- else get_uuid(LayoutElements.COLORLINK),
365
+ "id": (
366
+ get_uuid(LayoutElements.LINK)
367
+ if selector not in ["color_range", "colormap"]
368
+ else get_uuid(LayoutElements.COLORLINK)
369
+ ),
364
370
  "tab": tab,
365
371
  "selector": selector,
366
372
  },
@@ -570,9 +576,11 @@ class MapSelectorLayout(html.Div):
570
576
  ) -> None:
571
577
  super().__init__(
572
578
  style={
573
- "display": "none"
574
- if tab == Tabs.STATS and selector == MapSelector.MODE
575
- else "block"
579
+ "display": (
580
+ "none"
581
+ if tab == Tabs.STATS and selector == MapSelector.MODE
582
+ else "block"
583
+ )
576
584
  },
577
585
  children=wcc.Selectors(
578
586
  label=label,
@@ -805,7 +813,13 @@ def update_map_layers(
805
813
  "parameters": {"depthTest": False},
806
814
  }
807
815
  )
808
-
816
+ layers.append(
817
+ {
818
+ "@@type": LayerTypes.FIELD_OUTLINE,
819
+ "id": f"{LayoutElements.FIELD_OUTLINE_LAYER}-{idx}",
820
+ "data": {"type": "FeatureCollection", "features": []},
821
+ }
822
+ )
809
823
  if include_well_layer:
810
824
  layers.append(
811
825
  {
@@ -2,6 +2,7 @@ import json
2
2
  from pathlib import Path
3
3
  from typing import Callable, Dict, List, Optional, Tuple, Union
4
4
 
5
+ import xtgeo
5
6
  from dash import Dash, html
6
7
  from webviz_config import WebvizPluginABC, WebvizSettings
7
8
 
@@ -18,7 +19,8 @@ from webviz_subsurface._providers.ensemble_surface_provider.surface_array_server
18
19
  from webviz_subsurface._providers.ensemble_surface_provider.surface_image_server import (
19
20
  SurfaceImageServer,
20
21
  )
21
- from webviz_subsurface._utils.webvizstore_functions import read_csv
22
+ from webviz_subsurface._utils.colors import hex_to_rgb
23
+ from webviz_subsurface._utils.webvizstore_functions import get_path, read_csv
22
24
 
23
25
  from ._tmp_well_pick_provider import WellPickProvider
24
26
  from .callbacks import plugin_callbacks
@@ -39,6 +41,8 @@ A dashboard to covisualize arbitrary surfaces generated by FMU.
39
41
  Default value is 'share/results/maps'.
40
42
  * **`well_pick_file`:** A csv file with well picks. See data input.
41
43
  * **`fault_polygon_attribute`:** Which set of fault polygons to use.
44
+ * **`field_outline_polygons_file_path`:** Full filepath to a field outline polygons file.
45
+ * **`field_outline_color:** Color of the field outline polygons (hex).
42
46
  * **`map_surface_names_to_well_pick_names`:** Allows mapping of file surface names
43
47
  to the relevant well pick name
44
48
  * **`map_surface_names_to_fault_polygons`:** Allows mapping of file surface names
@@ -69,7 +73,11 @@ See [this file](https://github.com/equinor/webviz-subsurface-testdata/blob/maste
69
73
  01_drogon_ahm/realization-0/iter-0/share/results/polygons/\
70
74
  toptherys--gl_faultlines_extract_postprocess.pol) for an example.
71
75
 
76
+ Field outline polygons have the same format as fault polygons.
77
+
72
78
  Well picks are provided as a csv file with columns `X_UTME,Y_UTMN,Z_TVDSS,MD,WELL,HORIZON`.
79
+ Additionally the columns `point_color` and `text_color` can be used to specify the color of the
80
+ point and text respectively. Use hex color codes for this (e.g. #ffffff).<br>
73
81
  See [wellpicks.csv](https://github.com/equinor/webviz-subsurface-testdata/tree/master/\
74
82
  observed_data/drogon_well_picks/wellpicks.csv) for an example.<br>
75
83
  Well picks can be exported from RMS using this script: [extract_well_picks_from_rms.py]\
@@ -91,6 +99,8 @@ color-tables.json for color_tables format.
91
99
  attributes: list = None,
92
100
  well_pick_file: Path = None,
93
101
  fault_polygon_attribute: Optional[str] = None,
102
+ field_outline_polygons_file_path: Path = None,
103
+ field_outline_color: str = "#e51000",
94
104
  map_surface_names_to_fault_polygons: Dict[str, str] = None,
95
105
  map_surface_names_to_well_pick_names: Dict[str, str] = None,
96
106
  rel_surface_folder: str = "share/results/maps",
@@ -155,7 +165,16 @@ color-tables.json for color_tables format.
155
165
  self._fault_polygons_server = FaultPolygonsServer.instance(app)
156
166
  for fault_polygons_provider in self._ensemble_fault_polygons_providers.values():
157
167
  self._fault_polygons_server.add_provider(fault_polygons_provider)
158
-
168
+ self.field_outline_polygons = None
169
+ self.field_outline_polygons_file_path = field_outline_polygons_file_path
170
+ if self.field_outline_polygons_file_path is not None:
171
+ try:
172
+ self.field_outline_polygons = xtgeo.polygons_from_file(
173
+ get_path(self.field_outline_polygons_file_path)
174
+ )
175
+ except ValueError:
176
+ print("Error reading field outline polygons file")
177
+ self.field_outline_color = hex_to_rgb(field_outline_color)
159
178
  self.map_surface_names_to_fault_polygons = (
160
179
  map_surface_names_to_fault_polygons
161
180
  if map_surface_names_to_fault_polygons is not None
@@ -175,10 +194,13 @@ color-tables.json for color_tables format.
175
194
  reals.extend([x for x in provider.realizations() if x not in reals])
176
195
  return main_layout(
177
196
  get_uuid=self.uuid,
178
- well_names=self.well_pick_provider.well_names()
179
- if self.well_pick_provider is not None
180
- else [],
197
+ well_names=(
198
+ self.well_pick_provider.well_names()
199
+ if self.well_pick_provider is not None
200
+ else []
201
+ ),
181
202
  realizations=reals,
203
+ show_field_outline=self.field_outline_polygons is not None,
182
204
  color_tables=self.color_tables,
183
205
  render_surfaces_as_images=self.render_surfaces_as_images,
184
206
  )
@@ -191,6 +213,8 @@ color-tables.json for color_tables format.
191
213
  ensemble_fault_polygons_providers=self._ensemble_fault_polygons_providers,
192
214
  fault_polygon_attribute=self.fault_polygon_attribute,
193
215
  fault_polygons_server=self._fault_polygons_server,
216
+ field_outline_polygons=self.field_outline_polygons,
217
+ field_outline_color=self.field_outline_color,
194
218
  map_surface_names_to_fault_polygons=self.map_surface_names_to_fault_polygons,
195
219
  well_picks_provider=self.well_pick_provider,
196
220
  color_tables=self.color_tables,
@@ -202,4 +226,8 @@ color-tables.json for color_tables format.
202
226
  store_functions = []
203
227
  if self.well_pick_file is not None:
204
228
  store_functions.append((read_csv, [{"csv_file": self.well_pick_file}]))
229
+ if self.field_outline_polygons_file_path is not None:
230
+ store_functions.append(
231
+ (get_path, [{"path": self.field_outline_polygons_file_path}])
232
+ )
205
233
  return store_functions
@@ -49,7 +49,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
49
49
 
50
50
  self.zunit = zunit
51
51
  self.segyfiles: List[str] = [str(segy) for segy in segyfiles]
52
- self.initial_colors = (
52
+ self.colors = (
53
53
  colors
54
54
  if colors
55
55
  else [
@@ -68,7 +68,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
68
68
  ]
69
69
  )
70
70
  self.init_state = self.update_state(self.segyfiles[0])
71
- self.init_state.get("colorscale", self.initial_colors)
72
71
  self.init_state.get("uirevision", str(uuid4()))
73
72
 
74
73
  self.plotly_theme = webviz_settings.theme.plotly_theme
@@ -86,7 +85,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
86
85
  "color_min_value": float(f"{round(cube.values.min(), 2):2f}"),
87
86
  "color_max_value": float(f"{round(cube.values.max(), 2):2f}"),
88
87
  "uirevision": str(uuid4()),
89
- "colorscale": self.initial_colors,
90
88
  }
91
89
  if kwargs:
92
90
  for key, value in kwargs.items():
@@ -121,10 +119,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
121
119
  "id": self.uuid("zslice"),
122
120
  "content": "Selected zslice for the seismic cube.",
123
121
  },
124
- {
125
- "id": self.uuid("color-scale"),
126
- "content": "Click this button to change colorscale",
127
- },
128
122
  {
129
123
  "id": self.uuid("color-values"),
130
124
  "content": "Drag either node of slider to truncate color ranges.",
@@ -160,18 +154,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
160
154
  clearable=False,
161
155
  ),
162
156
  ),
163
- html.Div(
164
- children=[
165
- wcc.Label(
166
- children="Set colorscale",
167
- ),
168
- wcc.ColorScales(
169
- id=self.uuid("color-scale"),
170
- colorscale=self.initial_colors,
171
- nSwatches=12,
172
- ),
173
- ],
174
- ),
175
157
  html.Div(
176
158
  children=[
177
159
  wcc.RangeSlider(
@@ -183,7 +165,8 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
183
165
  self.init_state["min_value"],
184
166
  self.init_state["max_value"],
185
167
  ],
186
- tooltip={"placement": "bottom"},
168
+ marks=None,
169
+ tooltip={"placement": "bottom", "always_visible": True},
187
170
  step=calculate_slider_step(
188
171
  min_value=self.init_state["min_value"],
189
172
  max_value=self.init_state["max_value"],
@@ -257,7 +240,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
257
240
  Input(self.uuid("xline"), "clickData"),
258
241
  Input(self.uuid("zslice"), "clickData"),
259
242
  Input(self.uuid("color-values"), "value"),
260
- Input(self.uuid("color-scale"), "colorscale"),
261
243
  Input(self.uuid("zoom"), "n_clicks"),
262
244
  Input(self.uuid("color-reset"), "n_clicks"),
263
245
  ],
@@ -272,7 +254,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
272
254
  xcd: Union[dict, None],
273
255
  zcd: Union[dict, None],
274
256
  color_values: List[float],
275
- colorscale: List[float],
276
257
  _zoom_btn: Union[int, None],
277
258
  _reset_range_btn: Union[int, None],
278
259
  zfig: Union[dict, None],
@@ -311,7 +292,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
311
292
  else:
312
293
  store["color_min_value"] = color_values[0]
313
294
  store["color_max_value"] = color_values[1]
314
- store["colorscale"] = colorscale
315
295
  return json.dumps(store)
316
296
 
317
297
  @app.callback(
@@ -358,7 +338,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
358
338
  reverse_y=False,
359
339
  zmin=state["color_min_value"],
360
340
  zmax=state["color_max_value"],
361
- colorscale=state["colorscale"],
341
+ colorscale=self.colors,
362
342
  uirevision=state["uirevision"],
363
343
  )
364
344
  fig["layout"]["shapes"] = shapes
@@ -406,7 +386,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
406
386
  yaxis_title=self.zunit,
407
387
  zmin=state["color_min_value"],
408
388
  zmax=state["color_max_value"],
409
- colorscale=state["colorscale"],
389
+ colorscale=self.colors,
410
390
  uirevision=state["uirevision"],
411
391
  )
412
392
  fig["layout"]["shapes"] = shapes
@@ -451,7 +431,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
451
431
  yaxis_title=self.zunit,
452
432
  zmin=state["color_min_value"],
453
433
  zmax=state["color_max_value"],
454
- colorscale=state["colorscale"],
434
+ colorscale=self.colors,
455
435
  uirevision=state["uirevision"],
456
436
  )
457
437
  fig["layout"]["shapes"] = shapes
@@ -93,7 +93,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
93
93
  Path(gridfile).stem for gridfile in gridparameterfiles
94
94
  ]
95
95
  self.plotly_theme = webviz_settings.theme.plotly_theme
96
- self.initial_colors = (
96
+ self.colors = (
97
97
  colors
98
98
  if colors is not None
99
99
  else [
@@ -154,10 +154,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
154
154
  "id": self.ids("gridparameter"),
155
155
  "content": "The visualized grid parameter.",
156
156
  },
157
- {
158
- "id": self.ids("color-scale"),
159
- "content": ("Click this button to change colorscale"),
160
- },
161
157
  {
162
158
  "id": self.ids("color-values"),
163
159
  "content": ("Drag either node of slider to truncate color ranges"),
@@ -224,14 +220,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
224
220
  value=self.gridparafiles[0],
225
221
  clearable=False,
226
222
  ),
227
- wcc.Label(
228
- children="Set colorscale",
229
- ),
230
- wcc.ColorScales(
231
- id=self.ids("color-scale"),
232
- colorscale=self.initial_colors,
233
- nSwatches=12,
234
- ),
235
223
  wcc.RangeSlider(
236
224
  label="Set color range",
237
225
  id=self.ids("color-values"),
@@ -335,10 +323,9 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
335
323
  Input(self.ids("gridparameter"), "value"),
336
324
  Input(self.ids("surface"), "value"),
337
325
  Input(self.ids("color-values"), "value"),
338
- Input(self.ids("color-scale"), "colorscale"),
339
326
  ],
340
327
  )
341
- def _render_fence(coords, gridparameter, surfacepath, color_values, colorscale):
328
+ def _render_fence(coords, gridparameter, surfacepath, color_values):
342
329
  if not coords:
343
330
  raise PreventUpdate
344
331
  grid = load_grid(get_path(self.gridfile))
@@ -369,7 +356,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
369
356
  s_arr=s_arr,
370
357
  theme=self.plotly_theme,
371
358
  s_name=self.surfacenames[self.surfacefiles.index(surfacepath)],
372
- colorscale=colorscale,
359
+ colorscale=self.colors,
373
360
  xmin=hmin,
374
361
  xmax=hmax,
375
362
  ymin=vmin,
@@ -85,7 +85,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
85
85
  else:
86
86
  self.segynames = [Path(segyfile).stem for segyfile in segyfiles]
87
87
  self.plotly_theme = webviz_settings.theme.plotly_theme
88
- self.initial_colors = (
88
+ self.colors = (
89
89
  colors
90
90
  if colors is not None
91
91
  else [
@@ -148,10 +148,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
148
148
  "id": self.ids("cube"),
149
149
  "content": "The visualized cube.",
150
150
  },
151
- {
152
- "id": self.ids("color-scale"),
153
- "content": ("Click this button to change colorscale"),
154
- },
155
151
  {
156
152
  "id": self.ids("color-values"),
157
153
  "content": ("Drag either node of slider to truncate color ranges"),
@@ -216,14 +212,6 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
216
212
  value=self.segyfiles[0],
217
213
  clearable=False,
218
214
  ),
219
- wcc.Label(
220
- children="Set colorscale",
221
- ),
222
- wcc.ColorScales(
223
- id=self.ids("color-scale"),
224
- colorscale=self.initial_colors,
225
- nSwatches=12,
226
- ),
227
215
  wcc.RangeSlider(
228
216
  label="Set color range",
229
217
  id=self.ids("color-values"),
@@ -320,10 +308,9 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
320
308
  Input(self.ids("cube"), "value"),
321
309
  Input(self.ids("surface"), "value"),
322
310
  Input(self.ids("color-values"), "value"),
323
- Input(self.ids("color-scale"), "colorscale"),
324
311
  ],
325
312
  )
326
- def _render_fence(coords, cubepath, surfacepath, color_values, colorscale):
313
+ def _render_fence(coords, cubepath, surfacepath, color_values):
327
314
  if not coords:
328
315
  raise PreventUpdate
329
316
  cube = load_cube_data(get_path(cubepath))
@@ -337,7 +324,7 @@ e.g. [xtgeo](https://xtgeo.readthedocs.io/en/latest/).
337
324
  s_arr=s_arr,
338
325
  theme=self.plotly_theme,
339
326
  s_name=self.surfacenames[self.surfacefiles.index(surfacepath)],
340
- colorscale=colorscale,
327
+ colorscale=self.colors,
341
328
  xmin=hmin,
342
329
  xmax=hmax,
343
330
  ymin=vmin,
@@ -1,4 +1,4 @@
1
- from typing import Callable, Optional
1
+ from typing import Callable, List, Optional
2
2
 
3
3
  import numpy as np
4
4
  import pandas as pd
@@ -32,7 +32,7 @@ from ..views.distribution_main_layout import (
32
32
 
33
33
  # pylint: disable=too-many-statements
34
34
  def distribution_controllers(
35
- get_uuid: Callable, volumemodel: InplaceVolumesModel
35
+ get_uuid: Callable, volumemodel: InplaceVolumesModel, colors: List[str]
36
36
  ) -> None:
37
37
  @callback(
38
38
  Output({"id": get_uuid("main-voldist"), "page": "custom"}, "children"),
@@ -105,18 +105,18 @@ def distribution_controllers(
105
105
  nbins=selections["hist_bins"],
106
106
  facet_col=selections["Subplots"],
107
107
  color=selections["Color by"],
108
- color_discrete_sequence=selections["Colorscale"],
109
- color_continuous_scale=selections["Colorscale"],
110
- color_discrete_map=FLUID_COLORS
111
- if selections["Color by"] == "FLUID_ZONE"
112
- else None,
108
+ color_discrete_sequence=colors,
109
+ color_continuous_scale=colors,
110
+ color_discrete_map=(
111
+ FLUID_COLORS if selections["Color by"] == "FLUID_ZONE" else None
112
+ ),
113
113
  barmode=selections["barmode"],
114
114
  boxmode=selections["barmode"],
115
- text_auto=get_text_format_bar_plot(
116
- selected_data, selections, volumemodel
117
- )
118
- if selections["Plot type"] == "bar"
119
- else False,
115
+ text_auto=(
116
+ get_text_format_bar_plot(selected_data, selections, volumemodel)
117
+ if selections["Plot type"] == "bar"
118
+ else False
119
+ ),
120
120
  layout={
121
121
  "title": (
122
122
  {
@@ -151,18 +151,22 @@ def distribution_controllers(
151
151
 
152
152
  return custom_plotting_layout(
153
153
  figure=figure,
154
- tables=make_tables(
155
- dframe=dframe,
156
- responses=list({selections["X Response"], selections["Y Response"]}),
157
- groups=groups,
158
- volumemodel=volumemodel,
159
- page_selected=page_selected,
160
- selections=selections,
161
- table_type="Statistics table",
162
- view_height=37,
163
- )
164
- if selections["bottom_viz"] == "table"
165
- else None,
154
+ tables=(
155
+ make_tables(
156
+ dframe=dframe,
157
+ responses=list(
158
+ {selections["X Response"], selections["Y Response"]}
159
+ ),
160
+ groups=groups,
161
+ volumemodel=volumemodel,
162
+ page_selected=page_selected,
163
+ selections=selections,
164
+ table_type="Statistics table",
165
+ view_height=37,
166
+ )
167
+ if selections["bottom_viz"] == "table"
168
+ else None
169
+ ),
166
170
  )
167
171
 
168
172
  @callback(
@@ -233,7 +237,7 @@ def distribution_controllers(
233
237
  data_frame=dframe,
234
238
  values=selections["X Response"],
235
239
  names=selector,
236
- color_discrete_sequence=selections["Colorscale"],
240
+ color_discrete_sequence=colors,
237
241
  color=selector,
238
242
  )
239
243
  .update_traces(marker_line={"color": "#000000", "width": 1})
@@ -250,7 +254,7 @@ def distribution_controllers(
250
254
  title=f"{selections['X Response']} per {selector}",
251
255
  barmode="overlay" if selector == selections["Color by"] else "group",
252
256
  layout={"bargap": 0.05},
253
- color_discrete_sequence=selections["Colorscale"],
257
+ color_discrete_sequence=colors,
254
258
  color=selections["Color by"],
255
259
  xaxis={
256
260
  "type": "category",
@@ -263,9 +267,9 @@ def distribution_controllers(
263
267
  selections=selections,
264
268
  volumemodel=volumemodel,
265
269
  ),
266
- color_discrete_map=FLUID_COLORS
267
- if selections["Color by"] == "FLUID_ZONE"
268
- else None,
270
+ color_discrete_map=(
271
+ FLUID_COLORS if selections["Color by"] == "FLUID_ZONE" else None
272
+ ),
269
273
  ).update_layout(margin_t=35)
270
274
 
271
275
  if selections["X Response"] not in volumemodel.hc_responses:
@@ -21,10 +21,6 @@ def selections_controllers(
21
21
  {"id": get_uuid("filters"), "tab": ALL, "selector": ALL, "type": ALL},
22
22
  "value",
23
23
  ),
24
- Input(
25
- {"id": get_uuid("selections"), "tab": ALL, "settings": "Colorscale"},
26
- "colorscale",
27
- ),
28
24
  Input(get_uuid("initial-load-info"), "data"),
29
25
  State(get_uuid("page-selected"), "data"),
30
26
  State(get_uuid("tabs"), "value"),
@@ -37,7 +33,6 @@ def selections_controllers(
37
33
  def _update_selections(
38
34
  selectors: list,
39
35
  filters: list,
40
- colorscale: str,
41
36
  initial_load: dict,
42
37
  selected_page: str,
43
38
  selected_tab: str,
@@ -63,7 +58,6 @@ def selections_controllers(
63
58
  if id_value["tab"] == selected_tab
64
59
  }
65
60
 
66
- page_selections.update(Colorscale=colorscale[0] if colorscale else None)
67
61
  page_selections.update(ctx_clicked=ctx["prop_id"])
68
62
 
69
63
  # check if a page needs to be updated due to page refresh or
@@ -240,9 +234,9 @@ def selections_controllers(
240
234
 
241
235
  settings["bottom_viz"] = {
242
236
  "options": visualization_options,
243
- "value": "none"
244
- if selected_page != "custom"
245
- else selections.get("bottom_viz"),
237
+ "value": (
238
+ "none" if selected_page != "custom" else selections.get("bottom_viz")
239
+ ),
246
240
  }
247
241
 
248
242
  return tuple(
@@ -336,9 +330,11 @@ def selections_controllers(
336
330
  selector_is_multi = page_filter_settings[selector]["multi"]
337
331
  if not multi and selector_is_multi:
338
332
  values = [
339
- "rms_seed"
340
- if selector == "SENSNAME_CASE" and "rms_seed" in options
341
- else options[0]
333
+ (
334
+ "rms_seed"
335
+ if selector == "SENSNAME_CASE" and "rms_seed" in options
336
+ else options[0]
337
+ )
342
338
  ]
343
339
  elif multi and not selector_is_multi:
344
340
  values = options
@@ -3,7 +3,6 @@ from typing import Callable, Optional
3
3
  import pandas as pd
4
4
  import webviz_core_components as wcc
5
5
  from dash import dcc
6
- from webviz_config import WebvizConfigTheme
7
6
 
8
7
  from webviz_subsurface._models import InplaceVolumesModel
9
8
 
@@ -22,7 +21,6 @@ from .tornado_view import tornado_main_layout, tornado_selections_layout
22
21
  def main_view(
23
22
  get_uuid: Callable,
24
23
  volumemodel: InplaceVolumesModel,
25
- theme: WebvizConfigTheme,
26
24
  disjoint_set_df: Optional[pd.DataFrame] = None,
27
25
  ) -> dcc.Tabs:
28
26
  tabs = []
@@ -37,7 +35,6 @@ def main_view(
37
35
  uuid=get_uuid("selections"),
38
36
  tab="voldist",
39
37
  volumemodel=volumemodel,
40
- theme=theme,
41
38
  ),
42
39
  filter_layout(
43
40
  uuid=get_uuid("filters"), tab="voldist", volumemodel=volumemodel
@@ -2,7 +2,6 @@ from typing import List, Optional
2
2
 
3
3
  import webviz_core_components as wcc
4
4
  from dash import dcc, html
5
- from webviz_config import WebvizConfigTheme
6
5
 
7
6
  from webviz_subsurface._models import InplaceVolumesModel
8
7
 
@@ -10,7 +9,6 @@ from webviz_subsurface._models import InplaceVolumesModel
10
9
  def selections_layout(
11
10
  uuid: str,
12
11
  volumemodel: InplaceVolumesModel,
13
- theme: WebvizConfigTheme,
14
12
  tab: str,
15
13
  ) -> html.Div:
16
14
  selectors = "/".join(
@@ -33,7 +31,7 @@ def selections_layout(
33
31
  ],
34
32
  ),
35
33
  plot_selections_layout(uuid, volumemodel, tab),
36
- settings_layout(volumemodel, uuid, theme, tab),
34
+ settings_layout(volumemodel, uuid, tab),
37
35
  ]
38
36
  )
39
37
 
@@ -157,9 +155,8 @@ def plot_selector_dropdowns(
157
155
 
158
156
 
159
157
  def settings_layout(
160
- volumemodel: InplaceVolumesModel, uuid: str, theme: WebvizConfigTheme, tab: str
158
+ volumemodel: InplaceVolumesModel, uuid: str, tab: str
161
159
  ) -> wcc.Selectors:
162
- theme_colors = theme.plotly_theme.get("layout", {}).get("colorway", [])
163
160
  return wcc.Selectors(
164
161
  label="⚙️ SETTINGS",
165
162
  open_details=False,
@@ -168,13 +165,6 @@ def settings_layout(
168
165
  subplot_xaxis_range(uuid=uuid, tab=tab),
169
166
  histogram_options(uuid=uuid, tab=tab),
170
167
  bar_text_options(uuid=uuid, tab=tab),
171
- html.Span("Colors", style={"font-weight": "bold"}),
172
- wcc.ColorScales(
173
- id={"id": uuid, "tab": tab, "settings": "Colorscale"},
174
- colorscale=theme_colors,
175
- fixSwatches=True,
176
- nSwatches=12,
177
- ),
178
168
  ],
179
169
  )
180
170
 
@@ -94,6 +94,7 @@ Only relevant if `ensembles` is defined. The key (e.g. `geogrid`) will be used a
94
94
  * **`non_net_facies`:** List of facies which are non-net.
95
95
  * **`fipfile`:** Path to a yaml-file that defines a match between FIPNUM regions
96
96
  and human readable regions, zones and etc to be used as filters.
97
+ * **`colors`:** List of hex colors use.
97
98
  ---
98
99
 
99
100
  ?> The input files must follow FMU standards.
@@ -153,6 +154,7 @@ reek_test_data/aggregated_data/parameters.csv)
153
154
  non_net_facies: Optional[List[str]] = None,
154
155
  fipfile: Path = None,
155
156
  drop_failed_realizations: bool = True,
157
+ colors: List[str] = None,
156
158
  ):
157
159
  super().__init__()
158
160
  WEBVIZ_ASSETS.add(
@@ -169,7 +171,46 @@ reek_test_data/aggregated_data/parameters.csv)
169
171
  f" Plugin argument drop_failed_realizations is set to {drop_failed_realizations}. "
170
172
  "An 'OK' file in the realization runpath is used as success criteria"
171
173
  )
172
-
174
+ self.colors = (
175
+ colors
176
+ if colors is not None
177
+ else [
178
+ "#1F77B4",
179
+ "#FF7F0E",
180
+ "#2CA02C",
181
+ "#D62728",
182
+ "#9467BD",
183
+ "#8C564B",
184
+ "#E377C2",
185
+ "#7F7F7F",
186
+ "#BCBD22",
187
+ "#17BECF",
188
+ "#FD3216",
189
+ "#00FE35",
190
+ "#6A76FC",
191
+ "#FED4C4",
192
+ "#FE00CE",
193
+ "#0DF9FF",
194
+ "#F6F926",
195
+ "#FF9616",
196
+ "#479B55",
197
+ "#EEA6FB",
198
+ "#DC587D",
199
+ "#D626FF",
200
+ "#6E899C",
201
+ "#00B5F7",
202
+ "#B68E00",
203
+ "#C9FBE5",
204
+ "#FF0092",
205
+ "#22FFA7",
206
+ "#E3EE9E",
207
+ "#86CE00",
208
+ "#BC7196",
209
+ "#7E7DCD",
210
+ "#FC6955",
211
+ "#E48F72",
212
+ ]
213
+ )
173
214
  if csvfile_vol:
174
215
  table_provider = EnsembleTableProviderFactory.instance()
175
216
  volumes_table = table_provider.create_from_ensemble_csv_file(csvfile_vol)
@@ -221,7 +262,6 @@ reek_test_data/aggregated_data/parameters.csv)
221
262
  main_view(
222
263
  get_uuid=self.uuid,
223
264
  volumemodel=self.volmodel,
224
- theme=self.theme,
225
265
  disjoint_set_df=self.disjoint_set_df,
226
266
  ),
227
267
  ],
@@ -229,7 +269,9 @@ reek_test_data/aggregated_data/parameters.csv)
229
269
 
230
270
  def set_callbacks(self) -> None:
231
271
  selections_controllers(get_uuid=self.uuid, volumemodel=self.volmodel)
232
- distribution_controllers(get_uuid=self.uuid, volumemodel=self.volmodel)
272
+ distribution_controllers(
273
+ get_uuid=self.uuid, volumemodel=self.volmodel, colors=self.colors
274
+ )
233
275
  tornado_controllers(
234
276
  get_uuid=self.uuid, volumemodel=self.volmodel, theme=self.theme
235
277
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: webviz-subsurface
3
- Version: 0.2.33
3
+ Version: 0.2.34
4
4
  Summary: Webviz config plugins for subsurface data
5
5
  Home-page: https://github.com/equinor/webviz-subsurface
6
6
  Author: R&T Equinor
@@ -132,7 +132,7 @@ webviz_subsurface/_models/ensemble_set_model.py,sha256=elS5eLpktTJeeSU_44hL9SBHu
132
132
  webviz_subsurface/_models/gruptree_model.py,sha256=TkPBTre3Srs7n2SJSVGbj6oWAUEaJJ811XTxCIcHjPQ,8369
133
133
  webviz_subsurface/_models/inplace_volumes_model.py,sha256=AxVJzEeYgDgKfbP6ePpxqwX9I1ybVpho9PSzpzfWzEY,15877
134
134
  webviz_subsurface/_models/observation_model.py,sha256=Z9wO6KfO6FcJ99x8kq1Y2m_2bCsAiWexYjhVoJkqxAY,1629
135
- webviz_subsurface/_models/parameter_model.py,sha256=kCtpQxgGi3FJAZb-nwcAj_lStt7ySHmOJy6LMSN7_4o,7206
135
+ webviz_subsurface/_models/parameter_model.py,sha256=IZOQvEM0zjzFQUsW0MzYfbo8kRVqZNJxzbe_uDW-GJE,7284
136
136
  webviz_subsurface/_models/stratigraphy_model.py,sha256=Izvnp8pPGYlkKnRzAD6IokkAsaNyJCTrCXZdtKTf9QA,2931
137
137
  webviz_subsurface/_models/surface_leaflet_model.py,sha256=y9KL1l9JYS84G6XdmtRvG980MIDSfBFnVPvpd8Oki68,4051
138
138
  webviz_subsurface/_models/surface_set_model.py,sha256=NiLRsoMRsvMXody9BIpEK6_J4Q-Oc_w2mFfsguLQl2Q,10343
@@ -153,7 +153,7 @@ webviz_subsurface/_providers/ensemble_grid_provider/_roff_file_discovery.py,sha2
153
153
  webviz_subsurface/_providers/ensemble_grid_provider/_xtgeo_to_vtk_explicit_structured_grid.py,sha256=AYKH-ehLo7yV4BhQSRw8htTLtqJyzyAcBENMDgtK1VI,2904
154
154
  webviz_subsurface/_providers/ensemble_grid_provider/ensemble_grid_provider.py,sha256=_qDB8kWL8cG6F6SFtKNvGTljH1uT3CZ778oME8cAzPA,1413
155
155
  webviz_subsurface/_providers/ensemble_grid_provider/ensemble_grid_provider_factory.py,sha256=p8gdcUfBCIj7RcvewzHJ2GeYammy6WV8J6sxXxCoY5s,6507
156
- webviz_subsurface/_providers/ensemble_grid_provider/grid_viz_service.py,sha256=HPxUe6rk2kyawQziU23TaR35it7dyB1bIpFEgLbEkXA,27689
156
+ webviz_subsurface/_providers/ensemble_grid_provider/grid_viz_service.py,sha256=RfBhkHzYVdCZE44QRk0hQLcOvJV_EZ9iYssgMYiPDt0,27711
157
157
  webviz_subsurface/_providers/ensemble_grid_provider/provider_impl_egrid.py,sha256=Pc9bIW49DCTz8nbz0ujwk7vjA_9Y6lVqp3etidPIk9k,6446
158
158
  webviz_subsurface/_providers/ensemble_grid_provider/provider_impl_roff.py,sha256=FUsBpUroAHAPuKZ-sB1aAFwy4An4QDPYyGQ7WDzvCN0,12509
159
159
  webviz_subsurface/_providers/ensemble_summary_provider/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -206,7 +206,7 @@ webviz_subsurface/_utils/ensemble_table_provider_set_factory.py,sha256=D3iqRcZ9-
206
206
  webviz_subsurface/_utils/enum_shim.py,sha256=W_ytZMrzRZzCfsz3UBORg-ue6-FXe0mhThHBLay-VnM,236
207
207
  webviz_subsurface/_utils/fanchart_plotting.py,sha256=NCqYV7T8HnpIq9ZAv9vkHwawzGQXa5nVrL5TTwgF3Y4,8646
208
208
  webviz_subsurface/_utils/formatting.py,sha256=SfYNqrJ914NwUhDHaZbtCcP5XUOzw576r9jBw4stpUo,1391
209
- webviz_subsurface/_utils/parameter_response.py,sha256=HQoIXPh3vvJsVaZZ_s0IWqx9_f-WzNkFFtlZaG1cWxw,3778
209
+ webviz_subsurface/_utils/parameter_response.py,sha256=ZTPWa-cx7-rrKSYhnDcgbpWRiRHCZeJWhlpOyQOqCpQ,3819
210
210
  webviz_subsurface/_utils/perf_timer.py,sha256=4QNz69Anz2h2mKorzEOMwk0VCLM8k6L1Yh5PbY_KT8s,794
211
211
  webviz_subsurface/_utils/simulation_timeseries.py,sha256=FmqHEjtMVkdKQcgZfJuLyF7I9B5ymGC1fU8ZC8eIHXQ,12342
212
212
  webviz_subsurface/_utils/statistics_plotting.py,sha256=jrA34gQpDxmQYr7wz5YEHL-kvymJLo_I7bA1U4ZVpZE,8115
@@ -230,12 +230,12 @@ webviz_subsurface/plugins/_reservoir_simulation_timeseries.py,sha256=reG1FVTDhig
230
230
  webviz_subsurface/plugins/_reservoir_simulation_timeseries_onebyone.py,sha256=6OrJe2lNOvwqnWhlZoHYADiOwp75IBKGt3YG1br5Z8U,27474
231
231
  webviz_subsurface/plugins/_reservoir_simulation_timeseries_regional.py,sha256=p4nsaD3M9Q7Erqn31TNYkZIsChmOETX2essnqZmidOU,54595
232
232
  webviz_subsurface/plugins/_running_time_analysis_fmu.py,sha256=AgJIw7FpUy0e7n9P84W93WHrHbwakX8dyKR20ESClwk,26296
233
- webviz_subsurface/plugins/_segy_viewer.py,sha256=KfvACkuvAmf1zk-HFEUCZ7_N_-tQxli4AGx28z-_0Aw,20596
233
+ webviz_subsurface/plugins/_segy_viewer.py,sha256=WGjrGWF_BynMMQo7bebYbgWWUa4DuHCTJ4yDHpwGFHg,19784
234
234
  webviz_subsurface/plugins/_seismic_misfit.py,sha256=97INdJs0V6i2h-bTukWRxxliF-OlTzELoh99QSimO2w,146813
235
235
  webviz_subsurface/plugins/_subsurface_map.py,sha256=8Ca-RgpvX3qpQ6Q0U3bZTPjLpgHxc8lBeP_-qLqXR6w,7550
236
236
  webviz_subsurface/plugins/_surface_viewer_fmu.py,sha256=DONtMEesp8LOWUjZxrgamORaVUYNwILX4p2kS4K07FQ,31232
237
- webviz_subsurface/plugins/_surface_with_grid_cross_section.py,sha256=jww-MCXNLqRJQhfxFftkUvy6B32HAFUAGhWpPKbx934,18836
238
- webviz_subsurface/plugins/_surface_with_seismic_cross_section.py,sha256=WRlDcFhmTpghssSBGirJ36F6ak6JlJ8mEdjoqco9xVA,16901
237
+ webviz_subsurface/plugins/_surface_with_grid_cross_section.py,sha256=xDSVh9Sj_SdiluCDK5uOE5XJrUVsYwB7fI3efbqY274,18201
238
+ webviz_subsurface/plugins/_surface_with_seismic_cross_section.py,sha256=RoPI6vZj1TsDDXwGYhIDF-QDjUxDgdw1_AJWXe8s-4U,16266
239
239
  webviz_subsurface/plugins/_well_cross_section.py,sha256=Qw2g5Q0teA37_VWqttLrWzokZdkF65snkwMBI8hNnCE,13243
240
240
  webviz_subsurface/plugins/_well_cross_section_fmu.py,sha256=1ERqGOSgB2bNB33QN2pMqSUbgmDLeOpRgX8fKYuAb1U,26762
241
241
  webviz_subsurface/plugins/_bhp_qc/__init__.py,sha256=q3RaYNycC0D2liZiRzaAVvCqkSsNfJ5OmfEAA1VSy4Y,62
@@ -307,13 +307,13 @@ webviz_subsurface/plugins/_line_plotter_fmu/views/plot_options_view.py,sha256=kj
307
307
  webviz_subsurface/plugins/_line_plotter_fmu/views/plot_traces_view.py,sha256=2BOwf5-tffKQ9ACyuu43WtIPR4UvUgKAVHp_6S9V6Y8,1732
308
308
  webviz_subsurface/plugins/_map_viewer_fmu/__init__.py,sha256=zoxtQJ4PZ-Xd2QI1J8jB_Q9T6gG6A00R34inI92idEI,41
309
309
  webviz_subsurface/plugins/_map_viewer_fmu/_layer_model.py,sha256=EK--Jwoit8_r_syTs1iWWM3O8-F1gQpNveWwPH6q20Q,3352
310
- webviz_subsurface/plugins/_map_viewer_fmu/_tmp_well_pick_provider.py,sha256=AGdlmpZttIMQt7w3PhcegXBIja_qLW0i1kKACzlOb0k,2463
311
- webviz_subsurface/plugins/_map_viewer_fmu/_types.py,sha256=X1N4OV0a3gjMI69SwFCvXM7KFf1DCsDxyRV4DVv-3dA,817
312
- webviz_subsurface/plugins/_map_viewer_fmu/_utils.py,sha256=ZDbndUby_5XSp9UHhmhYKkg6Z8ZTlQPuQJWJQBcWSQ0,1274
313
- webviz_subsurface/plugins/_map_viewer_fmu/callbacks.py,sha256=6ZiFK2i6QxZ-e7C_FFHFwRDsJmxNk7dQruO39Np3-cM,43399
310
+ webviz_subsurface/plugins/_map_viewer_fmu/_tmp_well_pick_provider.py,sha256=7hhFtEPHHx3WhhltTrbewfh-UsSRuQcJO5_vABJHvVk,2665
311
+ webviz_subsurface/plugins/_map_viewer_fmu/_types.py,sha256=RmFjdfVKBdNinz523Mn6D10RlI1GxS64LS-uNaLtKp8,852
312
+ webviz_subsurface/plugins/_map_viewer_fmu/_utils.py,sha256=-tDOg_aK2nKUj7ArilD2cUFoKHpU18BtVZXTzw_NQ-4,1827
313
+ webviz_subsurface/plugins/_map_viewer_fmu/callbacks.py,sha256=I__IVhAZjzyQ7nk3QALp1sHoaj3eplfVVqa5vl2M0sk,44581
314
314
  webviz_subsurface/plugins/_map_viewer_fmu/color_tables.py,sha256=FaORW2BFvEud9o4exvoo5ta-AFQ4DZo4Rl1dWQ6oT5s,319690
315
- webviz_subsurface/plugins/_map_viewer_fmu/layout.py,sha256=ynTfUPEmppJhstn8v5uIE-RZ68OGIOrtDO5-q38_ISc,27724
316
- webviz_subsurface/plugins/_map_viewer_fmu/map_viewer_fmu.py,sha256=3HiJxVn8jRJg6qzBi7UwshEq130Vz5IVfX_xVUSqOlU,8885
315
+ webviz_subsurface/plugins/_map_viewer_fmu/layout.py,sha256=P9IgpDIuXyPrXUthZu4haQDVwREJ5AtvrZ6dkeDbEcI,28184
316
+ webviz_subsurface/plugins/_map_viewer_fmu/map_viewer_fmu.py,sha256=SDJJoOOMgvbrQJmvqL8KpidXmmaWqfp6ECOlO-8d0XQ,10412
317
317
  webviz_subsurface/plugins/_parameter_analysis/__init__.py,sha256=YIsJxDje9XN0Qyzk7wVrZ5GIfdqnwUnnbxAh1iHvoko,39
318
318
  webviz_subsurface/plugins/_parameter_analysis/_plugin.py,sha256=zoXVsOcHIBR4sR5nu5lSf6iQXcRSh_ciY4eM30-rbyk,5593
319
319
  webviz_subsurface/plugins/_parameter_analysis/_types.py,sha256=at_5vL34UHclHNFSxkqO694e35do87a_br_rpt9iud0,407
@@ -550,14 +550,14 @@ webviz_subsurface/plugins/_vfp_analysis/_views/_vfp_view/_view_elements/__init__
550
550
  webviz_subsurface/plugins/_vfp_analysis/_views/_vfp_view/_view_elements/_vfp_graph.py,sha256=arkgdQCjJE5o_R85MhI6qGp_LMSGLlPItViDk5trVe0,488
551
551
  webviz_subsurface/plugins/_volumetric_analysis/__init__.py,sha256=NER08MsM_rghINQ5ca6lXtaYFQwf2Yh7VBRGE5v9Ar8,52
552
552
  webviz_subsurface/plugins/_volumetric_analysis/volume_validator_and_combinator.py,sha256=wPSKWzsOAKFVDuIdxAQ6X-t9n2mnsWma6MRVUb5702A,9844
553
- webviz_subsurface/plugins/_volumetric_analysis/volumetric_analysis.py,sha256=-fe0DuCJLhXxLBI9yShFpBLGv0ojo8JuYogC-JVxYPI,10203
553
+ webviz_subsurface/plugins/_volumetric_analysis/volumetric_analysis.py,sha256=qb--YOyq9rnXWC66EgxASoJG3h1wFbdPn1W5qU1snyY,11318
554
554
  webviz_subsurface/plugins/_volumetric_analysis/controllers/__init__.py,sha256=KNX_8-dZ8o5cFMpgdub33Rp5GuDMmoxSup_gpV_uvW0,403
555
555
  webviz_subsurface/plugins/_volumetric_analysis/controllers/comparison_controllers.py,sha256=RBdV_NiuMYKdx5YBrhHyWFV24cjzHX3pqrSq4tY-fmw,20441
556
- webviz_subsurface/plugins/_volumetric_analysis/controllers/distribution_controllers.py,sha256=RkmKte-m8cHlWRspwMJcmwEDq1XF56sXnrOpy_sZ7Bc,18108
556
+ webviz_subsurface/plugins/_volumetric_analysis/controllers/distribution_controllers.py,sha256=AjL6Pt2nPAw87Lbt5NtHb3jeTczQKmwzL-Tp7qhNDxQ,18209
557
557
  webviz_subsurface/plugins/_volumetric_analysis/controllers/export_data_controllers.py,sha256=h2OSlciXmtQkP-DjUz4_HQv7h3MSAJdjjuQrMXDiOe4,1550
558
558
  webviz_subsurface/plugins/_volumetric_analysis/controllers/fipfile_qc_controller.py,sha256=ZB-ZytZuesc49a2pUdg-1qIlEIOH7rUuQV5Zq-EiQGc,4068
559
559
  webviz_subsurface/plugins/_volumetric_analysis/controllers/layout_controllers.py,sha256=TBssGK-rJMKW9h5Uy5-53FA8E22sakiLAQLoyWGlGFw,4142
560
- webviz_subsurface/plugins/_volumetric_analysis/controllers/selections_controllers.py,sha256=u0OxZgfgLxApxd9tdJU3cSQnN3s302_imwBuUSPwdio,23065
560
+ webviz_subsurface/plugins/_volumetric_analysis/controllers/selections_controllers.py,sha256=WKYJ2YC2pvj9qYkthtBjmiR-waYCPhFZ9MTgU-k_Gug,22889
561
561
  webviz_subsurface/plugins/_volumetric_analysis/controllers/tornado_controllers.py,sha256=Zu5L1LPff3uMkirllZ5twhfCqpY2NzK0wuoH656Wlfg,13986
562
562
  webviz_subsurface/plugins/_volumetric_analysis/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
563
563
  webviz_subsurface/plugins/_volumetric_analysis/utils/table_and_figure_utils.py,sha256=RU35NlxBOMd176RfoNFCAfDu3pWS4Z_bxK15pP_lTuY,11947
@@ -568,8 +568,8 @@ webviz_subsurface/plugins/_volumetric_analysis/views/comparison_layout.py,sha256
568
568
  webviz_subsurface/plugins/_volumetric_analysis/views/distribution_main_layout.py,sha256=YwMpGei23r6PpLR-7NDuwcWFcmoSxG7BkS02RQLIRmM,2656
569
569
  webviz_subsurface/plugins/_volumetric_analysis/views/filter_view.py,sha256=4DaL6O_7rZDRjP_Qhdwq3p96E7xWuMQAOPo8XbpfUHk,5308
570
570
  webviz_subsurface/plugins/_volumetric_analysis/views/fipfile_qc_layout.py,sha256=IRvdSuxvfA44A42G2Z6FgJEk68MBO63ODg-K6L0aqPs,2354
571
- webviz_subsurface/plugins/_volumetric_analysis/views/main_view.py,sha256=M3CXFN3AMS042kqm4ecvovKQGgw8jxki33E9WWMqSao,6686
572
- webviz_subsurface/plugins/_volumetric_analysis/views/selections_view.py,sha256=U2CkCFwLHfhbF5tIpBwmSSDoKIjKiHwA-1ppDOpEH2E,10504
571
+ webviz_subsurface/plugins/_volumetric_analysis/views/main_view.py,sha256=BDkE9XyW1RtmrNXHXckDn8q_1gtZ_emfKK8R_iO8Mkc,6575
572
+ webviz_subsurface/plugins/_volumetric_analysis/views/selections_view.py,sha256=l0Zn8YMlv6Vbpgj_0IaKYlvPmF0XI8xz5eNsLqAvTo8,10037
573
573
  webviz_subsurface/plugins/_volumetric_analysis/views/tornado_view.py,sha256=NQU7PzgySlg7fAsRC1VJVVwqnPMbgOezefaUjjrsC8E,7527
574
574
  webviz_subsurface/plugins/_well_analysis/__init__.py,sha256=wQqkwwvnR67eqYh4Jnejkwb5UOXNNKCe8_3HFZwafOo,34
575
575
  webviz_subsurface/plugins/_well_analysis/_plugin.py,sha256=NIGcrnetDloLT0S3p8nt4OPFUS6x8EUVlJxrQ8huqHY,7010
@@ -614,10 +614,10 @@ webviz_subsurface/plugins/_well_log_viewer/controllers/_well_controller.py,sha25
614
614
  webviz_subsurface/plugins/_well_log_viewer/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
615
615
  webviz_subsurface/plugins/_well_log_viewer/utils/default_color_tables.py,sha256=0UgrvygPGEAuC15vn73NCXJUQLt9Dpn5QZqqq1IJkfw,4872
616
616
  webviz_subsurface/plugins/_well_log_viewer/utils/xtgeo_well_log_to_json.py,sha256=T44-vFwvvjyo376yoL1QWDc98exG8N1cLTEzrGp-I7A,1608
617
- webviz_subsurface-0.2.33.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
618
- webviz_subsurface-0.2.33.dist-info/LICENSE.chromedriver,sha256=H5UWVvf6Y7Ul6i35mriz7071dWR01cR9G-5ypnZHnpM,326542
619
- webviz_subsurface-0.2.33.dist-info/METADATA,sha256=SwYE9yRPI-PkzaMUTAZUWvhpUquv9WvVSyHgFHN5KO0,6387
620
- webviz_subsurface-0.2.33.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
621
- webviz_subsurface-0.2.33.dist-info/entry_points.txt,sha256=aprJRZQ2dW0An59soobTCaWzw6nEtiZBGncBhWA_C5Y,4129
622
- webviz_subsurface-0.2.33.dist-info/top_level.txt,sha256=NobeVsNfPINQgUSc9hlW3aqYHO5A0SNlhacg-2YDcf4,24
623
- webviz_subsurface-0.2.33.dist-info/RECORD,,
617
+ webviz_subsurface-0.2.34.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
618
+ webviz_subsurface-0.2.34.dist-info/LICENSE.chromedriver,sha256=H5UWVvf6Y7Ul6i35mriz7071dWR01cR9G-5ypnZHnpM,326542
619
+ webviz_subsurface-0.2.34.dist-info/METADATA,sha256=a9zJbOM0oiY158ifjHuaM5NFST_DU4s5k5HUbVa8wIw,6387
620
+ webviz_subsurface-0.2.34.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
621
+ webviz_subsurface-0.2.34.dist-info/entry_points.txt,sha256=aprJRZQ2dW0An59soobTCaWzw6nEtiZBGncBhWA_C5Y,4129
622
+ webviz_subsurface-0.2.34.dist-info/top_level.txt,sha256=NobeVsNfPINQgUSc9hlW3aqYHO5A0SNlhacg-2YDcf4,24
623
+ webviz_subsurface-0.2.34.dist-info/RECORD,,