Interactive masking#
In this example, we will use a custom drawing tool to draw rectangles on a 2D figure. The data inside the rectangles will be masked.
[1]:
%matplotlib widget
import plopp as pp
import scipp as sc
We first generate some data that contains three bands of peaks that all have different spreads.
[2]:
from plopp.data.examples import three_bands
da = three_bands()
We then construct our custom tool, using Mpltoolbox’s Rectangles tool, and inheriting from Plopp’s DrawingTool.
[3]:
from plopp.widgets.drawing import DrawingTool
from functools import partial
from mpltoolbox import Rectangles
def define_mask(da, rect_info):
"""
Function that creates a mask inside the area
covered by the rectangle.
"""
x = rect_info['x']
y = rect_info['y']
b = min(y['bottom'], y['top'])
t = max(y['bottom'], y['top'])
l = min(x['left'], x['right'])
r = max(x['left'], x['right'])
xcoord = sc.midpoints(da.coords[x['dim']])
ycoord = sc.midpoints(da.coords[y['dim']])
return (xcoord >= l) & (xcoord <= r) & (ycoord >= b) & (ycoord <= t)
def _get_rect_info(artist, figure):
"""
Convert the raw rectangle info to a dict containing the dimensions of
each axis, and values with units.
"""
return lambda: {
'x': {
'dim': figure.canvas.dims['x'],
'left': sc.scalar(artist.xy[0], unit=figure.canvas.units['x']),
'right': sc.scalar(
artist.xy[0] + artist.width, unit=figure.canvas.units['x']
),
},
'y': {
'dim': figure.canvas.dims['y'],
'bottom': sc.scalar(artist.xy[1], unit=figure.canvas.units['y']),
'top': sc.scalar(
artist.xy[1] + artist.height, unit=figure.canvas.units['y']
),
},
}
RectangleTool = partial(
DrawingTool, tool=Rectangles, get_artist_info=_get_rect_info, icon='vector-square'
)
Finally, we create our visualization interface with the figure, adding our new tool to the toolbar.
[4]:
data_node = pp.Node(da)
def apply_masks(da, *masks):
out = da.copy(deep=False)
for i, mask in enumerate(masks):
out.masks[str(i)] = mask
return out
masking_node = pp.Node(apply_masks, data_node)
fig = pp.imagefigure(masking_node, norm='log')
r = RectangleTool(
figure=fig, input_node=data_node, func=define_mask, destination=masking_node
)
fig.toolbar['roi'] = r
[6]:
fig
[6]:
[7]:
pp.show_graph(fig)
[7]:
To retrieve the masked data array, simply call the node that is applying the masks:
[8]:
masking_node()
[8]:
scipp.DataArray (885.21 KB)
- y: 300
- x: 300
- x(x [bin-edge])float64cm-70.294, -68.764, ..., 387.320, 388.850
Values:
array([-7.02942395e+01, -6.87637585e+01, -6.72332774e+01, -6.57027964e+01, -6.41723154e+01, -6.26418343e+01, -6.11113533e+01, -5.95808723e+01, -5.80503912e+01, -5.65199102e+01, -5.49894292e+01, -5.34589481e+01, -5.19284671e+01, -5.03979861e+01, -4.88675050e+01, -4.73370240e+01, -4.58065430e+01, -4.42760619e+01, -4.27455809e+01, -4.12150999e+01, -3.96846188e+01, -3.81541378e+01, -3.66236568e+01, -3.50931758e+01, -3.35626947e+01, -3.20322137e+01, -3.05017327e+01, -2.89712516e+01, -2.74407706e+01, -2.59102896e+01, -2.43798085e+01, -2.28493275e+01, -2.13188465e+01, -1.97883654e+01, -1.82578844e+01, -1.67274034e+01, -1.51969223e+01, -1.36664413e+01, -1.21359603e+01, -1.06054792e+01, -9.07499820e+00, -7.54451716e+00, -6.01403613e+00, -4.48355510e+00, -2.95307407e+00, -1.42259303e+00, 1.07888000e-01, 1.63836903e+00, 3.16885007e+00, 4.69933110e+00, 6.22981213e+00, 7.76029316e+00, 9.29077420e+00, 1.08212552e+01, 1.23517363e+01, 1.38822173e+01, 1.54126983e+01, 1.69431794e+01, 1.84736604e+01, 2.00041414e+01, 2.15346225e+01, 2.30651035e+01, 2.45955845e+01, 2.61260656e+01, 2.76565466e+01, 2.91870276e+01, 3.07175087e+01, 3.22479897e+01, 3.37784707e+01, 3.53089518e+01, 3.68394328e+01, 3.83699138e+01, 3.99003948e+01, 4.14308759e+01, 4.29613569e+01, 4.44918379e+01, 4.60223190e+01, 4.75528000e+01, 4.90832810e+01, 5.06137621e+01, 5.21442431e+01, 5.36747241e+01, 5.52052052e+01, 5.67356862e+01, 5.82661672e+01, 5.97966483e+01, 6.13271293e+01, 6.28576103e+01, 6.43880914e+01, 6.59185724e+01, 6.74490534e+01, 6.89795345e+01, 7.05100155e+01, 7.20404965e+01, 7.35709776e+01, 7.51014586e+01, 7.66319396e+01, 7.81624207e+01, 7.96929017e+01, 8.12233827e+01, 8.27538638e+01, 8.42843448e+01, 8.58148258e+01, 8.73453069e+01, 8.88757879e+01, 9.04062689e+01, 9.19367500e+01, 9.34672310e+01, 9.49977120e+01, 9.65281931e+01, 9.80586741e+01, 9.95891551e+01, 1.01119636e+02, 1.02650117e+02, 1.04180598e+02, 1.05711079e+02, 1.07241560e+02, 1.08772041e+02, 1.10302522e+02, 1.11833003e+02, 1.13363484e+02, 1.14893965e+02, 1.16424446e+02, 1.17954928e+02, 1.19485409e+02, 1.21015890e+02, 1.22546371e+02, 1.24076852e+02, 1.25607333e+02, 1.27137814e+02, 1.28668295e+02, 1.30198776e+02, 1.31729257e+02, 1.33259738e+02, 1.34790219e+02, 1.36320700e+02, 1.37851181e+02, 1.39381662e+02, 1.40912143e+02, 1.42442624e+02, 1.43973105e+02, 1.45503586e+02, 1.47034067e+02, 1.48564548e+02, 1.50095029e+02, 1.51625510e+02, 1.53155991e+02, 1.54686472e+02, 1.56216953e+02, 1.57747434e+02, 1.59277915e+02, 1.60808396e+02, 1.62338877e+02, 1.63869358e+02, 1.65399840e+02, 1.66930321e+02, 1.68460802e+02, 1.69991283e+02, 1.71521764e+02, 1.73052245e+02, 1.74582726e+02, 1.76113207e+02, 1.77643688e+02, 1.79174169e+02, 1.80704650e+02, 1.82235131e+02, 1.83765612e+02, 1.85296093e+02, 1.86826574e+02, 1.88357055e+02, 1.89887536e+02, 1.91418017e+02, 1.92948498e+02, 1.94478979e+02, 1.96009460e+02, 1.97539941e+02, 1.99070422e+02, 2.00600903e+02, 2.02131384e+02, 2.03661865e+02, 2.05192346e+02, 2.06722827e+02, 2.08253308e+02, 2.09783789e+02, 2.11314271e+02, 2.12844752e+02, 2.14375233e+02, 2.15905714e+02, 2.17436195e+02, 2.18966676e+02, 2.20497157e+02, 2.22027638e+02, 2.23558119e+02, 2.25088600e+02, 2.26619081e+02, 2.28149562e+02, 2.29680043e+02, 2.31210524e+02, 2.32741005e+02, 2.34271486e+02, 2.35801967e+02, 2.37332448e+02, 2.38862929e+02, 2.40393410e+02, 2.41923891e+02, 2.43454372e+02, 2.44984853e+02, 2.46515334e+02, 2.48045815e+02, 2.49576296e+02, 2.51106777e+02, 2.52637258e+02, 2.54167739e+02, 2.55698220e+02, 2.57228701e+02, 2.58759183e+02, 2.60289664e+02, 2.61820145e+02, 2.63350626e+02, 2.64881107e+02, 2.66411588e+02, 2.67942069e+02, 2.69472550e+02, 2.71003031e+02, 2.72533512e+02, 2.74063993e+02, 2.75594474e+02, 2.77124955e+02, 2.78655436e+02, 2.80185917e+02, 2.81716398e+02, 2.83246879e+02, 2.84777360e+02, 2.86307841e+02, 2.87838322e+02, 2.89368803e+02, 2.90899284e+02, 2.92429765e+02, 2.93960246e+02, 2.95490727e+02, 2.97021208e+02, 2.98551689e+02, 3.00082170e+02, 3.01612651e+02, 3.03143132e+02, 3.04673613e+02, 3.06204095e+02, 3.07734576e+02, 3.09265057e+02, 3.10795538e+02, 3.12326019e+02, 3.13856500e+02, 3.15386981e+02, 3.16917462e+02, 3.18447943e+02, 3.19978424e+02, 3.21508905e+02, 3.23039386e+02, 3.24569867e+02, 3.26100348e+02, 3.27630829e+02, 3.29161310e+02, 3.30691791e+02, 3.32222272e+02, 3.33752753e+02, 3.35283234e+02, 3.36813715e+02, 3.38344196e+02, 3.39874677e+02, 3.41405158e+02, 3.42935639e+02, 3.44466120e+02, 3.45996601e+02, 3.47527082e+02, 3.49057563e+02, 3.50588044e+02, 3.52118526e+02, 3.53649007e+02, 3.55179488e+02, 3.56709969e+02, 3.58240450e+02, 3.59770931e+02, 3.61301412e+02, 3.62831893e+02, 3.64362374e+02, 3.65892855e+02, 3.67423336e+02, 3.68953817e+02, 3.70484298e+02, 3.72014779e+02, 3.73545260e+02, 3.75075741e+02, 3.76606222e+02, 3.78136703e+02, 3.79667184e+02, 3.81197665e+02, 3.82728146e+02, 3.84258627e+02, 3.85789108e+02, 3.87319589e+02, 3.88850070e+02]) - y(y [bin-edge])float64cm-61.218, -59.914, ..., 328.875, 330.180
Values:
array([-6.12183269e+01, -5.99136668e+01, -5.86090066e+01, -5.73043465e+01, -5.59996864e+01, -5.46950262e+01, -5.33903661e+01, -5.20857059e+01, -5.07810458e+01, -4.94763857e+01, -4.81717255e+01, -4.68670654e+01, -4.55624052e+01, -4.42577451e+01, -4.29530850e+01, -4.16484248e+01, -4.03437647e+01, -3.90391045e+01, -3.77344444e+01, -3.64297843e+01, -3.51251241e+01, -3.38204640e+01, -3.25158038e+01, -3.12111437e+01, -2.99064836e+01, -2.86018234e+01, -2.72971633e+01, -2.59925031e+01, -2.46878430e+01, -2.33831829e+01, -2.20785227e+01, -2.07738626e+01, -1.94692025e+01, -1.81645423e+01, -1.68598822e+01, -1.55552220e+01, -1.42505619e+01, -1.29459018e+01, -1.16412416e+01, -1.03365815e+01, -9.03192134e+00, -7.72726120e+00, -6.42260106e+00, -5.11794092e+00, -3.81328078e+00, -2.50862064e+00, -1.20396050e+00, 1.00699640e-01, 1.40535978e+00, 2.71001992e+00, 4.01468006e+00, 5.31934020e+00, 6.62400034e+00, 7.92866048e+00, 9.23332062e+00, 1.05379808e+01, 1.18426409e+01, 1.31473010e+01, 1.44519612e+01, 1.57566213e+01, 1.70612815e+01, 1.83659416e+01, 1.96706017e+01, 2.09752619e+01, 2.22799220e+01, 2.35845822e+01, 2.48892423e+01, 2.61939024e+01, 2.74985626e+01, 2.88032227e+01, 3.01078828e+01, 3.14125430e+01, 3.27172031e+01, 3.40218633e+01, 3.53265234e+01, 3.66311835e+01, 3.79358437e+01, 3.92405038e+01, 4.05451640e+01, 4.18498241e+01, 4.31544842e+01, 4.44591444e+01, 4.57638045e+01, 4.70684647e+01, 4.83731248e+01, 4.96777849e+01, 5.09824451e+01, 5.22871052e+01, 5.35917654e+01, 5.48964255e+01, 5.62010856e+01, 5.75057458e+01, 5.88104059e+01, 6.01150661e+01, 6.14197262e+01, 6.27243863e+01, 6.40290465e+01, 6.53337066e+01, 6.66383668e+01, 6.79430269e+01, 6.92476870e+01, 7.05523472e+01, 7.18570073e+01, 7.31616675e+01, 7.44663276e+01, 7.57709877e+01, 7.70756479e+01, 7.83803080e+01, 7.96849682e+01, 8.09896283e+01, 8.22942884e+01, 8.35989486e+01, 8.49036087e+01, 8.62082688e+01, 8.75129290e+01, 8.88175891e+01, 9.01222493e+01, 9.14269094e+01, 9.27315695e+01, 9.40362297e+01, 9.53408898e+01, 9.66455500e+01, 9.79502101e+01, 9.92548702e+01, 1.00559530e+02, 1.01864191e+02, 1.03168851e+02, 1.04473511e+02, 1.05778171e+02, 1.07082831e+02, 1.08387491e+02, 1.09692151e+02, 1.10996812e+02, 1.12301472e+02, 1.13606132e+02, 1.14910792e+02, 1.16215452e+02, 1.17520112e+02, 1.18824772e+02, 1.20129432e+02, 1.21434093e+02, 1.22738753e+02, 1.24043413e+02, 1.25348073e+02, 1.26652733e+02, 1.27957393e+02, 1.29262053e+02, 1.30566714e+02, 1.31871374e+02, 1.33176034e+02, 1.34480694e+02, 1.35785354e+02, 1.37090014e+02, 1.38394674e+02, 1.39699335e+02, 1.41003995e+02, 1.42308655e+02, 1.43613315e+02, 1.44917975e+02, 1.46222635e+02, 1.47527295e+02, 1.48831956e+02, 1.50136616e+02, 1.51441276e+02, 1.52745936e+02, 1.54050596e+02, 1.55355256e+02, 1.56659916e+02, 1.57964577e+02, 1.59269237e+02, 1.60573897e+02, 1.61878557e+02, 1.63183217e+02, 1.64487877e+02, 1.65792537e+02, 1.67097197e+02, 1.68401858e+02, 1.69706518e+02, 1.71011178e+02, 1.72315838e+02, 1.73620498e+02, 1.74925158e+02, 1.76229818e+02, 1.77534479e+02, 1.78839139e+02, 1.80143799e+02, 1.81448459e+02, 1.82753119e+02, 1.84057779e+02, 1.85362439e+02, 1.86667100e+02, 1.87971760e+02, 1.89276420e+02, 1.90581080e+02, 1.91885740e+02, 1.93190400e+02, 1.94495060e+02, 1.95799721e+02, 1.97104381e+02, 1.98409041e+02, 1.99713701e+02, 2.01018361e+02, 2.02323021e+02, 2.03627681e+02, 2.04932342e+02, 2.06237002e+02, 2.07541662e+02, 2.08846322e+02, 2.10150982e+02, 2.11455642e+02, 2.12760302e+02, 2.14064963e+02, 2.15369623e+02, 2.16674283e+02, 2.17978943e+02, 2.19283603e+02, 2.20588263e+02, 2.21892923e+02, 2.23197583e+02, 2.24502244e+02, 2.25806904e+02, 2.27111564e+02, 2.28416224e+02, 2.29720884e+02, 2.31025544e+02, 2.32330204e+02, 2.33634865e+02, 2.34939525e+02, 2.36244185e+02, 2.37548845e+02, 2.38853505e+02, 2.40158165e+02, 2.41462825e+02, 2.42767486e+02, 2.44072146e+02, 2.45376806e+02, 2.46681466e+02, 2.47986126e+02, 2.49290786e+02, 2.50595446e+02, 2.51900107e+02, 2.53204767e+02, 2.54509427e+02, 2.55814087e+02, 2.57118747e+02, 2.58423407e+02, 2.59728067e+02, 2.61032728e+02, 2.62337388e+02, 2.63642048e+02, 2.64946708e+02, 2.66251368e+02, 2.67556028e+02, 2.68860688e+02, 2.70165349e+02, 2.71470009e+02, 2.72774669e+02, 2.74079329e+02, 2.75383989e+02, 2.76688649e+02, 2.77993309e+02, 2.79297969e+02, 2.80602630e+02, 2.81907290e+02, 2.83211950e+02, 2.84516610e+02, 2.85821270e+02, 2.87125930e+02, 2.88430590e+02, 2.89735251e+02, 2.91039911e+02, 2.92344571e+02, 2.93649231e+02, 2.94953891e+02, 2.96258551e+02, 2.97563211e+02, 2.98867872e+02, 3.00172532e+02, 3.01477192e+02, 3.02781852e+02, 3.04086512e+02, 3.05391172e+02, 3.06695832e+02, 3.08000493e+02, 3.09305153e+02, 3.10609813e+02, 3.11914473e+02, 3.13219133e+02, 3.14523793e+02, 3.15828453e+02, 3.17133114e+02, 3.18437774e+02, 3.19742434e+02, 3.21047094e+02, 3.22351754e+02, 3.23656414e+02, 3.24961074e+02, 3.26265735e+02, 3.27570395e+02, 3.28875055e+02, 3.30179715e+02])
- (y, x)float64counts1.0, 1.0, ..., 1.0, 1.0
Values:
array([[1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.], ..., [1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.], [1., 1., 1., ..., 1., 1., 1.]], shape=(300, 300))
- 0(x, y)boolFalse, False, ..., False, False
Values:
array([[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], shape=(300, 300)) - 1(x, y)boolFalse, False, ..., False, False
Values:
array([[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], shape=(300, 300))