Skip to content

Commit

Permalink
Simplify somehow the plotting of the Map
Browse files Browse the repository at this point in the history
  • Loading branch information
kif committed Jan 27, 2025
1 parent 6352446 commit e1ba7b1
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 43 deletions.
36 changes: 10 additions & 26 deletions src/pyFAI/gui/pilx/MainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,32 +128,21 @@ def initData(self,

with h5py.File(self._file_name, "r") as h5file:
nxprocess = h5file[self._nxprocess_path]
map = get_dataset(nxprocess, "result/intensity")[()].sum(axis=-1)
map_data = get_dataset(nxprocess, "result/intensity")[()].sum(axis=-1)
try:
slow = get_dataset(nxprocess, "result/slow")
except Exception:
Ylabel = "Y"
Yvalues = list(range(map.shape[0]))
# origin = 0
# Yscale = 1
slow_label = slow_values = None
else:
Ylabel = slow.attrs.get("long_name", "Y")
Yvalues = slow[()]
# Yorigin = Yvalues[0]
# Yscale = (Yvalues[-1]-Yvalues[0])/Yvalues.size

slow_label = slow.attrs.get("long_name", "Y")
slow_values = slow[()]
try:
fast = get_dataset(nxprocess, "result/fast")
except Exception:
Xlabel = "X"
Xvalues = list(range(map.shape[1]))
# Xorigin = 0
# Xscale = 1
fast_values = fast_label = None
else:
Xlabel = fast.attrs.get("long_name", "X")
Xvalues = fast[()]
# Xorigin = Xvalues[0]
# Xscale = (Xvalues[-1]-Xvalues[0])/Xvalues.size
fast_label = fast.attrs.get("long_name", "X")
fast_values = fast[()]

pyFAI_config_as_str = get_dataset(
parent=nxprocess,
Expand All @@ -163,7 +152,7 @@ def initData(self,

radial_dset = get_radial_dataset(
h5file, nxdata_path=f"{self._nxprocess_path}/result",
size = self.worker_config.nbpt_rad
size=self.worker_config.nbpt_rad
)
delta_radial = (radial_dset[-1] - radial_dset[0]) / len(radial_dset)

Expand Down Expand Up @@ -211,8 +200,7 @@ def initData(self,
self._delta_radial_over_2 = delta_radial / 2

self._title_widget.setText(os.path.basename(file_name))
self._map_plot_widget.setScatterData(map)
self._map_plot_widget.setAxes(Xlabel, Xvalues, Ylabel, Yvalues)
self._map_plot_widget.setScatterData(map_data, fast_values, slow_values, fast_label, slow_label)
# BUG: selectMapPoint(0, 0) does not work at first render cause the picking fails
initial_indices = ImageIndices(0, 0)
self._unfixed_indices = initial_indices
Expand Down Expand Up @@ -414,11 +402,7 @@ def displayAverageMap(self, v_min: float, v_max: float):
fast_values = fast[()]
slow_name = slow.attrs.get("long_name", "Y")
slow_values = slow[()]
self._map_plot_widget.setScatterData(map_data)
self._map_plot_widget.setAxes(fast_name,
fast_values,
slow_name,
slow_values)
self._map_plot_widget.setScatterData(map_data, fast_values, slow_values, fast_name, slow_name)

def onMouseClickOnImage(self, x: float, y: float):
indices = self._image_plot_widget.getImageIndices(x, y)
Expand Down
52 changes: 35 additions & 17 deletions src/pyFAI/gui/pilx/widgets/MapPlotWidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@
__date__ = "27/01/2025"
__status__ = "development"



from typing import Optional
import numpy
import os.path
import h5py
Expand Down Expand Up @@ -129,8 +128,8 @@ def setAxes(self, Xname, Xvalues, Yname, Yvalues):
z = self._scatter_item.getValueData(copy=False)
Xvalues = numpy.atleast_1d(Xvalues)
Yvalues = numpy.atleast_1d(Yvalues)
assert z.size == Xvalues.size*Yvalues.size
x = numpy.outer(numpy.ones(Yvalues.size),Xvalues).ravel()
assert z.size == Xvalues.size * Yvalues.size
x = numpy.outer(numpy.ones(Yvalues.size), Xvalues).ravel()
y = numpy.outer(Yvalues, numpy.ones(Xvalues.size)).ravel()
self._scatter_item.setData(x, y, z)
self.resetZoom()
Expand Down Expand Up @@ -162,30 +161,49 @@ def changeAxes(self, axis_data_url: DataUrl):
def clearPoints(self):
self.clearPointsSignal.emit()

def setScatterData(self, image: numpy.ndarray):
def setScatterData(self,
image: numpy.ndarray,
x: Optional[numpy.ndarray]=None,
y: Optional[numpy.ndarray]=None,
xlabel: Optional[str]="X",
ylabel: Optional[str]="Y"):
self.setGraphXLabel(xlabel)
self.setGraphYLabel(ylabel)

z = image.flatten()
rows, cols = image.shape[:2]
if x and y:
assert x.size == cols
assert y.size == rows

if self._first_plot:
rows, cols = image.shape[:2]
x = numpy.tile(numpy.arange(0, cols), (rows))
y = numpy.tile(numpy.arange(0, rows), (cols, 1)).T.flatten()
self._scatter_item.setData(x, y, z)
self.setDataMargins(0.5 / cols, 0.5 / cols, 0.5 / rows, 0.5 / rows)
if not(x and y):
x = numpy.arange(cols)
y = numpy.arange(rows)
x2 = numpy.outer(numpy.ones(rows), x).ravel()
y2 = numpy.outer(y, numpy.ones(cols)).ravel()

self._scatter_item.setData(x2, y2, z)
dx = 0.5 * ((x[1:] - x[:-1]).mean()) / cols
dy = 0.5 * ((y[1:] - y[:-1]).mean()) / rows
self.setDataMargins(dx, dx, dy, dy)
self.resetZoom()
self._first_plot = False
return

x = self._scatter_item.getXData(copy=False)
y = self._scatter_item.getYData(copy=False)

self._scatter_item.setData(x, y, z)
else:
if (x and y):
x2 = numpy.outer(numpy.ones(rows), x).ravel()
y2 = numpy.outer(y, numpy.ones(cols)).ravel()
else:
x2 = self._scatter_item.getXData(copy=False)
y2 = self._scatter_item.getYData(copy=False)
self._scatter_item.setData(x2, y2, z)

def getImageIndices(self, x_data: float, y_data: float) -> ImageIndices | None:
pixels = self.dataToPixel(x_data, y_data)
if pixels is None:
return

pixel_x, pixel_y = pixels
pixel_x, pixel_y = pixels
# Use the base class `pick` to retrieve row and col indices instead of the scatter index
picking_result = super(Scatter, self._scatter_item).pick(pixel_x, pixel_y)
if picking_result is None:
Expand Down

0 comments on commit e1ba7b1

Please sign in to comment.