From 6a626b23de1df59db7bf2ce18590a1b7b9f18507 Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Mon, 10 Oct 2022 20:09:51 +0200 Subject: [PATCH 1/9] NXdata: improve documentation regarding axes --- applications/NXcanSAS.nxdl.xml | 2 +- base_classes/NXdata.nxdl.xml | 439 +++++++++++++++----------------- base_classes/NXlog.nxdl.xml | 4 +- base_classes/NXmonitor.nxdl.xml | 2 +- 4 files changed, 207 insertions(+), 240 deletions(-) diff --git a/applications/NXcanSAS.nxdl.xml b/applications/NXcanSAS.nxdl.xml index e562257c4d..6ff164f6ad 100644 --- a/applications/NXcanSAS.nxdl.xml +++ b/applications/NXcanSAS.nxdl.xml @@ -1215,7 +1215,7 @@ - the wavelengths field (as a dimension scale) corresponding to this transmission + the wavelengths field (as coordinates) corresponding to this transmission diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index 774c653253..644042cfa6 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -42,36 +42,140 @@ These symbols will be used below to coordinate fields with the same shape. - rank of the ``DATA`` field - length of the ``AXISNAME`` field + rank of the ``DATA`` field(s) length of the ``x`` field length of the ``y`` field length of the ``z`` field - - - .. index:: plotting - - Array of strings holding the :ref:`names <validItemName>` of additional - signals to be plotted with the default :ref:`signal </NXdata@signal-attribute>`. - These fields or links *must* exist and be direct children of this NXdata group. - - Each auxiliary signal needs to be of the same shape as the default signal. - - .. NIAC2018: - https://www.nexusformat.org/NIAC2018Minutes.html - - + + :ref:`NXdata` is used to implement one of the basic motivations of NeXus: to provide a default plot associated + to a NeXus group such as an :ref:`NXentry` group. :ref:`NXdata` describes plottable data (also referred to as + *signals* or *dependent variables*) and associated coordinates (also referred to as *axes* or *independent variables*). + + The actual names of the :ref:`DATA </NXdata/DATA-field>` and :ref:`AXISNAME </NXdata/AXISNAME-field>` fields + can be chosen :ref:`freely <validItemName>`, as indicated by the upper case (this is a common convention in all NeXus classes). + + .. note:: ``NXdata`` provides data and coordinates to be plotted but + 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. + + **Axes:** + + .. index:: axes (attribute) + .. index:: coordinates + + The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the coordinates associated to the :ref:`data </NXdata/DATA-field>` values. + The names of the fields to be used as coordinates are provided by the :ref:`axes </NXdata@axes-attribute>` attribute. + One :ref:`AXISNAME </NXdata/AXISNAME-field>` field provides the coordinates along one or more :ref:`data </NXdata/DATA-field>` dimensions. + The rank of an :ref:`AXISNAME </NXdata/AXISNAME-field>` must be equal to the number of dimensions it spans. + + The :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes define the :ref:`data </NXdata/DATA-field>` dimension(s) spanned + by the corresponding :ref:`AXISNAME </NXdata/AXISNAME-field>` fields. When the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute + is missing for an :ref:`AXISNAME </NXdata/AXISNAME-field>` field, it defaults to the index or indices of the :ref:`AXISNAME </NXdata/AXISNAME-field>` + name in the list of axis names provided by the :ref:`axes </NXdata@axes-attribute>` attribute. For this reason the string "." can be used in the + :ref:`axes </NXdata@axes-attribute>` list as a placeholder in order for other axis names to have the desired index. + + It is not recommended to omit the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes as ambiguity in assigning axes + to data dimensions can arise. In addition it is strongly discouraged to define the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute + for some :ref:`AXISNAME </NXdata/AXISNAME-field>` fields but not for others. A reader application can easily deal with this but it complicates human interpretation. + + **Uncertainties:** + + 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. + + **Examples:** + + 1. Three-dimensional data with coordinates and uncertainties:: + + data:NXdata + @signal = "data1" + @auxiliary_signals = ["data2", "data3"] + @axes = ["x", "z"] --> the order does NOT matter + @x_indices = 0 + @z_indices = 2 + data1: float[10,20,30] --> the default signal + data2: float[10,20,30] + data3: float[10,20,30] + x: float[10] --> coordinates along the first dimension + z: float[30] --> coordinates along the last dimension + 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] + + Note that the second data dimension has no coordinates. + + 2. An example with a data dimension with more than one axis:: + + data:NXdata + @signal = "data1" + @auxiliary_signals = ["data2", "data3"] + @axes = ["x", "y", "z", "time"] --> the order does NOT matter + @x_indices = 0 + @y_indices = 1 + @z_indices = 2 + @time_indices = 2 + data1: float[10,20,30] --> the default signal + data2: float[10,20,30] + data3: float[10,20,30] + x: float[10] --> coordinates along the first dimension + y: float[20] --> coordinates along the second dimension + z: float[30] --> coordinates along the last dimension + time: float[30] --> coordinates along the last dimension + + 3. An example with coordinates that span more than one data dimension:: + + data:NXdata + @signal = "data1" + @auxiliary_signals = ["data2", "data3"] + @axes = ["x", "y", "z"] --> the order does NOT matter + @x_indices = [0, 1] + @y_indices = [0, 1] + @z_indices = 2 + data1: float[10,20,30] --> the default signal + data2: float[10,20,30] + data3: float[10,20,30] + x: float[10,20] --> coordinates along the first two dimensions + y: float[10,20] --> coordinates along the first two dimensions + z: float[30] --> coordinates along the last dimension + + 4. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes:: + + data:NXdata + @signal = "data1" + @auxiliary_signals = ["data2", "data3"] + @axes = ["x", ".", "z"] --> the order matters + data1: float[10,20,30] --> the default signal + data2: float[10,20,30] + data3: float[10,20,30] + x: float[10] --> coordinates along the first dimension + z: float[30] --> coordinates along the last dimension + + This implicitely defines `@x_indices = 0` and `@z_indices = 2`. Note that the second data dimension has no coordinates. + + + + .. index:: find the default plottable data .. index:: plotting .. index:: signal attribute value - Declares which NeXus field is the default. - The value is the :ref:`name <validItemName>` of the data field to be plotted. - This field or link *must* exist and be a direct child of this NXdata group. + The value is the :ref:`name <validItemName>` of the signal that contains + the default plottable data. This field or link *must* exist and be a direct child + of this NXdata group. It is recommended (as of NIAC2014) to use this attribute rather than adding a signal attribute to the field. @@ -79,40 +183,18 @@ for a summary of the discussion. - + .. index:: plotting - Array of strings holding the :ref:`names <validItemName>` of - the independent data fields used in the default plot for all of - the dimensions of the :ref:`signal </NXdata@signal-attribute>` - as well as any :ref:`auxiliary signals </NXdata@auxiliary_signals-attribute>`. - - One name is provided for every dimension in the *signal* or *auxiliary signal* fields. - - The *axes* values are the names of fields or links that *must* exist and be direct - children of this NXdata group. - - An axis slice is specified using a field named ``AXISNAME_indices`` - as described below (where the text shown here as ``AXISNAME`` is to be - replaced by the actual field name). - - When no default axis is available for a particular dimension - of the plottable data, use a "." in that position. - Such as:: - - @axes=["time", ".", "."] - - Since there are three items in the list, the *signal* field - must be a three-dimensional array (rank=3). The first dimension - is described by the values of a one-dimensional array named ``time`` - while the other two dimensions have no fields to be used as dimension scales. + Array of strings holding the :ref:`names <validItemName>` of additional + signals to be plotted with the :ref:`default signal </NXdata@signal-attribute>`. + These fields or links *must* exist and be direct children of this NXdata group. - See examples provided on the NeXus wiki: - https://www.nexusformat.org/2014_axes_and_uncertainties.html + Each auxiliary signal needs to be of the same shape as the default signal. - If there are no axes at all (such as with a stack of images), - the axes attribute can be omitted. + .. NIAC2018: + https://www.nexusformat.org/NIAC2018Minutes.html @@ -122,172 +204,45 @@ --> - Each ``AXISNAME_indices`` attribute indicates the dependency - relationship of the ``AXISNAME`` field (where ``AXISNAME`` - is the name of a field that exists in this ``NXdata`` group) - with one or more dimensions of the plottable data. - - Integer array that defines the indices of the *signal* field - (that field will be a multidimensional array) - which need to be used in the *AXISNAME* field in - order to reference the corresponding axis value. - - The first index of an array is ``0`` (zero). - - Here, *AXISNAME* is to be replaced by the name of each - field described in the ``axes`` attribute. - An example with 2-D data, :math:`d(t,P)`, will illustrate:: - - data_2d:NXdata - @signal="data" - @axes=["time", "pressure"] - @time_indices=0 - @pressure_indices=1 - data: float[1000,20] - time: float[1000] - pressure: float[20] - - This attribute is to be provided in all situations. - However, if the indices attributes are missing - (such as for data files written before this specification), - file readers are encouraged to make their best efforts - to plot the data. - Thus the implementation of the - ``AXISNAME_indices`` attribute is based on the model of - "strict writer, liberal reader". + 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). + + When the ``AXISNAME_indices`` attribute is missing for an :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. + + .. note:: When ``AXISNAME_indices`` contains multiple integers, it must be saved as an actual array + of integers and not a comma separated string. + + + + + .. index:: plotting - .. note:: Attributes potentially containing multiple values - (axes and _indices) are to be written as string or integer arrays, - to avoid string parsing in reading applications. + The ``axes`` attribute is a list of strings which are the names of the :ref:`AXISNAME </NXdata/AXISNAME-field>` fields + that contain the values of the coordinates along the :ref:`data </NXdata/DATA-field>` dimensions. + + .. note:: When ``axes`` contains multiple strings, it must be saved as an actual array + of strings and not a single comma separated string. - - :ref:`NXdata` describes the plottable data and related dimension scales. - - .. index:: plotting - - It is strongly recommended that there is at least one :ref:`NXdata` - group in each :ref:`NXentry` group. - Note that the fields named ``AXISNAME`` and ``DATA`` - can be defined with different names. - (Upper case is used to indicate that the actual name is left to the user.) - The ``signal`` and ``axes`` attributes of the - ``data`` group define which items - are plottable data and which are *dimension scales*, respectively. - - :ref:`NXdata` is used to implement one of the basic motivations in NeXus, - to provide a default plot for the data of this :ref:`NXentry`. The actual data - might be stored in another group and (hard) linked to the :ref:`NXdata` group. - - * Each :ref:`NXdata` group will define one field as the default - plottable data. The value of the ``signal`` attribute names this field. - Additional fields may be used to describe the dimension scales and - uncertainities. - The ``auxiliary_signals`` attribute is a list of the other fields - to be plotted with the ``signal`` data. - * The plottable data may be of arbitrary rank up to a maximum - of ``NX_MAXRANK=32`` (for compatibility with backend file formats). - * The plottable data will be named as the value of - the group ``signal`` attribute, such as:: - - data:NXdata - @signal = "counts" - @axes = "mr" - @mr_indices = 0 - counts: float[100] --> the default dependent data - mr: float[100] --> the default independent data - - The field named in the ``signal`` attribute **must** exist, either - directly as a NeXus field or defined through a link. - - * The group ``axes`` attribute will name the - *dimension scale* associated with the plottable data. - - If available, the standard deviations of the data are to be - stored in a data set of the same rank and dimensions, with the name ``errors``. - - * For each data dimension, there should be a one-dimensional array - of the same length. - * These one-dimensional arrays are the *dimension scales* of the - data, *i.e*. the values of the independent variables at which the data - is measured, such as scattering angle or energy transfer. - - .. index:: link - .. index:: axes (attribute) - - The preferred method to associate each data dimension with - its respective dimension scale is to specify the field name - of each dimension scale in the group ``axes`` attribute as a string list. - Here is an example for a 2-D data set *data* plotted - against *time*, and *pressure*. (An additional *temperature* data set - is provided and could be selected as an alternate for the *pressure* axis.):: - - data_2d:NXdata - @signal="data" - @axes=["time", "pressure"] - @pressure_indices=1 - @temperature_indices=1 - @time_indices=0 - data: float[1000,20] - pressure: float[20] - temperature: float[20] - time: float[1000] - - .. rubric:: Old methods to identify the plottable data - - There are two older methods of associating - each data dimension to its respective dimension scale. - Both are now out of date and - should not be used when writing new data files. - However, client software should expect to see data files - written with any of these methods. - - * One method uses the ``axes`` - attribute to specify the names of each *dimension scale*. - - * The oldest method uses the ``axis`` attribute on each - *dimension scale* to identify - with an integer the axis whose value is the number of the dimension. - - .. index: !plot; axis label - plot, axis units - units - dimension scale - - Each axis of the plot may be labeled with information from the - dimension scale for that axis. The optional ``@long_name`` attribute - is provided as the axis label default. If ``@long_name`` is not - defined, then use the name of the dimension scale. A ``@units`` attribute, - if available, may be added to the axis label for further description. - See the section :ref:`Design-Units` for more information. - - .. index: !plot; axis title - - The optional ``title`` field, if available, provides a suggested - title for the plot. If no ``title`` field is found in the :ref:`NXdata` - group, look for a ``title`` field in the parent :ref:`NXentry` group, - with a fallback to displaying the path to the :ref:`NXdata` group. - - NeXus is about how to find and annotate the data to be plotted - but not to describe how the data is to be plotted. - (https://www.nexusformat.org/NIAC2018Minutes.html#nxdata-plottype--attribute) - + - Dimension scale defining an axis of the data. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. - - + Coordinate values along one or more :ref:`data </NXdata/DATA-field>` dimensions. The rank must be equal + to the number of dimensions it spans. + + As the upper case ``AXISNAME`` indicates, the names of the ``AXISNAME`` fields can be chosen :ref:`freely <validItemName>`. + The :ref:`axes </NXdata@axes-attribute>` attribute can be used to find all datasets in the + ``NXdata`` that contain coordinate values. + + Axis label + - A *dimension scale* must have a rank of 1 and has length ``n``. + Unit in which the coordinate values are expressed. + See the section :ref:`Design-Units` for more information. - - - Axis label + ``0|false``: single value, @@ -302,37 +257,26 @@ Index (positive integer) identifying this specific set of numbers. N.B. The ``axis`` attribute is the old way of designating a link. - Do not use the ``axes`` attribute with the ``axis`` attribute. - The ``axes`` *group* attribute is now preferred. + Do not use the :ref:`axes </NXdata@axes-attribute>` attribute with the ``axis`` attribute. + The :ref:`axes </NXdata@axes-attribute>` attribute is now preferred. - - - "Errors" (meaning *uncertainties* or *standard deviations*) - associated with any field named ``FIELDNAME`` in this ``NXdata`` - group (e.g. an axis, signal or auxiliary signal). - - The dimensions of the ``FIELDNAME_errors`` field must match - the dimensions of the ``FIELDNAME`` field. - - .. index:: plotting - - This field contains the data values to be used as the - NeXus *plottable data*. - Client is responsible for defining the dimensions of the data. - The name of this field may be changed to fit the circumstances. - Standard NeXus client tools will use the attributes to determine - how to use this field. + + 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`` + that contain data values. + + The maximum rank is ``32`` for compatibility with backend file formats. The rank (``dataRank``) of the ``data`` must satisfy ``1 <= dataRank <= NX_MAXRANK=32``. - At least one ``dim`` must have length ``n``. - Defines the names of the dimension scales + Defines the names of the coordinates (independent axes) for this data set as a colon-delimited array. - NOTE: The ``axes`` attribute is the preferred + NOTE: The :ref:`axes </NXdata@axes-attribute>` attribute is the preferred method of designating a link. - Do not use the ``axes`` attribute with the ``axis`` attribute. + Do not use the :ref:`axes </NXdata@axes-attribute>` attribute with the ``axis`` attribute. data label + + + "Errors" (meaning *uncertainties* or *standard deviations*) + associated with any field named ``FIELDNAME`` in this ``NXdata`` + group (e.g. an axis, signal or auxiliary signal). + + The dimensions of the ``FIELDNAME_errors`` field must match + the dimensions of the ``FIELDNAME`` field. + + Standard deviations of data values - @@ -370,13 +324,13 @@ - The ``errors`` must have - the same rank (``dataRank``) - as the ``data``. - At least one ``dim`` must have length "n". + The ``errors`` must have the same rank (``dataRank``) + as the ``data``. + + The elements in data are usually float values really. For @@ -391,15 +345,22 @@ An optional offset to apply to the values in data. + + Title for the plot. + + This is an array holding the values to use for the x-axis of - data. The units must be appropriate for the measurement. + data. The units must be appropriate for the measurement. + + This is a special case of a :ref:`AXISNAME field </NXdata/AXISNAME-field>` + kept for backward compatiblity. @@ -408,7 +369,10 @@ This is an array holding the values to use for the y-axis of - data. The units must be appropriate for the measurement. + data. The units must be appropriate for the measurement. + + This is a special case of a :ref:`AXISNAME field </NXdata/AXISNAME-field>` + kept for backward compatiblity. @@ -417,7 +381,10 @@ This is an array holding the values to use for the z-axis of - data. The units must be appropriate for the measurement. + data. The units must be appropriate for the measurement. + + This is a special case of a :ref:`AXISNAME field </NXdata/AXISNAME-field>` + kept for backward compatiblity. diff --git a/base_classes/NXlog.nxdl.xml b/base_classes/NXlog.nxdl.xml index 813d0e918d..2a71845650 100644 --- a/base_classes/NXlog.nxdl.xml +++ b/base_classes/NXlog.nxdl.xml @@ -49,8 +49,8 @@ can be used to accomodate non standard clocks. - This method of storing logged data helps to distinguish - instances in which a variable is a dimension scale of the data, in which case it is stored + This method of storing logged data helps to distinguish instances in which a variable contains signal or + coordinate values of plottable data, in which case it is stored in an :ref:`NXdata` group, and instances in which it is logged during the run, when it should be stored in an :ref:`NXlog` group. diff --git a/base_classes/NXmonitor.nxdl.xml b/base_classes/NXmonitor.nxdl.xml index fce17418f2..e6444a28e9 100644 --- a/base_classes/NXmonitor.nxdl.xml +++ b/base_classes/NXmonitor.nxdl.xml @@ -30,7 +30,7 @@ A monitor of incident beam data. It is similar to the :ref:`NXdata` groups containing - monitor data and its associated dimension scale, e.g. time_of_flight or + monitor data and its associated coordinates, e.g. time_of_flight or wavelength in pulsed neutron instruments. However, it may also include integrals, or scalar monitor counts, which are often used in both in both pulsed and steady-state instrumentation. From e905a3215e781c7f779ad42b20c8999be44ba4ef Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Fri, 16 Jun 2023 17:52:23 +0200 Subject: [PATCH 2/9] NXdata "axis coordinates" instead of "coordinates" and also -> sometimes --- applications/NXcanSAS.nxdl.xml | 2 +- base_classes/NXdata.nxdl.xml | 4 ++-- base_classes/NXlog.nxdl.xml | 2 +- base_classes/NXmonitor.nxdl.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/applications/NXcanSAS.nxdl.xml b/applications/NXcanSAS.nxdl.xml index 6ff164f6ad..9d3f3b19d3 100644 --- a/applications/NXcanSAS.nxdl.xml +++ b/applications/NXcanSAS.nxdl.xml @@ -1215,7 +1215,7 @@ - the wavelengths field (as coordinates) corresponding to this transmission + the wavelengths field (as axis coordinates) corresponding to this transmission diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index 644042cfa6..7373949f84 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -50,8 +50,8 @@ :ref:`NXdata` is used to implement one of the basic motivations of NeXus: to provide a default plot associated - to a NeXus group such as an :ref:`NXentry` group. :ref:`NXdata` describes plottable data (also referred to as - *signals* or *dependent variables*) and associated coordinates (also referred to as *axes* or *independent variables*). + to a NeXus group such as an :ref:`NXentry` group. :ref:`NXdata` describes plottable data (sometimes referred to as + *signals* or *dependent variables*) and associated axis coordinates (sometimes referred to as *axes* or *independent variables*). The actual names of the :ref:`DATA </NXdata/DATA-field>` and :ref:`AXISNAME </NXdata/AXISNAME-field>` fields can be chosen :ref:`freely <validItemName>`, as indicated by the upper case (this is a common convention in all NeXus classes). diff --git a/base_classes/NXlog.nxdl.xml b/base_classes/NXlog.nxdl.xml index 2a71845650..11cb8da1c5 100644 --- a/base_classes/NXlog.nxdl.xml +++ b/base_classes/NXlog.nxdl.xml @@ -50,7 +50,7 @@ This method of storing logged data helps to distinguish instances in which a variable contains signal or - coordinate values of plottable data, in which case it is stored + axis coordinate values of plottable data, in which case it is stored in an :ref:`NXdata` group, and instances in which it is logged during the run, when it should be stored in an :ref:`NXlog` group. diff --git a/base_classes/NXmonitor.nxdl.xml b/base_classes/NXmonitor.nxdl.xml index e6444a28e9..1494db65ed 100644 --- a/base_classes/NXmonitor.nxdl.xml +++ b/base_classes/NXmonitor.nxdl.xml @@ -30,7 +30,7 @@ A monitor of incident beam data. It is similar to the :ref:`NXdata` groups containing - monitor data and its associated coordinates, e.g. time_of_flight or + monitor data and its associated axis coordinates, e.g. time_of_flight or wavelength in pulsed neutron instruments. However, it may also include integrals, or scalar monitor counts, which are often used in both in both pulsed and steady-state instrumentation. From 83d4b4389b148897911cf2312bb56c04e8963fad Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Tue, 20 Jun 2023 13:34:01 +0200 Subject: [PATCH 3/9] add comment and signal vs. coordinates to the third example --- base_classes/NXdata.nxdl.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index 7373949f84..e1e0cfbe8d 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -150,6 +150,9 @@ y: float[10,20] --> coordinates along the first two dimensions z: float[30] --> coordinates along the last dimension + Note that each signal value ``data1[i,j,k]`` has axis coordinates ``[x[i,j], y[i,j], z[k]]``. + The same goes for the auxiliary signals ``data2`` and ``data3``. + 4. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes:: data:NXdata @@ -162,7 +165,7 @@ x: float[10] --> coordinates along the first dimension z: float[30] --> coordinates along the last dimension - This implicitely defines `@x_indices = 0` and `@z_indices = 2`. Note that the second data dimension has no coordinates. + This implicitely defines ``@x_indices = 0`` and ``@z_indices = 2``. Note that the second data dimension has no coordinates. From f83e7f894cbf524d3e54d9192ced4d10e5765514 Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Tue, 20 Jun 2023 19:31:31 +0200 Subject: [PATCH 4/9] rephrase purpose of NXdata --- base_classes/NXdata.nxdl.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index e1e0cfbe8d..1a7713b3bb 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -49,9 +49,9 @@ - :ref:`NXdata` is used to implement one of the basic motivations of NeXus: to provide a default plot associated - to a NeXus group such as an :ref:`NXentry` group. :ref:`NXdata` describes plottable data (sometimes referred to as - *signals* or *dependent variables*) and associated axis coordinates (sometimes referred to as *axes* or *independent variables*). + The :ref:`NXdata` class is designed to encapsulate all the information required for a set of data to be plotted. + NXdata groups contain plottable data (sometimes referred to as *signals* or *dependent variables*) and their + associated axis coordinates (sometimes referred to as *axes* or *independent variables*)." The actual names of the :ref:`DATA </NXdata/DATA-field>` and :ref:`AXISNAME </NXdata/AXISNAME-field>` fields can be chosen :ref:`freely <validItemName>`, as indicated by the upper case (this is a common convention in all NeXus classes). From 2215f9553958192d4170fc7e0017d06e14f0a7d5 Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Tue, 20 Jun 2023 21:24:01 +0200 Subject: [PATCH 5/9] NXdata add simple example --- base_classes/NXdata.nxdl.xml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index 1a7713b3bb..6dddcd81e0 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -95,7 +95,16 @@ **Examples:** - 1. Three-dimensional data with coordinates and uncertainties:: + 1. Two-dimensional data with coordinates on both data dimensions:: + + data:NXdata + @signal = "data" + @axes = ["y", "x"] --> the order does matter + data: float[10,20] --> the default signal + y: float[10] --> coordinates along the first dimension + x: float[20] --> coordinates along the second dimension + + 2. Three-dimensional data with coordinates and uncertainties:: data:NXdata @signal = "data1" @@ -116,7 +125,7 @@ Note that the second data dimension has no coordinates. - 2. An example with a data dimension with more than one axis:: + 3. An example with a data dimension with more than one axis:: data:NXdata @signal = "data1" @@ -134,7 +143,9 @@ z: float[30] --> coordinates along the last dimension time: float[30] --> coordinates along the last dimension - 3. An example with coordinates that span more than one data dimension:: + Note that ``time`` is an alternative axis of ``z`` for the last dimension (or vice versa). + + 4. An example with coordinates that span more than one data dimension:: data:NXdata @signal = "data1" @@ -153,7 +164,7 @@ Note that each signal value ``data1[i,j,k]`` has axis coordinates ``[x[i,j], y[i,j], z[k]]``. The same goes for the auxiliary signals ``data2`` and ``data3``. - 4. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes:: + 5. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes:: data:NXdata @signal = "data1" From 975dc0a55d02e016ed19c62d6365869412fb6aaf Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Tue, 20 Jun 2023 21:24:52 +0200 Subject: [PATCH 6/9] make the "axes" section more readable --- base_classes/NXdata.nxdl.xml | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index 6dddcd81e0..b219ac260e 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -73,21 +73,25 @@ .. index:: axes (attribute) .. index:: coordinates - The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the coordinates associated to the :ref:`data </NXdata/DATA-field>` values. - The names of the fields to be used as coordinates are provided by the :ref:`axes </NXdata@axes-attribute>` attribute. - One :ref:`AXISNAME </NXdata/AXISNAME-field>` field provides the coordinates along one or more :ref:`data </NXdata/DATA-field>` dimensions. - The rank of an :ref:`AXISNAME </NXdata/AXISNAME-field>` must be equal to the number of dimensions it spans. - - The :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes define the :ref:`data </NXdata/DATA-field>` dimension(s) spanned - by the corresponding :ref:`AXISNAME </NXdata/AXISNAME-field>` fields. When the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute - is missing for an :ref:`AXISNAME </NXdata/AXISNAME-field>` field, it defaults to the index or indices of the :ref:`AXISNAME </NXdata/AXISNAME-field>` - name in the list of axis names provided by the :ref:`axes </NXdata@axes-attribute>` attribute. For this reason the string "." can be used in the - :ref:`axes </NXdata@axes-attribute>` list as a placeholder in order for other axis names to have the desired index. - - It is not recommended to omit the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes as ambiguity in assigning axes - to data dimensions can arise. In addition it is strongly discouraged to define the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute - for some :ref:`AXISNAME </NXdata/AXISNAME-field>` fields but not for others. A reader application can easily deal with this but it complicates human interpretation. - + The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the axis coordinates associated with the data values. The names of all :ref:`AXISNAME </NXdata/AXISNAME-field>` + fields are listed in the :ref:`axes </NXdata@axes-attribute>` attribute. + + `Rank` + + :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are typically one-dimensional arrays, which annotate one of the dimensions. However, the fields can also have a rank greater than 1, + in which case the rank of each :ref:`AXISNAME </NXdata/AXISNAME-field>` must be equal to the number of data dimensions it spans. + + `Dimensions` + + The data dimensions annotated by an :ref:`AXISNAME </NXdata/AXISNAME-field>` field are defined by the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute. + When this attribute is missing, the position(s) of the :ref:`AXISNAME </NXdata/AXISNAME-field>` string in the :ref:`axes </NXdata@axes-attribute>` attribute are used. + + When all :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are one-dimensional, and none of the data dimensions have more than one axis, the + :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes are often omitted. If one of the data dimensions has no :ref:`AXISNAME </NXdata/AXISNAME-field>` field, + the string “.” can be used in the corresponding index of the axes list. + + When providing :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes it is recommended to do it for all axes. + **Uncertainties:** Standard deviations on data values as well as coordinates can be provided by :ref:`FIELDNAME_errors </NXdata/FIELDNAME_errors-field>` fields From 7c24e6237b28968e49d4c481620cf002ac821d5f Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Wed, 21 Jun 2023 09:58:49 +0200 Subject: [PATCH 7/9] reword description of example 5 --- base_classes/NXdata.nxdl.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index b219ac260e..a9157ce5c2 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -168,7 +168,8 @@ Note that each signal value ``data1[i,j,k]`` has axis coordinates ``[x[i,j], y[i,j], z[k]]``. The same goes for the auxiliary signals ``data2`` and ``data3``. - 5. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes:: + 5. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes + and a data dimension without axis coordinates:: data:NXdata @signal = "data1" From d585b4816589fd98087e12437edc3e73e5d1ccf7 Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Wed, 21 Jun 2023 18:29:08 +0200 Subject: [PATCH 8/9] merge examples in between documentation --- base_classes/NXdata.nxdl.xml | 244 +++++++++++++++++++++-------------- 1 file changed, 146 insertions(+), 98 deletions(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index a9157ce5c2..fcdd033405 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -51,10 +51,10 @@ The :ref:`NXdata` class is designed to encapsulate all the information required for a set of data to be plotted. NXdata groups contain plottable data (sometimes referred to as *signals* or *dependent variables*) and their - associated axis coordinates (sometimes referred to as *axes* or *independent variables*)." + associated axis coordinates (sometimes referred to as *axes* or *independent variables*). The actual names of the :ref:`DATA </NXdata/DATA-field>` and :ref:`AXISNAME </NXdata/AXISNAME-field>` fields - can be chosen :ref:`freely <validItemName>`, as indicated by the upper case (this is a common convention in all NeXus classes). + can be chosen :ref:`freely <validItemName>`, as indicated by the upper case (this is a common convention in all NeXus classes). .. note:: ``NXdata`` provides data and coordinates to be plotted but does not describe how the data is to be plotted or even the dimensionality of the plot. @@ -66,122 +66,170 @@ 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. - + 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 - The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the axis coordinates associated with the data values. The names of all :ref:`AXISNAME </NXdata/AXISNAME-field>` - fields are listed in the :ref:`axes </NXdata@axes-attribute>` attribute. + The :ref:`AXISNAME </NXdata/AXISNAME-field>` fields contain the axis coordinates associated with the data values. + The names of all :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are listed in the + :ref:`axes </NXdata@axes-attribute>` attribute. `Rank` - :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are typically one-dimensional arrays, which annotate one of the dimensions. However, the fields can also have a rank greater than 1, - in which case the rank of each :ref:`AXISNAME </NXdata/AXISNAME-field>` must be equal to the number of data dimensions it spans. + :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are typically one-dimensional arrays, which annotate one of the dimensions. - `Dimensions` + An example of this would be - The data dimensions annotated by an :ref:`AXISNAME </NXdata/AXISNAME-field>` field are defined by the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute. - When this attribute is missing, the position(s) of the :ref:`AXISNAME </NXdata/AXISNAME-field>` string in the :ref:`axes </NXdata@axes-attribute>` attribute are used. + .. code-block:: - When all :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are one-dimensional, and none of the data dimensions have more than one axis, the - :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes are often omitted. If one of the data dimensions has no :ref:`AXISNAME </NXdata/AXISNAME-field>` field, - the string “.” can be used in the corresponding index of the axes list. + data:NXdata + @signal = "data" + @axes = ["x", "y"] --> the order matters + data: float[10,20] + x: float[10] --> coordinates along the first dimension + y: float[20] --> coordinates along the second dimension - When providing :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes it is recommended to do it for all axes. + In this example each data point ``data[i,j]`` has axis coordinates ``[x[i], y[j]]``. - **Uncertainties:** + However, the fields can also have a rank greater than 1, in which case the rank of each + :ref:`AXISNAME </NXdata/AXISNAME-field>` must be equal to the number of data dimensions it spans. - 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 this would be - **Examples:** + .. code-block:: - 1. Two-dimensional data with coordinates on both data dimensions:: - data:NXdata - @signal = "data" - @axes = ["y", "x"] --> the order does matter - data: float[10,20] --> the default signal - y: float[10] --> coordinates along the first dimension - x: float[20] --> coordinates along the second dimension + @signal = "data" + @axes = ["x", "y"] --> the order does NOT matter + @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 dimension + + In this example each data point ``data[i,j]`` has axis coordinates ``[x[i,j], y[i,j]]``. + + `Dimensions` + + The data dimensions annotated by an :ref:`AXISNAME </NXdata/AXISNAME-field>` field are defined by the + :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attribute. When this attribute is missing, + the position(s) of the :ref:`AXISNAME </NXdata/AXISNAME-field>` string in the + :ref:`axes </NXdata@axes-attribute>` attribute are used. + + When all :ref:`AXISNAME </NXdata/AXISNAME-field>` fields are one-dimensional, and none of the data dimensions + have more than one axis, the :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes + are often omitted. If one of the data dimensions has no :ref:`AXISNAME </NXdata/AXISNAME-field>` field, + the string “.” can be used in the corresponding index of the axes list. + + An example of this would be + + .. code-block:: - 2. Three-dimensional data with coordinates and uncertainties:: - data:NXdata - @signal = "data1" - @auxiliary_signals = ["data2", "data3"] - @axes = ["x", "z"] --> the order does NOT matter - @x_indices = 0 - @z_indices = 2 - data1: float[10,20,30] --> the default signal - data2: float[10,20,30] - data3: float[10,20,30] - x: float[10] --> coordinates along the first dimension - z: float[30] --> coordinates along the last dimension - 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] - - Note that the second data dimension has no coordinates. - - 3. An example with a data dimension with more than one axis:: + @signal = "data" + @axes = ["x", ".", "z"] --> the order matters + data: float[10,20,30] + x: float[10] --> coordinates along the first dimension + z: float[30] --> coordinates along the third dimension + + When using :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` this becomes + + .. code-block:: data:NXdata - @signal = "data1" - @auxiliary_signals = ["data2", "data3"] - @axes = ["x", "y", "z", "time"] --> the order does NOT matter - @x_indices = 0 - @y_indices = 1 - @z_indices = 2 - @time_indices = 2 - data1: float[10,20,30] --> the default signal - data2: float[10,20,30] - data3: float[10,20,30] - x: float[10] --> coordinates along the first dimension - y: float[20] --> coordinates along the second dimension - z: float[30] --> coordinates along the last dimension - time: float[30] --> coordinates along the last dimension - - Note that ``time`` is an alternative axis of ``z`` for the last dimension (or vice versa). - - 4. An example with coordinates that span more than one data dimension:: - + @signal = "data" + @axes = ["x", "z"] --> the order does NOT matter + data: float[10,20,30] + @x_indices = 0 + @z_indices = 2 + x: float[10] --> coordinates along the first dimension + z: float[30] --> coordinates along the third dimension + + When providing :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes it is recommended + to do it for all axes. + + `Non-trivial axes` + + What follows are two examples where :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes + cannot be omitted. + + The first is an example where data dimensions have alternative axis coordinates. The NXdata group represents + a stack of images collected at different energies. The ``wavelength`` is an alternative axis of ``energy`` + for the last dimension (or vice versa). + + .. code-block:: + data:NXdata - @signal = "data1" - @auxiliary_signals = ["data2", "data3"] - @axes = ["x", "y", "z"] --> the order does NOT matter - @x_indices = [0, 1] - @y_indices = [0, 1] - @z_indices = 2 - data1: float[10,20,30] --> the default signal - data2: float[10,20,30] - data3: float[10,20,30] - x: float[10,20] --> coordinates along the first two dimensions - y: float[10,20] --> coordinates along the first two dimensions - z: float[30] --> coordinates along the last dimension - - Note that each signal value ``data1[i,j,k]`` has axis coordinates ``[x[i,j], y[i,j], z[k]]``. - The same goes for the auxiliary signals ``data2`` and ``data3``. - - 5. An example without :ref:`AXISNAME_indices </NXdata@AXISNAME_indices-attribute>` attributes - and a data dimension without axis coordinates:: - + @signal = "data" + @axes = ["x", "y", "energy", "wavelength"] --> the order does NOT matter + @x_indices = 0 + @y_indices = 1 + @energy_indices = 2 + @wavelength_indices = 2 + data: float[10,20,30] + x: float[10] --> coordinates along the first dimension + y: float[20] --> coordinates along the second dimension + energy: float[30] --> coordinates along the third dimension + wavelength: float[30] --> coordinates along the third dimension + + The second is an example with coordinates that span more than one dimension. The NXdata group represents data + from 2D mesh scans performed at multiple energies. Each data point ``data[i,j,k]`` has axis coordinates + ``[x[i,j,k], y[i,j,k], energy[k]]``. + + .. code-block:: + data:NXdata - @signal = "data1" - @auxiliary_signals = ["data2", "data3"] - @axes = ["x", ".", "z"] --> the order matters - data1: float[10,20,30] --> the default signal - data2: float[10,20,30] - data3: float[10,20,30] - x: float[10] --> coordinates along the first dimension - z: float[30] --> coordinates along the last dimension + @signal = "data" + @axes = ["x", "y", "energy"] --> the order does NOT matter + @x_indices = [0, 1, 2] + @y_indices = [0, 1, 2] + @energy_indices = 2 + data: float[10,20,30] + x: float[10,20,30] --> coordinates along all dimensions + y: float[10,20,30] --> coordinates along all dimensions + energy: float[30] --> coordinates along the third dimension + + **Uncertainties:** - This implicitely defines ``@x_indices = 0`` and ``@z_indices = 2``. Note that the second data dimension has no coordinates. + 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] @@ -192,7 +240,7 @@ .. index:: plotting .. index:: signal attribute value - The value is the :ref:`name <validItemName>` of the signal that contains + The value is the :ref:`name <validItemName>` of the signal that contains the default plottable data. This field or link *must* exist and be a direct child of this NXdata group. @@ -206,7 +254,7 @@ .. index:: plotting - Array of strings holding the :ref:`names <validItemName>` of additional + Array of strings holding the :ref:`names <validItemName>` of additional signals to be plotted with the :ref:`default signal </NXdata@signal-attribute>`. These fields or links *must* exist and be direct children of this NXdata group. @@ -251,7 +299,7 @@ Coordinate values along one or more :ref:`data </NXdata/DATA-field>` dimensions. The rank must be equal to the number of dimensions it spans. - As the upper case ``AXISNAME`` indicates, the names of the ``AXISNAME`` fields can be chosen :ref:`freely <validItemName>`. + As the upper case ``AXISNAME`` indicates, the names of the ``AXISNAME`` fields can be chosen :ref:`freely <validItemName>`. The :ref:`axes </NXdata@axes-attribute>` attribute can be used to find all datasets in the ``NXdata`` that contain coordinate values. @@ -286,7 +334,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>` + 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`` that contain data values. From 977717fb6177ca3851f550980283500638573418 Mon Sep 17 00:00:00 2001 From: woutdenolf Date: Fri, 6 Oct 2023 15:19:06 +0200 Subject: [PATCH 9/9] fix typo --- base_classes/NXdata.nxdl.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_classes/NXdata.nxdl.xml b/base_classes/NXdata.nxdl.xml index fcdd033405..2c9d69620d 100644 --- a/base_classes/NXdata.nxdl.xml +++ b/base_classes/NXdata.nxdl.xml @@ -120,7 +120,7 @@ @y_indices = [0, 1] data: float[10,20] x: float[10,20] --> coordinates along both dimensions - y: float[10,20] --> coordinates along both dimension + y: float[10,20] --> coordinates along both dimensions In this example each data point ``data[i,j]`` has axis coordinates ``[x[i,j], y[i,j]]``.