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-89.121, -87.617, ..., 360.707, 362.212
Values:
array([-8.91212423e+01, -8.76167990e+01, -8.61123557e+01, -8.46079123e+01, -8.31034690e+01, -8.15990257e+01, -8.00945824e+01, -7.85901390e+01, -7.70856957e+01, -7.55812524e+01, -7.40768091e+01, -7.25723657e+01, -7.10679224e+01, -6.95634791e+01, -6.80590358e+01, -6.65545924e+01, -6.50501491e+01, -6.35457058e+01, -6.20412625e+01, -6.05368191e+01, -5.90323758e+01, -5.75279325e+01, -5.60234892e+01, -5.45190458e+01, -5.30146025e+01, -5.15101592e+01, -5.00057159e+01, -4.85012725e+01, -4.69968292e+01, -4.54923859e+01, -4.39879425e+01, -4.24834992e+01, -4.09790559e+01, -3.94746126e+01, -3.79701692e+01, -3.64657259e+01, -3.49612826e+01, -3.34568393e+01, -3.19523959e+01, -3.04479526e+01, -2.89435093e+01, -2.74390660e+01, -2.59346226e+01, -2.44301793e+01, -2.29257360e+01, -2.14212927e+01, -1.99168493e+01, -1.84124060e+01, -1.69079627e+01, -1.54035194e+01, -1.38990760e+01, -1.23946327e+01, -1.08901894e+01, -9.38574605e+00, -7.88130273e+00, -6.37685940e+00, -4.87241608e+00, -3.36797275e+00, -1.86352943e+00, -3.59086100e-01, 1.14535723e+00, 2.64980055e+00, 4.15424388e+00, 5.65868720e+00, 7.16313053e+00, 8.66757385e+00, 1.01720172e+01, 1.16764605e+01, 1.31809038e+01, 1.46853472e+01, 1.61897905e+01, 1.76942338e+01, 1.91986771e+01, 2.07031205e+01, 2.22075638e+01, 2.37120071e+01, 2.52164504e+01, 2.67208938e+01, 2.82253371e+01, 2.97297804e+01, 3.12342237e+01, 3.27386671e+01, 3.42431104e+01, 3.57475537e+01, 3.72519970e+01, 3.87564404e+01, 4.02608837e+01, 4.17653270e+01, 4.32697703e+01, 4.47742137e+01, 4.62786570e+01, 4.77831003e+01, 4.92875436e+01, 5.07919870e+01, 5.22964303e+01, 5.38008736e+01, 5.53053170e+01, 5.68097603e+01, 5.83142036e+01, 5.98186469e+01, 6.13230903e+01, 6.28275336e+01, 6.43319769e+01, 6.58364202e+01, 6.73408636e+01, 6.88453069e+01, 7.03497502e+01, 7.18541935e+01, 7.33586369e+01, 7.48630802e+01, 7.63675235e+01, 7.78719668e+01, 7.93764102e+01, 8.08808535e+01, 8.23852968e+01, 8.38897401e+01, 8.53941835e+01, 8.68986268e+01, 8.84030701e+01, 8.99075134e+01, 9.14119568e+01, 9.29164001e+01, 9.44208434e+01, 9.59252867e+01, 9.74297301e+01, 9.89341734e+01, 1.00438617e+02, 1.01943060e+02, 1.03447503e+02, 1.04951947e+02, 1.06456390e+02, 1.07960833e+02, 1.09465277e+02, 1.10969720e+02, 1.12474163e+02, 1.13978607e+02, 1.15483050e+02, 1.16987493e+02, 1.18491937e+02, 1.19996380e+02, 1.21500823e+02, 1.23005267e+02, 1.24509710e+02, 1.26014153e+02, 1.27518597e+02, 1.29023040e+02, 1.30527483e+02, 1.32031927e+02, 1.33536370e+02, 1.35040813e+02, 1.36545257e+02, 1.38049700e+02, 1.39554143e+02, 1.41058587e+02, 1.42563030e+02, 1.44067473e+02, 1.45571916e+02, 1.47076360e+02, 1.48580803e+02, 1.50085246e+02, 1.51589690e+02, 1.53094133e+02, 1.54598576e+02, 1.56103020e+02, 1.57607463e+02, 1.59111906e+02, 1.60616350e+02, 1.62120793e+02, 1.63625236e+02, 1.65129680e+02, 1.66634123e+02, 1.68138566e+02, 1.69643010e+02, 1.71147453e+02, 1.72651896e+02, 1.74156340e+02, 1.75660783e+02, 1.77165226e+02, 1.78669670e+02, 1.80174113e+02, 1.81678556e+02, 1.83183000e+02, 1.84687443e+02, 1.86191886e+02, 1.87696330e+02, 1.89200773e+02, 1.90705216e+02, 1.92209660e+02, 1.93714103e+02, 1.95218546e+02, 1.96722990e+02, 1.98227433e+02, 1.99731876e+02, 2.01236320e+02, 2.02740763e+02, 2.04245206e+02, 2.05749650e+02, 2.07254093e+02, 2.08758536e+02, 2.10262980e+02, 2.11767423e+02, 2.13271866e+02, 2.14776309e+02, 2.16280753e+02, 2.17785196e+02, 2.19289639e+02, 2.20794083e+02, 2.22298526e+02, 2.23802969e+02, 2.25307413e+02, 2.26811856e+02, 2.28316299e+02, 2.29820743e+02, 2.31325186e+02, 2.32829629e+02, 2.34334073e+02, 2.35838516e+02, 2.37342959e+02, 2.38847403e+02, 2.40351846e+02, 2.41856289e+02, 2.43360733e+02, 2.44865176e+02, 2.46369619e+02, 2.47874063e+02, 2.49378506e+02, 2.50882949e+02, 2.52387393e+02, 2.53891836e+02, 2.55396279e+02, 2.56900723e+02, 2.58405166e+02, 2.59909609e+02, 2.61414053e+02, 2.62918496e+02, 2.64422939e+02, 2.65927383e+02, 2.67431826e+02, 2.68936269e+02, 2.70440713e+02, 2.71945156e+02, 2.73449599e+02, 2.74954043e+02, 2.76458486e+02, 2.77962929e+02, 2.79467372e+02, 2.80971816e+02, 2.82476259e+02, 2.83980702e+02, 2.85485146e+02, 2.86989589e+02, 2.88494032e+02, 2.89998476e+02, 2.91502919e+02, 2.93007362e+02, 2.94511806e+02, 2.96016249e+02, 2.97520692e+02, 2.99025136e+02, 3.00529579e+02, 3.02034022e+02, 3.03538466e+02, 3.05042909e+02, 3.06547352e+02, 3.08051796e+02, 3.09556239e+02, 3.11060682e+02, 3.12565126e+02, 3.14069569e+02, 3.15574012e+02, 3.17078456e+02, 3.18582899e+02, 3.20087342e+02, 3.21591786e+02, 3.23096229e+02, 3.24600672e+02, 3.26105116e+02, 3.27609559e+02, 3.29114002e+02, 3.30618446e+02, 3.32122889e+02, 3.33627332e+02, 3.35131776e+02, 3.36636219e+02, 3.38140662e+02, 3.39645106e+02, 3.41149549e+02, 3.42653992e+02, 3.44158435e+02, 3.45662879e+02, 3.47167322e+02, 3.48671765e+02, 3.50176209e+02, 3.51680652e+02, 3.53185095e+02, 3.54689539e+02, 3.56193982e+02, 3.57698425e+02, 3.59202869e+02, 3.60707312e+02, 3.62211755e+02]) - y(y [bin-edge])float64cm-36.692, -35.507, ..., 317.726, 318.911
Values:
array([-3.66924384e+01, -3.55070931e+01, -3.43217479e+01, -3.31364026e+01, -3.19510574e+01, -3.07657121e+01, -2.95803669e+01, -2.83950216e+01, -2.72096764e+01, -2.60243311e+01, -2.48389859e+01, -2.36536406e+01, -2.24682954e+01, -2.12829501e+01, -2.00976049e+01, -1.89122596e+01, -1.77269144e+01, -1.65415691e+01, -1.53562239e+01, -1.41708786e+01, -1.29855334e+01, -1.18001881e+01, -1.06148429e+01, -9.42949762e+00, -8.24415237e+00, -7.05880712e+00, -5.87346186e+00, -4.68811661e+00, -3.50277136e+00, -2.31742611e+00, -1.13208086e+00, 5.32643874e-02, 1.23860964e+00, 2.42395489e+00, 3.60930014e+00, 4.79464539e+00, 5.97999064e+00, 7.16533589e+00, 8.35068114e+00, 9.53602639e+00, 1.07213716e+01, 1.19067169e+01, 1.30920621e+01, 1.42774074e+01, 1.54627526e+01, 1.66480979e+01, 1.78334431e+01, 1.90187884e+01, 2.02041336e+01, 2.13894789e+01, 2.25748241e+01, 2.37601694e+01, 2.49455146e+01, 2.61308599e+01, 2.73162051e+01, 2.85015504e+01, 2.96868956e+01, 3.08722409e+01, 3.20575861e+01, 3.32429314e+01, 3.44282767e+01, 3.56136219e+01, 3.67989672e+01, 3.79843124e+01, 3.91696577e+01, 4.03550029e+01, 4.15403482e+01, 4.27256934e+01, 4.39110387e+01, 4.50963839e+01, 4.62817292e+01, 4.74670744e+01, 4.86524197e+01, 4.98377649e+01, 5.10231102e+01, 5.22084554e+01, 5.33938007e+01, 5.45791459e+01, 5.57644912e+01, 5.69498364e+01, 5.81351817e+01, 5.93205269e+01, 6.05058722e+01, 6.16912174e+01, 6.28765627e+01, 6.40619079e+01, 6.52472532e+01, 6.64325984e+01, 6.76179437e+01, 6.88032889e+01, 6.99886342e+01, 7.11739794e+01, 7.23593247e+01, 7.35446699e+01, 7.47300152e+01, 7.59153604e+01, 7.71007057e+01, 7.82860509e+01, 7.94713962e+01, 8.06567414e+01, 8.18420867e+01, 8.30274319e+01, 8.42127772e+01, 8.53981224e+01, 8.65834677e+01, 8.77688129e+01, 8.89541582e+01, 9.01395034e+01, 9.13248487e+01, 9.25101939e+01, 9.36955392e+01, 9.48808844e+01, 9.60662297e+01, 9.72515749e+01, 9.84369202e+01, 9.96222654e+01, 1.00807611e+02, 1.01992956e+02, 1.03178301e+02, 1.04363646e+02, 1.05548992e+02, 1.06734337e+02, 1.07919682e+02, 1.09105027e+02, 1.10290373e+02, 1.11475718e+02, 1.12661063e+02, 1.13846408e+02, 1.15031754e+02, 1.16217099e+02, 1.17402444e+02, 1.18587789e+02, 1.19773135e+02, 1.20958480e+02, 1.22143825e+02, 1.23329170e+02, 1.24514516e+02, 1.25699861e+02, 1.26885206e+02, 1.28070551e+02, 1.29255897e+02, 1.30441242e+02, 1.31626587e+02, 1.32811932e+02, 1.33997278e+02, 1.35182623e+02, 1.36367968e+02, 1.37553313e+02, 1.38738659e+02, 1.39924004e+02, 1.41109349e+02, 1.42294694e+02, 1.43480040e+02, 1.44665385e+02, 1.45850730e+02, 1.47036075e+02, 1.48221421e+02, 1.49406766e+02, 1.50592111e+02, 1.51777456e+02, 1.52962802e+02, 1.54148147e+02, 1.55333492e+02, 1.56518837e+02, 1.57704183e+02, 1.58889528e+02, 1.60074873e+02, 1.61260218e+02, 1.62445564e+02, 1.63630909e+02, 1.64816254e+02, 1.66001599e+02, 1.67186945e+02, 1.68372290e+02, 1.69557635e+02, 1.70742980e+02, 1.71928326e+02, 1.73113671e+02, 1.74299016e+02, 1.75484361e+02, 1.76669707e+02, 1.77855052e+02, 1.79040397e+02, 1.80225742e+02, 1.81411088e+02, 1.82596433e+02, 1.83781778e+02, 1.84967123e+02, 1.86152469e+02, 1.87337814e+02, 1.88523159e+02, 1.89708504e+02, 1.90893850e+02, 1.92079195e+02, 1.93264540e+02, 1.94449885e+02, 1.95635231e+02, 1.96820576e+02, 1.98005921e+02, 1.99191266e+02, 2.00376612e+02, 2.01561957e+02, 2.02747302e+02, 2.03932647e+02, 2.05117993e+02, 2.06303338e+02, 2.07488683e+02, 2.08674028e+02, 2.09859374e+02, 2.11044719e+02, 2.12230064e+02, 2.13415409e+02, 2.14600755e+02, 2.15786100e+02, 2.16971445e+02, 2.18156790e+02, 2.19342136e+02, 2.20527481e+02, 2.21712826e+02, 2.22898171e+02, 2.24083517e+02, 2.25268862e+02, 2.26454207e+02, 2.27639552e+02, 2.28824898e+02, 2.30010243e+02, 2.31195588e+02, 2.32380933e+02, 2.33566279e+02, 2.34751624e+02, 2.35936969e+02, 2.37122314e+02, 2.38307660e+02, 2.39493005e+02, 2.40678350e+02, 2.41863695e+02, 2.43049041e+02, 2.44234386e+02, 2.45419731e+02, 2.46605076e+02, 2.47790422e+02, 2.48975767e+02, 2.50161112e+02, 2.51346457e+02, 2.52531803e+02, 2.53717148e+02, 2.54902493e+02, 2.56087838e+02, 2.57273184e+02, 2.58458529e+02, 2.59643874e+02, 2.60829219e+02, 2.62014565e+02, 2.63199910e+02, 2.64385255e+02, 2.65570600e+02, 2.66755946e+02, 2.67941291e+02, 2.69126636e+02, 2.70311981e+02, 2.71497327e+02, 2.72682672e+02, 2.73868017e+02, 2.75053362e+02, 2.76238708e+02, 2.77424053e+02, 2.78609398e+02, 2.79794743e+02, 2.80980089e+02, 2.82165434e+02, 2.83350779e+02, 2.84536124e+02, 2.85721470e+02, 2.86906815e+02, 2.88092160e+02, 2.89277505e+02, 2.90462851e+02, 2.91648196e+02, 2.92833541e+02, 2.94018886e+02, 2.95204232e+02, 2.96389577e+02, 2.97574922e+02, 2.98760268e+02, 2.99945613e+02, 3.01130958e+02, 3.02316303e+02, 3.03501649e+02, 3.04686994e+02, 3.05872339e+02, 3.07057684e+02, 3.08243030e+02, 3.09428375e+02, 3.10613720e+02, 3.11799065e+02, 3.12984411e+02, 3.14169756e+02, 3.15355101e+02, 3.16540446e+02, 3.17725792e+02, 3.18911137e+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))