diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml
index 147d88812..51922d895 100644
--- a/base_classes/NXdata.nxdl.xml
+++ b/base_classes/NXdata.nxdl.xml
@@ -60,222 +60,180 @@
does not describe how the data is to be plotted or even the dimensionality of the plot.
https://www.nexusformat.org/NIAC2018Minutes.html#nxdata-plottype--attribute
- **Signals:**
-
- .. index:: plotting
-
- The :ref:`DATA </NXdata/DATA-field>` fields contain the signal values to be plotted. The name of the field
- to be used as the *default plot signal* is provided by the :ref:`signal </NXdata@signal-attribute>` attribute.
- The names of the fields to be used as *secondary plot signals* are provided by the
- :ref:`auxiliary_signals</NXdata@auxiliary_signals-attribute>` attribute.
-
- An example with three signals, one of which being the default
-
- .. code-block::
-
- data:NXdata
- @signal = "data1"
- @auxiliary_signals = ["data2", "data3"]
- data1: float[10,20,30] --> the default signal
- data2: float[10,20,30]
- data3: float[10,20,30]
-
- **Axes:**
-
- .. index:: axes (attribute)
- .. index:: coordinates
+ **Usage:**
- The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the axis coordinates associated with the signal values.
+ .. admonition:: Plot data signal versus x axis
- ``Default axes``
+ .. code-block::
- The :ref:`axes </NXdata@axes-attribute>` attribute provides the names of the :ref:`AXISNAME </NXdata/AXISNAME-field>`
- fields to be used as the default axis for each dimension of the :ref:`DATA </NXdata/DATA-field>` fields.
- As a result the length of the :ref:`axes </NXdata@axes-attribute>` attribute must be equal to the rank of the :ref:`DATA </NXdata/DATA-field>`
- fields. When a particular dimension has no default axis, the string “.” is used in that position.
+ data:NXdata
+ @signal = "data"
+ @axes = ["x"]
+ data: float[100]
+ x: float[100]
- ``Spanned dimensions``
+ More complex cases are supported
- The :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes describe the
- :ref:`DATA </NXdata/DATA-field>` dimensions spanned by the corresponding :ref:`AXISNAME </NXdata/AXISNAME-field>` fields.
+ * histogram data: ``x`` has one more value than ``data``.
+ * alternative axes: instead of a single ``x`` axis you can have several axes, one of which being the default.
+ * signals with more than one dimension: ``data`` could be 2D with axes ``x`` and ``y`` along each dimension.
+ * axes with more than one dimension: ``data`` could be 2D with axes ``x`` and ``y`` also being 2D, providing a
+ unique ``[x, y]`` coordinate for each ``data`` point.
- When :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` is missing for a given :ref:`AXISNAME </NXdata/AXISNAME-field>` field,
- the position(s) of the :ref:`AXISNAME </NXdata/AXISNAME-field>` field name in the :ref:`axes </NXdata@axes-attribute>` attribute
- is(are) used. The shape of an :ref:`AXISNAME </NXdata/AXISNAME-field>` field must be equal to the shape of the
- :ref:`DATA </NXdata/DATA-field>` dimensions it spans. This means that ``AXISNAME.shape[i] == DATA.shape[AXISNAME_indices[i]]``
- for each ``i`` in ``[0, AXISNAME.ndim)``.
-
- Note that an :ref:`AXISNAME </NXdata/AXISNAME-field>` field can have more than one dimension and can therefore span
- more than one :ref:`DATA </NXdata/DATA-field>` dimension. Conversely, one :ref:`DATA </NXdata/DATA-field>` dimension
- can be spanned by more than one :ref:`AXISNAME </NXdata/AXISNAME-field>` field. As stated before, the default
- axis name (if any) of each dimension can be found in the :ref:`axes </NXdata@axes-attribute>` attribute.
+ **Signals:**
- ``Available axes``
+ .. index:: plotting
- With this definition of the :ref:`axes </NXdata@axes-attribute>` and :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes
- a list of all available axes is not provided directly. All strings in the :ref:`axes </NXdata@axes-attribute>` attribute
- (excluding the “.” string) are axis field names. In addition the prefix of an attribute ending with the string "_indices" is also
- an axis field name.
+ .. admonition:: Defined by
- **Axes examples:**
+ * :ref:`DATA </NXdata/DATA-field>` fields
+ * the :ref:`signal </NXdata@signal-attribute>` attribute
+ * the :ref:`auxiliary_signals</NXdata@auxiliary_signals-attribute>` attribute
- ``1. Single-dimensional axes``
+ The :ref:`DATA </NXdata/DATA-field>` fields contain the signal values to be plotted. The name of the field
+ to be used as the *default plot signal* is provided by the :ref:`signal </NXdata@signal-attribute>` attribute.
+ The names of the fields to be used as *secondary plot signals* are provided by the
+ :ref:`auxiliary_signals</NXdata@auxiliary_signals-attribute>` attribute.
- :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are typically one-dimensional arrays that span a single :ref:`DATA </NXdata/DATA-field>` dimension.
+ .. admonition:: An example with three signals, one of which being the default
- An example of this would be 2D data on a regular coordinate grid
+ .. code-block::
- .. code-block::
+ data:NXdata
+ @signal = "data1"
+ @auxiliary_signals = ["data2", "data3"]
+ data1: float[10,20,30] --> the default signal
+ data2: float[10,20,30]
+ data3: float[10,20,30]
- data:NXdata
- @signal = "data"
- @axes = ["x", "y"]
- data: float[10,20]
- x: float[10] --> coordinates along the first dimension
- y: float[20] --> coordinates along the second dimension
+ **Axes:**
- In this example each data point ``data[i,j]`` has axis coordinates ``[x[i], y[j]]``.
+ .. index:: axes (attribute)
+ .. index:: coordinates
- Note that ``@x_indices`` and ``@y_indices`` attributes can be omitted in this case. However it is strongly encouraged to provide them.
+ .. admonition:: Defined by
- ``2. Data dimensions spanned by more than one axis``
+ * :ref:`AXISNAME </NXdata/AXISNAME-field>` fields
+ * the :ref:`axes </NXdata@axes-attribute>` attribute
+ * :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes
- A common case is the need to specify alternative axes for the same dimension
+ The fields and attributes are defined as follows
- .. code-block::
+ 1. The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the axis coordinates associated with the signal values.
- data:NXdata
- @signal = "data"
- @axes = ["eta", "q"]
- data: float[10,20]
- @eta_indices = [0]
- @tth_indices = [1]
- @q_indices = [1]
- eta: float[10] --> coordinates along the first dimension
- tth: float[20] --> coordinates along the second dimension (alternative)
- q: float[20] --> coordinates along the second dimension (default)
+ 2. The :ref:`axes </NXdata@axes-attribute>` attribute provides the names of the :ref:`AXISNAME </NXdata/AXISNAME-field>`
+ fields to be used as the `default axis` for each dimension of the :ref:`DATA </NXdata/DATA-field>` fields.
- Note that to recognize ``tth`` as an axis, ``@tth_indices`` must be present. Readers that do
- not make use of the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes will
- not understand that ``tth`` is an axis and cannot take this field into account.
+ 3. The :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes describe the :ref:`DATA </NXdata/DATA-field>`
+ dimensions spanned by the corresponding :ref:`AXISNAME </NXdata/AXISNAME-field>` fields.
- ``3. Multi-dimensional axes``
+ Additional requirements for a complete definition
- When coordinates do not form a regular grid, multi-dimensional :ref:`AXISNAME </NXdata/AXISNAME-field>` fields
- can be used. Just remember that the shape of an :ref:`AXISNAME </NXdata/AXISNAME-field>` field must be equal to the shape
- of the :ref:`DATA </NXdata/DATA-field>` dimensions it spans.
+ 1. The length of the :ref:`axes </NXdata@axes-attribute>` attribute must be equal to the rank of the :ref:`DATA </NXdata/DATA-field>`
+ fields. When a particular dimension has no default axis, the string “.” is used in that position.
- An example of this would be 2D scatter data where each data point has unique coordinates
+ 2. When :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` is missing for a given
+ :ref:`AXISNAME </NXdata/AXISNAME-field>` field, the position(s) of the :ref:`AXISNAME </NXdata/AXISNAME-field>`
+ field name in the :ref:`axes </NXdata@axes-attribute>` attribute is(are) used.
- .. code-block::
+ 3. The shape of an :ref:`AXISNAME </NXdata/AXISNAME-field>` field must `correspond` to the shape of the
+ :ref:`DATA </NXdata/DATA-field>` dimensions it spans. This means that for each dimension ``i`` in ``[0, AXISNAME.ndim)``
+ the number of data points along this dimension ``DATA.shape[AXISNAME_indices[i]]`` must be equal to the number
+ of axis values along this dimension ``AXISNAME.shape[i]`` or the number of bin edges ``AXISNAME.shape[i]+1``
+ in case of histogram data.
- data:NXdata
- @signal = "data"
- @axes = ["x", "y"]
- @x_indices = [0, 1]
- @y_indices = [0, 1]
- data: float[10,20]
- x: float[10,20] --> coordinates along both dimensions
- y: float[10,20] --> coordinates along both dimensions
+ 4. When :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` is the same as the indices of "AXISNAME" in the
+ :ref:`axes </NXdata@axes-attribute>` attribute, there is no need to provide
+ :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>`.
- In this example each data point ``data[i,j]`` has axis coordinates ``[x[i,j], y[i,j]]`` and when
- plotting, ``x`` is used along the first data dimension by default and `y` along the second data dimension.
- Since ``x`` and ``y`` span both dimensions, a reader could choose to use ``y`` for the first dimension
- and ``x`` for the second as an alternative to the default. A writer could also choose to not specify
- any default by defining ``@axes = [".", "."]`` and leave the decision up the the reader.
+ 5. The indices of "AXISNAME" in the :ref:`axes </NXdata@axes-attribute>` attribute must be a subset of
+ :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>`.
- Note that omitting ``@x_indices`` would result in ``@x_indices = [0]`` as derived from the position of the string ``"x"`` in ``@axes``.
- This would be invalid since the shape ``[10,20]`` of ``x`` is not equal to the shape ``[10]`` of the spanned data dimensions.
+ Highlight concequences that follow the definition
- Omitting indices for multi-dimensional axes can only be done by repeating the :ref:`AXISNAME </NXdata/AXISNAME-field>`
- name in all positions of the :ref:`axes </NXdata@axes-attribute>` attribute which they span. For example
+ 1. An :ref:`AXISNAME </NXdata/AXISNAME-field>` field can have more than one dimension and can therefore span
+ more than one :ref:`DATA </NXdata/DATA-field>` dimension. Conversely, one :ref:`DATA </NXdata/DATA-field>` dimension
+ can be spanned by more than one :ref:`AXISNAME </NXdata/AXISNAME-field>` field. The default axis name (if any)
+ of each dimension can be found in the :ref:`axes </NXdata@axes-attribute>` attribute.
- .. code-block::
+ 2. A list of all available axes is not provided directly. All strings in the :ref:`axes </NXdata@axes-attribute>` attribute
+ (excluding the “.” string) are axis field names. In addition the prefix of an attribute ending with the string "_indices" is also
+ an axis field name.
- data:NXdata
- @signal = "data"
- @axes = ["x", "x"]
- data: float[10,20]
- x: float[10,20] --> coordinates along both dimensions
+ .. admonition:: The following example covers all axes features supported
- Note that since ``NXdata`` does not describe how the data is to be plotted or even the dimensionality of the plot,
- a reader would probably treat this particular example as a 1D signal and plot it as such.
+ .. code-block::
- In the case of multi-dimensional axes, single-dimensional axes are often introduced as default axes
- to support readers that do not make use of the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes
- or cannot handle multi-dimensional axes.
+ data:NXdata
+ @signal = "data"
+ @axes = ["x_set", "y_set", "."] --> default axes for all three dimensions
+ @x_encoder_indices = [0, 1]
+ @y_encoder_indices = 1 --> or [1]
+ data: float[10,7,1024]
+ x_encoder: float[11,7] --> coordinates along the first and second dimensions
+ y_encoder: float[7] --> coordinates along the second dimension
+ x_set: float[10] --> coordinates along the first dimension
+ y_set: float[7] --> coordinates along the second dimension
- The 2D scatter example can be enriched as follows
+ One scientific application that provided such data is 2D scanning X-ray Fluorescence
+ where the sample is scanned through a focussed X-ray beam in two dimensions and an XRF spectrum
+ with 1024 channels is recorded at each position. In addition the x motor is scanned
+ continuously and both motors have an encoder which records the actual motor position as
+ opposed to the requested or `set` position.
- .. code-block::
+ .. image:: data/example2D_hist.png
+ :width: 100%
- data:NXdata
- @signal = "data"
- @axes = ["x_set", "y_set"]
- @x_indices = [0, 1]
- @y_indices = [0, 1]
- @x_set_indices = 0 --> or [0]
- @y_set_indices = 1 --> or [1]
- data: float[10,20]
- x: float[10,20] --> coordinates along both dimensions
- y: float[10,20] --> coordinates along both dimensions
- x_set: float[10] --> coordinates along the first dimension
- y_set: float[20] --> coordinates along the second dimension
+ 1. ``@axes`` has three values which corresponds to the ``data`` rank of three
- The first dimension is spanned by three axes: ``x``, ``y`` and ``x_set``. The second dimension is also
- spanned by three axes: ``x``, ``y`` and ``y_set``.
+ 2. ``x_set`` and ``y_set`` are the default axes for the first two dimensions while the third
+ dimension does not have a default axis or any axis for that matter.
- Technically ``@x_set_indices`` and ``@y_set_indices`` can be omitted. However it is strongly encouraged to provide them.
+ 3. ``x_set_indices`` and ``y_set_indices`` are omitted because they would be equal to
+ the position of ``"x_set"`` and ``"y_set"`` in ``@axes``.
- ``4. Axes without defaults``
+ 4. The first dimension is spanned by two axes ``x_set`` and ``x_encoder``. Since
+ the x motor is scanned continuously, the encoder records the edge of every bin
+ on which an XRF spectrum is recorded yielding 11 values instead of 10 along the
+ first dimension. The ``x_encoder`` spans two dimensions because the actual x edges
+ are slightly different for every x motion at each y position.
- Expanding on the previous example, a stack of 2D scatter data where the stack dimension
- does not have an axis can be described as follows
+ 5. The second dimension is spanned by two axes ``y_set`` and ``y_encoder``. The axes
+ have as many values are there are data points along the second dimension. This is
+ because the y motor moves one step after each scan of the x motor. Since the y
+ motor does not move while scanning x, there is no need for ``y_encoder`` to span
+ the first dimension because the value along this dimension remains constant.
- .. code-block::
+ **Uncertainties:**
- data:NXdata
- @signal = "data"
- @axes = [".", "x_set", "y_set"]
- @x_indices = [1, 2]
- @y_indices = [1, 2]
- @x_set_indices = 1
- @y_set_indices = 2
- data: float[5,10,20]
- x: float[10,20] --> coordinates along the last two dimensions
- y: float[10,20] --> coordinates along the last two dimensions
- x_set: float[10] --> coordinates along the second dimension
- y_set: float[20] --> coordinates along the third dimension
-
- Note that the first dimension does not have a default axis but this doesn't necessarily mean
- the first dimension is not spanned by any axis, although in this example that is the case.
+ .. admonition:: Defined by
- **Uncertainties:**
+ * :ref:`FIELDNAME_errors </NXdata/FIELDNAME_errors-field>` fields
Standard deviations on data values as well as coordinates can be provided by
:ref:`FIELDNAME_errors </NXdata/FIELDNAME_errors-field>` fields where ``FIELDNAME`` is the name of a
:ref:`DATA </NXdata/DATA-field>` field or an :ref:`AXISNAME </NXdata/AXISNAME-field>` field.
- An example of uncertainties on the signal, auxiliary signals and axis coordinates
-
- .. code-block::
-
- data:NXdata
- @signal = "data1"
- @auxiliary_signals = ["data2", "data3"]
- @axes = ["x", "z"]
- @x_indices = 0
- @z_indices = 2
- data1: float[10,20,30]
- data2: float[10,20,30]
- data3: float[10,20,30]
- x: float[10]
- z: float[30]
- data1_errors: float[10,20,30]
- data2_errors: float[10,20,30]
- data3_errors: float[10,20,30]
- x_errors: float[10]
- z_errors: float[30]
+ .. admonition:: An example of uncertainties on the signal, auxiliary signals and axis coordinates
+
+ .. code-block::
+
+ data:NXdata
+ @signal = "data1"
+ @auxiliary_signals = ["data2", "data3"]
+ @axes = ["x", ".", "z"]
+ @x_indices = 0
+ @z_indices = 2
+ data1: float[10,20,30]
+ data2: float[10,20,30]
+ data3: float[10,20,30]
+ x: float[10]
+ z: float[30]
+ data1_errors: float[10,20,30]
+ data2_errors: float[10,20,30]
+ data3_errors: float[10,20,30]
+ x_errors: float[10]
+ z_errors: float[30]
@@ -473,10 +431,12 @@
"Errors" (meaning *uncertainties* or *standard deviations*)
associated with any field named ``FIELDNAME`` in this ``NXdata``
- group (e.g. an axis, signal or auxiliary signal).
+ group. This can be a :ref:`DATA </NXdata/DATA-field>` field
+ (signal or auxiliary signal) or a :ref:`AXISNAME </NXdata/AXISNAME-field>`
+ field (axie).
The dimensions of the ``FIELDNAME_errors`` field must match
- the dimensions of the ``FIELDNAME`` field.
+ the dimensions of the corresponding ``FIELDNAME`` field.
diff --git a/base_classes/data/example2D_hist.excalidraw b/base_classes/data/example2D_hist.excalidraw
new file mode 100644
index 000000000..a4891dbce
--- /dev/null
+++ b/base_classes/data/example2D_hist.excalidraw
@@ -0,0 +1,2086 @@
+{
+ "type": "excalidraw",
+ "version": 2,
+ "source": "https://excalidraw.com",
+ "elements": [
+ {
+ "type": "text",
+ "version": 92,
+ "versionNonce": 2086153431,
+ "index": "av",
+ "isDeleted": false,
+ "id": "O4IOlsidXZtjGGLx7bkV5",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 942,
+ "y": 121,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 144.98333740234375,
+ "height": 35,
+ "seed": 740456628,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1723712683105,
+ "link": null,
+ "locked": false,
+ "fontSize": 28,
+ "fontFamily": 5,
+ "text": "x_set (10)",
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "x_set (10)",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "type": "line",
+ "version": 191,
+ "versionNonce": 829234295,
+ "index": "b028",
+ "isDeleted": false,
+ "id": "0Peull3zXZeLrxe84K3Ra",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 671,
+ "y": 237.84596154393358,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 1758717068,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 232,
+ "versionNonce": 1020938873,
+ "index": "b02G",
+ "isDeleted": false,
+ "id": "lpIHrlma980BuMZ22Hxys",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 738.6964704909454,
+ "y": 238.27014754734356,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 1597659660,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 250,
+ "versionNonce": 1285584279,
+ "index": "b02V",
+ "isDeleted": false,
+ "id": "PUFCzOPsFTUt6_P7bE4-o",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 805.2806311922333,
+ "y": 237.66218893044274,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 1892698892,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 241,
+ "versionNonce": 603755353,
+ "index": "b02d",
+ "isDeleted": false,
+ "id": "EfAasH1uSrQhLqYCV_dJ1",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 870.8811690564545,
+ "y": 237.91153860797692,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 444649740,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 284,
+ "versionNonce": 374057655,
+ "index": "b02l",
+ "isDeleted": false,
+ "id": "2Jg7xQEPafAB7j3CZ1DG0",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 937.3420218591018,
+ "y": 238.09135773008992,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 877710644,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 302,
+ "versionNonce": 94552121,
+ "index": "b03",
+ "isDeleted": false,
+ "id": "S3x-U6c9M12L9hdo75RnK",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1003.9839447540695,
+ "y": 237.7882788050355,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 547948212,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 293,
+ "versionNonce": 722680791,
+ "index": "b03G",
+ "isDeleted": false,
+ "id": "JdOPLCUGd6YqHw25CxxV9",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1070.6258676490374,
+ "y": 236.5201690030599,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 415109172,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 301,
+ "versionNonce": 800084249,
+ "index": "b03V",
+ "isDeleted": false,
+ "id": "9sRft8pqldmfDKi6uLgoo",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1137.9559844374378,
+ "y": 238.17061949598,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 525258164,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 319,
+ "versionNonce": 520857847,
+ "index": "b04",
+ "isDeleted": false,
+ "id": "hTMDH7z4306-HND5Uy428",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1204.5979073324056,
+ "y": 237.69558633969984,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 1829959476,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 347,
+ "versionNonce": 1738065401,
+ "index": "b04V",
+ "isDeleted": false,
+ "id": "Cnvi7-v-Og7O7mzfGRjk0",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1269.477944775103,
+ "y": 237.11038040417975,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 2020545716,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 364,
+ "versionNonce": 263811607,
+ "index": "b05",
+ "isDeleted": false,
+ "id": "R2dfs7C7B9g8X_NkD2ROD",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1336.1198676700708,
+ "y": 237.90971411641078,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 5,
+ "height": 360.6954803590299,
+ "seed": 1754422836,
+ "groupIds": [
+ "P-S6GWdd2jcWPuY9sOgk8"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709852930,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 360.6954803590299
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 815,
+ "versionNonce": 198155577,
+ "index": "b0F8",
+ "isDeleted": false,
+ "id": "qlf6NDVKWc-PfUXMB2bnY",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 679.2532792040847,
+ "y": 231.58333333333337,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 226363788,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 859,
+ "versionNonce": 1983483417,
+ "index": "b0FG",
+ "isDeleted": false,
+ "id": "6sCsQLqs_tdU11glCJDsV",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 679.8150779037358,
+ "y": 281.6874653857596,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 1661870604,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 877,
+ "versionNonce": 1676829433,
+ "index": "b0FV",
+ "isDeleted": false,
+ "id": "BdwAiwjE12b4f4qTwDSwe",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 678.9503475441884,
+ "y": 333.48449152659305,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 133305228,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 920,
+ "versionNonce": 1367186393,
+ "index": "b0Fl",
+ "isDeleted": false,
+ "id": "D4FVyNFGYsUAIo9Uaw_-t",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 679.4407215494107,
+ "y": 386.5352084867595,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 2046804492,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 845,
+ "versionNonce": 1592703161,
+ "index": "b0G",
+ "isDeleted": false,
+ "id": "KMLRntLpvwGKTkDPtGJhe",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 679.6740320062427,
+ "y": 439.93111694854036,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 1203294644,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 888,
+ "versionNonce": 1575565721,
+ "index": "b0GV",
+ "isDeleted": false,
+ "id": "COWd6ZBGiICka8aWYvGpJ",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 681.0868703301162,
+ "y": 493.0385660527098,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 27032372,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 855,
+ "versionNonce": 530620025,
+ "index": "b0H",
+ "isDeleted": false,
+ "id": "iihkKJF5A0Mq32M51LKkU",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 680.6645339611346,
+ "y": 546.1613624409579,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 1650608308,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 898,
+ "versionNonce": 47736665,
+ "index": "b0I",
+ "isDeleted": false,
+ "id": "3-R7bwGv6ecggMjz00nf0",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "dotted",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 679.6981549367256,
+ "y": 598.7928285018907,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "width": 652.5419601267315,
+ "height": 0,
+ "seed": 369037876,
+ "groupIds": [
+ "HySgwqNRDOZS_38GUeoPR"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723709875833,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 652.5419601267315,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "text",
+ "version": 185,
+ "versionNonce": 394926233,
+ "index": "b0d",
+ "isDeleted": false,
+ "id": "3nLFPdUk_WeZLC6vIVWF9",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 453.6666666666665,
+ "y": 393.16666666666674,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 129.73333740234375,
+ "height": 35,
+ "seed": 700169612,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": null,
+ "boundElements": [],
+ "updated": 1723710311231,
+ "link": null,
+ "locked": false,
+ "fontSize": 28,
+ "fontFamily": 5,
+ "text": "y_set (7)",
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "y_set (7)",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "type": "line",
+ "version": 248,
+ "versionNonce": 602645849,
+ "index": "b0n8",
+ "isDeleted": false,
+ "id": "JnzsYu_ZslnjyScLARyqu",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 616.023274319471,
+ "y": 266,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 1483048244,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 238,
+ "versionNonce": 504281271,
+ "index": "b0nG",
+ "isDeleted": false,
+ "id": "wE-Z234j1AJh4cvGBPnuU",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 616.3070583081071,
+ "y": 318.1035680246503,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 273333004,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 258,
+ "versionNonce": 434082361,
+ "index": "b0nV",
+ "isDeleted": false,
+ "id": "FdydPRu81qu86qN2zKoDG",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 616.6202041172993,
+ "y": 369.41308094485197,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 1681795764,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 260,
+ "versionNonce": 591694295,
+ "index": "b0nl",
+ "isDeleted": false,
+ "id": "1yZbdnRYZrurejiYu5b4T",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 616.247322592697,
+ "y": 421.3699934295827,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 1706510516,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 219,
+ "versionNonce": 142795545,
+ "index": "b0o",
+ "isDeleted": false,
+ "id": "NqCk5MDaAmJEgYLWP9r3M",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 616.0881400594476,
+ "y": 473.46049268803154,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 1915764236,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 242,
+ "versionNonce": 1608726263,
+ "index": "b0oG",
+ "isDeleted": false,
+ "id": "AsCE-HwSCbqnSMAmpaxkZ",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 616.186931647939,
+ "y": 524.9721183654877,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 1350796,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 261,
+ "versionNonce": 1816729593,
+ "index": "b0oV",
+ "isDeleted": false,
+ "id": "_-ECJC0D8tmzti-pi3-Ee",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 615.9144580101793,
+ "y": 577.1707388064154,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 12.5,
+ "height": 0,
+ "seed": 1055468300,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 12.5,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 231,
+ "versionNonce": 711933975,
+ "index": "b0ol",
+ "isDeleted": false,
+ "id": "NObpCvXI5ttnpfAvHDJ4I",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 631.25,
+ "y": 266.5,
+ "strokeColor": "#1971c2",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 312.5,
+ "seed": 399783692,
+ "groupIds": [
+ "jWlJ_Q_kUH1mkn9At1ziz"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723712743933,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 312.5
+ ]
+ ]
+ },
+ {
+ "type": "arrow",
+ "version": 427,
+ "versionNonce": 1594264343,
+ "index": "b0q",
+ "isDeleted": false,
+ "id": "iLkOUg7TmkslaYgU9SdaW",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 680.25,
+ "y": 365.4292272146313,
+ "strokeColor": "#2f9e44",
+ "backgroundColor": "#b2f2bb",
+ "width": 656.25,
+ "height": 0,
+ "seed": 1372353972,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723710349411,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 656.25,
+ 0
+ ]
+ ],
+ "elbowed": false
+ },
+ {
+ "type": "arrow",
+ "version": 578,
+ "versionNonce": 1850937399,
+ "index": "b0r",
+ "isDeleted": false,
+ "id": "fsE3yUyb3qu39XzmZCM6W",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 680.1636851166654,
+ "y": 312.7047592879178,
+ "strokeColor": "#2f9e44",
+ "backgroundColor": "#b2f2bb",
+ "width": 656.25,
+ "height": 0,
+ "seed": 1513965239,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723710349411,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 656.25,
+ 0
+ ]
+ ],
+ "elbowed": false
+ },
+ {
+ "type": "arrow",
+ "version": 549,
+ "versionNonce": 672264535,
+ "index": "b0s",
+ "isDeleted": false,
+ "id": "grxeuUUFSREmLSwqtGjYB",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 680.3337634762097,
+ "y": 261.54311806311057,
+ "strokeColor": "#2f9e44",
+ "backgroundColor": "#b2f2bb",
+ "width": 656.25,
+ "height": 0,
+ "seed": 1107660567,
+ "groupIds": [],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723710349411,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": "arrow",
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 656.25,
+ 0
+ ]
+ ],
+ "elbowed": false
+ },
+ {
+ "id": "enGL1MyA4g-tAkCJvk2CO",
+ "type": "text",
+ "x": 1368.75,
+ "y": 289,
+ "width": 245.81666564941406,
+ "height": 70,
+ "angle": 0,
+ "strokeColor": "#2f9e44",
+ "backgroundColor": "#b2f2bb",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b13",
+ "roundness": null,
+ "seed": 1578367961,
+ "version": 88,
+ "versionNonce": 1101544537,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1723711239934,
+ "link": null,
+ "locked": false,
+ "text": "continuous motion\nof x for each y",
+ "fontSize": 28,
+ "fontFamily": 5,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "continuous motion\nof x for each y",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "id": "OXiZBby7KE7-cWu_3uP2P",
+ "type": "text",
+ "x": 745.5,
+ "y": 631.5,
+ "width": 535,
+ "height": 35,
+ "angle": 0,
+ "strokeColor": "#1e1e1e",
+ "backgroundColor": "#b2f2bb",
+ "fillStyle": "solid",
+ "strokeWidth": 1,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "groupIds": [],
+ "frameId": null,
+ "index": "b14",
+ "roundness": null,
+ "seed": 536866169,
+ "version": 302,
+ "versionNonce": 503827127,
+ "isDeleted": false,
+ "boundElements": null,
+ "updated": 1723712090669,
+ "link": null,
+ "locked": false,
+ "text": "XRF spectra recorded at (10, 7) points",
+ "fontSize": 28,
+ "fontFamily": 5,
+ "textAlign": "left",
+ "verticalAlign": "top",
+ "containerId": null,
+ "originalText": "XRF spectra recorded at (10, 7) points",
+ "autoResize": true,
+ "lineHeight": 1.25
+ },
+ {
+ "type": "line",
+ "version": 226,
+ "versionNonce": 584020119,
+ "index": "b15",
+ "isDeleted": false,
+ "id": "Jvvzf5AW1-AXaLkRpLU0r",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 707.75,
+ "y": 204,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 599.75,
+ "height": 0,
+ "seed": 328296076,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 599.75,
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 190,
+ "versionNonce": 1217316953,
+ "index": "b16",
+ "isDeleted": false,
+ "id": "1oquHYfUWM7jFEPRmPJCd",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 707.4846985493728,
+ "y": 188.7146671758289,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 335175092,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 102,
+ "versionNonce": 1659061687,
+ "index": "b17",
+ "isDeleted": false,
+ "id": "Q3qiL31W6HDgEKYSUG44h",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 773.998812262217,
+ "y": 188.64039871145502,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 1348995380,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 158,
+ "versionNonce": 606491961,
+ "index": "b18",
+ "isDeleted": false,
+ "id": "fLh6-WEtUmLDbT4M3fmKK",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 840.5761866634622,
+ "y": 188.76089835307093,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 896199820,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 137,
+ "versionNonce": 1476359895,
+ "index": "b19",
+ "isDeleted": false,
+ "id": "d2dHO2MXV3EZOASR9evEu",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 907.3511757106554,
+ "y": 188.7219522011722,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 351632140,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 181,
+ "versionNonce": 1123632665,
+ "index": "b1A",
+ "isDeleted": false,
+ "id": "1nDRWGr4xXByQvmj4T75k",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 973.2610885627203,
+ "y": 188.61094508609264,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 202421132,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 160,
+ "versionNonce": 2025358327,
+ "index": "b1B",
+ "isDeleted": false,
+ "id": "uQCHrBIsIyOaHGD4_oPNZ",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1039.7842991070493,
+ "y": 188.73879469756733,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 1095393804,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 167,
+ "versionNonce": 1878727417,
+ "index": "b1C",
+ "isDeleted": false,
+ "id": "OAscfoYCZDCZw-bIYAeo8",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1106.30466623029,
+ "y": 188.67396988396297,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 119825548,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 146,
+ "versionNonce": 1964174615,
+ "index": "b1D",
+ "isDeleted": false,
+ "id": "7IG0ZYhtA4tBldWiNqe1S",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1172.4958883062177,
+ "y": 188.58912470689506,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 1623192332,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 225,
+ "versionNonce": 1269781465,
+ "index": "b1E",
+ "isDeleted": false,
+ "id": "Q_IPp2bqbuRgV_0b9k7cZ",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1305.247926274241,
+ "y": 188.81302467665165,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 1556442508,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ },
+ {
+ "type": "line",
+ "version": 155,
+ "versionNonce": 142815799,
+ "index": "b1F",
+ "isDeleted": false,
+ "id": "tAImMCvx-5ghWxDuw2u48",
+ "fillStyle": "solid",
+ "strokeWidth": 2,
+ "strokeStyle": "solid",
+ "roughness": 1,
+ "opacity": 100,
+ "angle": 0,
+ "x": 1238.6946591843853,
+ "y": 188.65582932287592,
+ "strokeColor": "#e03131",
+ "backgroundColor": "#b2f2bb",
+ "width": 0,
+ "height": 12,
+ "seed": 430513529,
+ "groupIds": [
+ "0eZqsfw3BdSiWeVivw9dn"
+ ],
+ "frameId": null,
+ "roundness": {
+ "type": 2
+ },
+ "boundElements": [],
+ "updated": 1723716614076,
+ "link": null,
+ "locked": false,
+ "startBinding": null,
+ "endBinding": null,
+ "lastCommittedPoint": null,
+ "startArrowhead": null,
+ "endArrowhead": null,
+ "points": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 12
+ ]
+ ]
+ }
+ ],
+ "appState": {
+ "gridSize": 20,
+ "gridStep": 5,
+ "gridModeEnabled": false,
+ "viewBackgroundColor": "#ffffff"
+ },
+ "files": {}
+}
\ No newline at end of file
diff --git a/base_classes/data/example2D_hist.png b/base_classes/data/example2D_hist.png
new file mode 100644
index 000000000..8b35aeafb
Binary files /dev/null and b/base_classes/data/example2D_hist.png differ