diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index 147d88812e..a0a9e945af 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -60,222 +60,181 @@ 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 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)``. + **Signals:** - 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. + .. index:: plotting - ``Available axes`` + .. admonition:: Defined by - 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. + * :ref:`DATA </NXdata/DATA-field>` fields + * the :ref:`signal </NXdata@signal-attribute>` attribute + * the :ref:`auxiliary_signals</NXdata@auxiliary_signals-attribute>` attribute - **Axes examples:** + 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. - ``1. Single-dimensional axes`` + .. admonition:: An example with three signals, one of which being the default - :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are typically one-dimensional arrays that span a single :ref:`DATA </NXdata/DATA-field>` dimension. + .. code-block:: - An example of this would be 2D data on a regular coordinate grid + 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] - .. code-block:: + **Axes:** - 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 + .. index:: axes (attribute) + .. index:: coordinates - In this example each data point ``data[i,j]`` has axis coordinates ``[x[i], y[j]]``. + .. admonition:: Defined by - Note that ``@x_indices`` and ``@y_indices`` attributes can be omitted in this case. However it is strongly encouraged to provide them. + * :ref:`AXISNAME </NXdata/AXISNAME-field>` fields + * the :ref:`axes </NXdata@axes-attribute>` attribute + * :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes - ``2. Data dimensions spanned by more than one axis`` + The fields and attributes are defined as follows - A common case is the need to specify alternative axes for the same dimension + 1. The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the axis coordinates associated with the signal values. - .. code-block:: + 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. - 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) + 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. - 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. + Additional requirements for a complete definition - ``3. Multi-dimensional axes`` + 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. - 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. + 2. The number of values in :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` must be equal to the rank of the corresponding + :ref:`AXISNAME </NXdata/AXISNAME-field>` field. - An example of this would be 2D scatter data where each data point has unique coordinates + 3. When :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` is missing for a given + :ref:`AXISNAME </NXdata/AXISNAME-field>` field, the positions of the :ref:`AXISNAME </NXdata/AXISNAME-field>` + field name in the :ref:`axes </NXdata@axes-attribute>` attribute are used. - .. code-block:: + 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>`. - 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 + 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>`. - 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. + 6. 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)`` + spanned by an :ref:`AXISNAME </NXdata/AXISNAME-field>` field 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. - 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 (XRF) + 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"] + 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] @@ -363,7 +322,9 @@ The ``AXISNAME_indices`` attribute is a single integer or an array of integers that defines which :ref:`DATA </NXdata/DATA-field>` - dimension(s) are spanned by the corresponding axis. The first dimension index is ``0`` (zero). + dimensions are spanned by the corresponding axis. The first dimension index is ``0`` (zero). + + The number of indices must be equal to the rank of the :ref:`AXISNAME </NXdata/AXISNAME-field>` field. When the ``AXISNAME_indices`` attribute is missing for a given :ref:`AXISNAME </NXdata/AXISNAME-field>` field, its value becomes the index (or indices) of the :ref:`AXISNAME </NXdata/AXISNAME-field>` name in the :ref:`axes </NXdata@axes-attribute>` attribute. @@ -392,8 +353,12 @@ - Coordinate values along one or more :ref:`DATA </NXdata/DATA-field>` dimensions. The shape of an ``AXISNAME`` field - must be equal to the shape of the :ref:`DATA </NXdata/DATA-field>` dimensions it spans. + Coordinate values along one or more :ref:`DATA </NXdata/DATA-field>` dimensions. + + The shape of an ``AXISNAME`` field must correspond to the shape of the :ref:`DATA </NXdata/DATA-field>` + dimensions it spans. This means that for each ``i`` in ``[0, AXISNAME.ndim)`` the number of data points + ``DATA.shape[AXISNAME_indices[i]]`` must be equal to the number of coordinates ``AXISNAME.shape[i]`` or the + number of bin edges ``AXISNAME.shape[i]+1`` in case of histogram data. As the upper case ``AXISNAME`` indicates, the names of the ``AXISNAME`` fields can be chosen :ref:`freely <validItemName>`. @@ -429,7 +394,7 @@ .. index:: plotting - + Data values to be used as the NeXus *plottable data*. As the upper case ``DATA`` indicates, the names of the ``DATA`` fields can be chosen :ref:`freely <validItemName>`. The :ref:`signal attribute </NXdata@signal-attribute>` and :ref:`auxiliary_signals attribute</NXdata@auxiliary_signals-attribute>` can be used to find all datasets in the ``NXdata`` @@ -473,10 +438,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 (axis). 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 0000000000..a2ab01a928 --- /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 + }, + { + "type": "text", + "version": 88, + "versionNonce": 1101544537, + "index": "b13", + "isDeleted": false, + "id": "enGL1MyA4g-tAkCJvk2CO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1368.75, + "y": 289, + "strokeColor": "#2f9e44", + "backgroundColor": "#b2f2bb", + "width": 245.81666564941406, + "height": 70, + "seed": 1578367961, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1723711239934, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 5, + "text": "continuous motion\nof x for each y", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "continuous motion\nof x for each y", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 302, + "versionNonce": 503827127, + "index": "b14", + "isDeleted": false, + "id": "OXiZBby7KE7-cWu_3uP2P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.5, + "y": 631.5, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "width": 535, + "height": 35, + "seed": 536866169, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1723712090669, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 5, + "text": "XRF spectra recorded at (10, 7) points", + "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 0000000000..8b35aeafb9 Binary files /dev/null and b/base_classes/data/example2D_hist.png differ