Skip to content

Commit ec4e015

Browse files
committed
Utilize raster_plot instead of id_map and property_map
1 parent 9b40129 commit ec4e015

1 file changed

Lines changed: 54 additions & 24 deletions

File tree

openmc_plotter/plotmodel.py

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,23 @@ class PlotWorker(QObject):
123123
def generate_maps(self, work_item: PlotWorkItem):
124124
try:
125125
params = work_item.view_params
126-
view_param = ViewParam(params["origin"], params["width"],
127-
params["height"], params["h_res"])
128-
view_param.h_res = params["h_res"]
129-
view_param.v_res = params["v_res"]
130-
view_param.basis = params["basis"]
131-
view_param.level = params["level"]
132-
view_param.color_overlaps = params["color_overlaps"]
133-
ids_map = openmc.lib.id_map(view_param)
134-
properties = openmc.lib.property_map(view_param)
126+
127+
# Determine if we need filter bins for MeshMaterialFilter tally
128+
filter_cpp = None
129+
if params.get("filter_id") is not None:
130+
filter_cpp = openmc.lib.filters[params["filter_id"]]
131+
132+
# Single call replaces id_map + property_map + get_plot_bins
133+
ids_map, properties = openmc.lib.raster_plot(
134+
origin=params["origin"],
135+
width=(params["width"], params["height"]),
136+
basis=params["basis"],
137+
pixels=(params["h_res"], params["v_res"]),
138+
color_overlaps=params["color_overlaps"],
139+
level=params["level"],
140+
filter=filter_cpp,
141+
)
142+
135143
self.finished.emit(work_item.view_params, ids_map, properties)
136144
except Exception as exc:
137145
self.error.emit(str(exc))
@@ -474,8 +482,22 @@ def view_params_payload(self, view: "PlotView"):
474482
"basis": str(vp.basis),
475483
"level": int(vp.level),
476484
"color_overlaps": bool(vp.color_overlaps),
485+
"filter_id": self.get_active_mesh_material_filter_id(view),
477486
}
478487

488+
def get_active_mesh_material_filter_id(self, view: "PlotView") -> Optional[int]:
489+
"""Return the filter ID if displaying a MeshMaterialFilter tally, else None."""
490+
if self._statepoint is None:
491+
return None
492+
if not view.tallyDataVisible or view.selectedTally is None:
493+
return None
494+
495+
tally = self._statepoint.tallies[view.selectedTally]
496+
if tally.contains_filter(openmc.MeshMaterialFilter):
497+
filter = tally.find_filter(openmc.MeshMaterialFilter)
498+
return filter.id
499+
return None
500+
479501
def can_reuse_maps(self, view: "PlotView"):
480502
if self.ids_map is None or self.properties is None:
481503
return False
@@ -496,8 +518,21 @@ def makePlot(self, view: Optional["PlotView"] = None,
496518
if ids_map is None or properties is None:
497519
if (self.currentView.view_params != view.view_params) or \
498520
(self.ids_map is None) or (self.properties is None):
499-
self.ids_map = openmc.lib.id_map(view.view_params)
500-
self.properties = openmc.lib.property_map(view.view_params)
521+
# Determine if we need filter bins for MeshMaterialFilter tally
522+
filter_cpp = None
523+
filter_id = self.get_active_mesh_material_filter_id(view)
524+
if filter_id is not None:
525+
filter_cpp = openmc.lib.filters[filter_id]
526+
527+
self.ids_map, self.properties = openmc.lib.raster_plot(
528+
origin=view.origin,
529+
width=(view.width, view.height),
530+
basis=view.basis,
531+
pixels=(view.h_res, view.v_res),
532+
color_overlaps=view.color_overlaps,
533+
level=view.level,
534+
filter=filter_cpp,
535+
)
501536
self.map_view_params = self.view_params_payload(view)
502537
else:
503538
self.ids_map = ids_map
@@ -1008,19 +1043,14 @@ def _do_op(array, tally_value, ax=0):
10081043
selected_scores.append(idx)
10091044
data = _do_op(data[np.array(selected_scores)], tally_value)
10101045

1011-
# Get mesh bins from openmc.lib
1012-
filter = tally.find_filter(filter_class)
1013-
filter_cpp = openmc.lib.filters[filter.id]
1014-
1015-
if view is None:
1016-
view = self.currentView
1017-
1018-
bins = filter_cpp.get_plot_bins(
1019-
origin=view.origin,
1020-
width=(view.width, view.height),
1021-
basis=view.basis,
1022-
pixels=(view.h_res, view.v_res),
1023-
)
1046+
# Extract filter bins from ids_map (computed during raster_plot call)
1047+
# ids_map has shape (v_res, h_res, 4) when filter was included
1048+
if self.ids_map.shape[2] < 4:
1049+
raise RuntimeError(
1050+
"Filter bins not available. Ensure raster_plot was called with "
1051+
"the appropriate filter for MeshMaterialFilter tallies."
1052+
)
1053+
bins = self.ids_map[:, :, 3]
10241054

10251055
# set image data
10261056
image_data = np.full_like(self.ids, np.nan, dtype=float)

0 commit comments

Comments
 (0)