diff --git a/+tests/+system/NwbTestInterface.m b/+tests/+system/NwbTestInterface.m index 76462840..f2b45a4c 100644 --- a/+tests/+system/NwbTestInterface.m +++ b/+tests/+system/NwbTestInterface.m @@ -15,12 +15,8 @@ function setupClass(testCase) methods (TestMethodSetup) function setupMethod(testCase) - testCase.applyFixture(matlab.unittest.fixtures.WorkingFolderFixture); - schemaPath = fullfile(testCase.root, 'nwb-schema'); - - generateCore(... - fullfile(schemaPath, 'hdmf-common-schema', 'common', 'namespace.yaml'),... - fullfile(schemaPath, 'core', 'nwb.namespace.yaml')); + testCase.applyFixture(matlab.unittest.fixtures.WorkingFolderFixture); + generateCore(); testCase.file = NwbFile( ... 'session_description', 'a test NWB File', ... 'identifier', 'TEST123', ... diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..eb953a23 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "nwb-schema/2.2.5"] + path = nwb-schema/2.2.5 + url = https://github.com/NeurodataWithoutBorders/nwb-schema +[submodule "nwb-schema/2.2.4"] + path = nwb-schema/2.2.4 + url = https://github.com/NeurodataWithoutBorders/nwb-schema +[submodule "nwb-schema/2.2.3"] + path = nwb-schema/2.2.3 + url = https://github.com/NeurodataWithoutBorders/nwb-schema +[submodule "nwb-schema/2.2.2"] + path = nwb-schema/2.2.2 + url = https://github.com/NeurodataWithoutBorders/nwb-schema +[submodule "nwb-schema/2.2.1"] + path = nwb-schema/2.2.1 + url = https://github.com/NeurodataWithoutBorders/nwb-schema +[submodule "nwb-schema/2.2.0"] + path = nwb-schema/2.2.0 + url = https://github.com/NeurodataWithoutBorders/nwb-schema diff --git a/README.md b/README.md index 47a9be5b..8f88575f 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ A Matlab interface for reading and writing Neurodata Without Borders (NWB) 2.0 f Download the current release of MatNWB from the [MatNWB releases page](https://github.com/NeurodataWithoutBorders/matnwb/releases) or from the [![View NeurodataWithoutBorders/matnwb on File Exchange](https://www.mathworks.com/matlabcentral/images/matlab-file-exchange.svg)](https://www.mathworks.com/matlabcentral/fileexchange/67741-neurodatawithoutborders-matnwb). You can also check out the latest development version via ```bash -git clone https://github.com/NeurodataWithoutBorders/matnwb.git +git clone --recurse-submodules https://github.com/NeurodataWithoutBorders/matnwb.git ``` ### Step 2: Generate the API @@ -19,37 +19,32 @@ From the Matlab command line, add MatNWB to the Matlab path and generate the cor ```matlab cd matnwb addpath(genpath(pwd)); -generateCore(); % generate core namespace located in the repository. +generateCore(); % generate the most recent nwb-schema release. ``` ### Optional: Generate MatNWB code for extensions -The `generateCore` command also takes variable arguments from any extensions. +The `generateExtension` command generates extension classes given a file path to the extension's namespace. ```matlab -generateCore('schema/core/nwb.namespace.yaml', '.../my_extensions1.namespace.yaml',...); -``` - -You can also generate extensions without generating the core classes in this way: - -```matlab -generateExtension('my_extension.namespace.yaml'); +generateExtension('schema/core/nwb.namespace.yaml', '.../my_extensions1.namespace.yaml',...); ``` Generated Matlab code will be put a `+types` subdirectory. This is a Matlab package. When the `+types` folder is accessible to the Matlab path, the generated code will be used for reading NWBFiles. ```matlab -nwb=nwbRead('data.nwb'); +nwb = nwbRead('data.nwb'); ``` -### Optional: Download the NWB format schema +### Optional: Generate an older core schema -Download the current release of the NWB format schema from the [nwb-schema releases page](https://github.com/NeurodataWithoutBorders/nwb-schema/releases) or check out the latest development via +The `generateCore` command can generate older versions of the nwb schema. -```bash -git clone --recursive https://github.com/NeurodataWithoutBorders/nwb-schema.git +```matlab +generateCore('2.2.1'); % generate schema 2.2.1 ``` -Then re-run `generateCore()` to update the API from the updated schema. + +Currently, only schemas 2.2.x are supported (2.1.0 and 2.0.1 are not supported at this time). ## Tutorials diff --git a/generateCore.m b/generateCore.m index c83d6f15..08ccbd40 100644 --- a/generateCore.m +++ b/generateCore.m @@ -1,11 +1,11 @@ -function generateCore(varargin) +function generateCore(version) % GENERATECORE Generate Matlab classes from NWB core schema files % GENERATECORE() Generate classes (Matlab m-files) from the -% NWB:N core namespace file. +% NWB:N core namespace file. By default, generates off of the most recent nwb-schema +% release. % -% GENERATECORE(core_or_extension_paths,...) Generate classes for the -% core namespace as well as one or more extenstions. Each input filename -% should be an NWB namespace file. +% GENERATECORE(version) Generate classes for the +% core namespace of that version % % A cache of schema data is generated in the 'namespaces' subdirectory in % the current working directory. This is for allowing cross-referencing @@ -16,25 +16,30 @@ function generateCore(varargin) % % Example: % generateCore(); -% generateCore('schema/core/nwb.namespace.yaml'); -% generateCore('schema/my_ext/myext.namespace.yaml'); +% generateCore('2.2.3'); % % See also GENERATEEXTENSION + if nargin == 0 - [nwbLocation, ~, ~] = fileparts(mfilename('fullpath')); - schemaPath = fullfile(nwbLocation, 'nwb-schema'); - corePath = fullfile(schemaPath, 'core', 'nwb.namespace.yaml'); - commonPath = fullfile(schemaPath, 'hdmf-common-schema', ... - 'common', 'namespace.yaml'); - - if 2 == exist(commonPath, 'file') - generateExtension(commonPath); - end - - generateExtension(corePath); + version = '2.2.5'; else - for i=1:length(varargin) - generateExtension(varargin{i}); - end + validateattributes(version, {'char'}, {'scalartext'}); end + +[nwbLocation, ~, ~] = fileparts(mfilename('fullpath')); +schemaPath = fullfile(nwbLocation, 'nwb-schema', version); +corePath = fullfile(schemaPath, 'core', 'nwb.namespace.yaml'); +commonPath = fullfile(schemaPath,... + 'hdmf-common-schema', ... + 'common',... + 'namespace.yaml'); +assert(2 == exist(corePath, 'file'),... + 'MATNWB:nwbread:missingSpec',... + 'Cannot find suitable core namespace for schema version `%s`',... + version); + +if 2 == exist(commonPath, 'file') + generateExtension(commonPath); +end +generateExtension(corePath); end \ No newline at end of file diff --git a/generateExtension.m b/generateExtension.m index 0023fa2a..2062bdf0 100644 --- a/generateExtension.m +++ b/generateExtension.m @@ -1,6 +1,6 @@ -function generateExtension(source) +function generateExtension(varargin) % GENERATEEXTENSION Generate Matlab classes from NWB extension schema file -% GENERATECORE(extension_path...) Generate classes +% GENERATEEXTENSION(extension_path...) Generate classes % (Matlab m-files) from one or more NWB:N schema extension namespace % files. A registry of already generated core types is used to resolve % dependent types. @@ -13,19 +13,22 @@ function generateExtension(source) % current working directory. % % Example: -% generateCore('schema\core\nwb.namespace.yaml'); -% generateExtension('schema\myext\myextension.namespace.yaml') +% generateExtension('schema\myext\myextension.namespace.yaml', 'schema\myext2\myext2.namespace.yaml'); % % See also GENERATECORE -validateattributes(source, {'char', 'string'}, {'scalartext'}); - -[localpath, ~, ~] = fileparts(source); -assert(2 == exist(source, 'file'),... - 'MATNWB:FILE', 'Path to file `%s` could not be found.', source); -fid = fopen(source); -namespaceText = fread(fid, '*char') .'; -fclose(fid); - -Namespace = spec.generate(namespaceText, localpath); -file.writeNamespace(Namespace.name); +for i = 1:length(varargin) + source = varargin{i}; + validateattributes(source, {'char', 'string'}, {'scalartext'}); + + [localpath, ~, ~] = fileparts(source); + assert(2 == exist(source, 'file'),... + 'MATNWB:FILE', 'Path to file `%s` could not be found.', source); + fid = fopen(source); + namespaceText = fread(fid, '*char') .'; + fclose(fid); + + Namespace = spec.generate(namespaceText, localpath); + file.writeNamespace(Namespace.name); + rehash(); +end end \ No newline at end of file diff --git a/nwb-schema/2.2.0 b/nwb-schema/2.2.0 new file mode 160000 index 00000000..62c73400 --- /dev/null +++ b/nwb-schema/2.2.0 @@ -0,0 +1 @@ +Subproject commit 62c73400565afc28f67ede4f2e86023c33167cf8 diff --git a/nwb-schema/2.2.1 b/nwb-schema/2.2.1 new file mode 160000 index 00000000..5d6160ec --- /dev/null +++ b/nwb-schema/2.2.1 @@ -0,0 +1 @@ +Subproject commit 5d6160eccc6e4c786fc328c8f1d227420f933bda diff --git a/nwb-schema/2.2.2 b/nwb-schema/2.2.2 new file mode 160000 index 00000000..7931e59a --- /dev/null +++ b/nwb-schema/2.2.2 @@ -0,0 +1 @@ +Subproject commit 7931e59ad1e97433ce4a450fa5bc2dab81af6f8d diff --git a/nwb-schema/2.2.3 b/nwb-schema/2.2.3 new file mode 160000 index 00000000..6b2ca916 --- /dev/null +++ b/nwb-schema/2.2.3 @@ -0,0 +1 @@ +Subproject commit 6b2ca91695929866b7de257b79a316788eece1ae diff --git a/nwb-schema/2.2.4 b/nwb-schema/2.2.4 new file mode 160000 index 00000000..24fba617 --- /dev/null +++ b/nwb-schema/2.2.4 @@ -0,0 +1 @@ +Subproject commit 24fba6174ddbad171ee5bb824edfa31f86b1b16d diff --git a/nwb-schema/2.2.5 b/nwb-schema/2.2.5 new file mode 160000 index 00000000..aa7702e1 --- /dev/null +++ b/nwb-schema/2.2.5 @@ -0,0 +1 @@ +Subproject commit aa7702e1cc5be2b85f19206e0d1d50bc4bd7e296 diff --git a/nwb-schema/core/UpdateFromUpstream.sh b/nwb-schema/core/UpdateFromUpstream.sh deleted file mode 100755 index 759570fb..00000000 --- a/nwb-schema/core/UpdateFromUpstream.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -thirdparty_module_name='nwb-schema' - -upstream_git_url='git://github.com/NeurodataWithoutBorders/nwb-schema' -upstream_git_branch='dev' -github_compare=true - -snapshot_author_name='nwb-schema Upstream' -snapshot_author_email='neurodatawithoutborders@googlegroups.com' - -snapshot_redact_cmd='' -snapshot_relative_path='schema' -snapshot_paths=' - core - ' - -source "${BASH_SOURCE%/*}/../../utilities/maintenance/UpdateThirdPartyFromUpstream.sh" -update_from_upstream diff --git a/nwb-schema/core/nwb.base.yaml b/nwb-schema/core/nwb.base.yaml deleted file mode 100644 index f926cab3..00000000 --- a/nwb-schema/core/nwb.base.yaml +++ /dev/null @@ -1,206 +0,0 @@ -datasets: -- neurodata_type_def: NWBData - neurodata_type_inc: Data - doc: An abstract data type for a dataset. - -- neurodata_type_def: Image - neurodata_type_inc: NWBData - dtype: numeric - dims: - - - x - - y - - - x - - y - - r, g, b - - - x - - y - - r, g, b, a - shape: - - - null - - null - - - null - - null - - 3 - - - null - - null - - 4 - doc: An abstract data type for an image. Shape can be 2-D (x, y), or 3-D where the - third dimension can have three or four elements, e.g. (x, y, (r, g, b)) or - (x, y, (r, g, b, a)). - attributes: - - name: resolution - dtype: float32 - doc: Pixel resolution of the image, in pixels per centimeter. - required: false - - name: description - dtype: text - doc: Description of the image. - required: false - -groups: -- neurodata_type_def: NWBContainer - neurodata_type_inc: Container - doc: An abstract data type for a generic container storing collections of data and - metadata. Base type for all data and metadata containers. - -- neurodata_type_def: NWBDataInterface - neurodata_type_inc: NWBContainer - doc: An abstract data type for a generic container storing collections of data, - as opposed to metadata. - -- neurodata_type_def: TimeSeries - neurodata_type_inc: NWBDataInterface - doc: General purpose time series. - attributes: - - name: description - dtype: text - default_value: no description - doc: Description of the time series. - required: false - - name: comments - dtype: text - default_value: no comments - doc: Human-readable comments about the TimeSeries. This second descriptive field - can be used to store additional information, or descriptive information if the - primary description field is populated with a computer-readable string. - required: false - datasets: - - name: data - dims: - - - num_times - - - num_times - - num_DIM2 - - - num_times - - num_DIM2 - - num_DIM3 - - - num_times - - num_DIM2 - - num_DIM3 - - num_DIM4 - shape: - - - null - - - null - - null - - - null - - null - - null - - - null - - null - - null - - null - doc: Data values. Data can be in 1-D, 2-D, 3-D, or 4-D. The first dimension - should always represent time. This can also be used to store binary data - (e.g., image frames). This can also be a link to data stored in an external file. - attributes: - - name: conversion - dtype: float32 - default_value: 1.0 - doc: Scalar to multiply each element in data to convert it to the specified 'unit'. - If the data are stored in acquisition system units or other units - that require a conversion to be interpretable, multiply the data by 'conversion' - to convert the data to the specified 'unit'. e.g. if the data acquisition system - stores values in this object as signed 16-bit integers (int16 range - -32,768 to 32,767) that correspond to a 5V range (-2.5V to 2.5V), and the data - acquisition system gain is 8000X, then the 'conversion' multiplier to get from - raw data acquisition values to recorded volts is 2.5/32768/8000 = 9.5367e-9. - required: false - - name: resolution - dtype: float32 - default_value: -1.0 - doc: Smallest meaningful difference between values in data, stored in the specified - by unit, e.g., the change in value of the least significant bit, or a larger - number if signal noise is known to be present. If unknown, use -1.0. - required: false - - name: unit - dtype: text - doc: Base unit of measurement for working with the data. Actual stored values are - not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - - name: starting_time - dtype: float64 - doc: Timestamp of the first sample in seconds. When timestamps are uniformly - spaced, the timestamp of the first sample can be specified and all subsequent - ones calculated from the sampling rate attribute. - quantity: '?' - attributes: - - name: rate - dtype: float32 - doc: Sampling rate, in Hz. - - name: unit - dtype: text - value: seconds - doc: Unit of measurement for time, which is fixed to 'seconds'. - - name: timestamps - dtype: float64 - dims: - - num_times - shape: - - null - doc: Timestamps for samples stored in data, in seconds, relative to the - common experiment master-clock stored in NWBFile.timestamps_reference_time. - quantity: '?' - attributes: - - name: interval - dtype: int32 - value: 1 - doc: Value is '1' - - name: unit - dtype: text - value: seconds - doc: Unit of measurement for timestamps, which is fixed to 'seconds'. - - name: control - dtype: uint8 - dims: - - num_times - shape: - - null - doc: Numerical labels that apply to each time point in data for the purpose of - querying and slicing data by these values. If present, the length of this - array should be the same size as the first dimension of data. - quantity: '?' - - name: control_description - dtype: text - dims: - - num_control_values - shape: - - null - doc: Description of each control value. Must be present if control is present. - If present, control_description[0] should describe time points where control == 0. - quantity: '?' - groups: - - name: sync - doc: Lab-specific time and sync information as provided directly from hardware - devices and that is necessary for aligning all acquired time information to - a common timebase. The timestamp array stores time in the common timebase. - This group will usually only be populated in TimeSeries that are - stored external to the NWB file, in files storing raw data. Once timestamp - data is calculated, the contents of 'sync' are mostly for archival purposes. - quantity: '?' - -- neurodata_type_def: ProcessingModule - neurodata_type_inc: NWBContainer - doc: A collection of processed data. - attributes: - - name: description - dtype: text - doc: Description of this collection of processed data. - groups: - - neurodata_type_inc: NWBDataInterface - doc: Data objects stored in this collection. - quantity: '*' - - neurodata_type_inc: DynamicTable - doc: Tables stored in this collection. - quantity: '*' - -- neurodata_type_def: Images - neurodata_type_inc: NWBDataInterface - default_name: Images - doc: A collection of images. - attributes: - - name: description - dtype: text - doc: Description of this collection of images. - datasets: - - neurodata_type_inc: Image - doc: Images stored in this collection. - quantity: '+' diff --git a/nwb-schema/core/nwb.behavior.yaml b/nwb-schema/core/nwb.behavior.yaml deleted file mode 100644 index 300b48db..00000000 --- a/nwb-schema/core/nwb.behavior.yaml +++ /dev/null @@ -1,116 +0,0 @@ -groups: -- neurodata_type_def: SpatialSeries - neurodata_type_inc: TimeSeries - doc: "Direction, e.g., of gaze or travel, or position. The TimeSeries::data field\ - \ is a 2D array storing position or direction relative to some reference frame.\ - \ Array structure: [num measurements] [num dimensions]. Each SpatialSeries has\ - \ a text dataset reference_frame that indicates the zero-position, or the zero-axes\ - \ for direction. For example, if representing gaze direction, 'straight-ahead'\ - \ might be a specific pixel on the monitor, or some other point in space. For\ - \ position data, the 0,0 point might be the top-left corner of an enclosure, as\ - \ viewed from the tracking camera. The unit of data will indicate how to interpret\ - \ SpatialSeries values." - datasets: - - name: data - dtype: numeric - dims: - - - num_times - - - num_times - - num_features - shape: - - - null - - - null - - null - doc: 1-D or 2-D array storing position or direction relative to some reference frame. - attributes: - - name: unit - dtype: text - default_value: meters - doc: Base unit of measurement for working with the data. The default value - is 'meters'. Actual stored values are not necessarily stored in these units. - To access the data in these units, multiply 'data' by 'conversion'. - required: false - - name: reference_frame - dtype: text - doc: Description defining what exactly 'straight-ahead' means. - quantity: '?' - -- neurodata_type_def: BehavioralEpochs - neurodata_type_inc: NWBDataInterface - default_name: BehavioralEpochs - doc: TimeSeries for storing behavioral epochs. The objective of this and the other - two Behavioral interfaces (e.g. BehavioralEvents and BehavioralTimeSeries) is - to provide generic hooks for software tools/scripts. This allows a tool/script - to take the output one specific interface (e.g., UnitTimes) and plot that data - relative to another data modality (e.g., behavioral events) without having to - define all possible modalities in advance. Declaring one of these interfaces means - that one or more TimeSeries of the specified type is published. These TimeSeries - should reside in a group having the same name as the interface. For example, if - a BehavioralTimeSeries interface is declared, the module will have one or more - TimeSeries defined in the module sub-group 'BehavioralTimeSeries'. BehavioralEpochs - should use IntervalSeries. BehavioralEvents is used for irregular events. BehavioralTimeSeries - is for continuous data. - groups: - - neurodata_type_inc: IntervalSeries - doc: IntervalSeries object containing start and stop times of epochs. - quantity: '*' - -- neurodata_type_def: BehavioralEvents - neurodata_type_inc: NWBDataInterface - default_name: BehavioralEvents - doc: TimeSeries for storing behavioral events. See description of BehavioralEpochs - for more details. - groups: - - neurodata_type_inc: TimeSeries - doc: TimeSeries object containing behavioral events. - quantity: '*' - -- neurodata_type_def: BehavioralTimeSeries - neurodata_type_inc: NWBDataInterface - default_name: BehavioralTimeSeries - doc: TimeSeries for storing Behavoioral time series data. See description of BehavioralEpochs - for more details. - groups: - - neurodata_type_inc: TimeSeries - doc: TimeSeries object containing continuous behavioral data. - quantity: '*' - -- neurodata_type_def: PupilTracking - neurodata_type_inc: NWBDataInterface - default_name: PupilTracking - doc: Eye-tracking data, representing pupil size. - groups: - - neurodata_type_inc: TimeSeries - doc: TimeSeries object containing time series data on pupil size. - quantity: '+' - -- neurodata_type_def: EyeTracking - neurodata_type_inc: NWBDataInterface - default_name: EyeTracking - doc: Eye-tracking data, representing direction of gaze. - groups: - - neurodata_type_inc: SpatialSeries - doc: SpatialSeries object containing data measuring direction of gaze. - quantity: '*' - -- neurodata_type_def: CompassDirection - neurodata_type_inc: NWBDataInterface - default_name: CompassDirection - doc: With a CompassDirection interface, a module publishes a SpatialSeries object - representing a floating point value for theta. The SpatialSeries::reference_frame - field should indicate what direction corresponds to 0 and which is the direction - of rotation (this should be clockwise). The si_unit for the SpatialSeries should - be radians or degrees. - groups: - - neurodata_type_inc: SpatialSeries - doc: SpatialSeries object containing direction of gaze travel. - quantity: '*' - -- neurodata_type_def: Position - neurodata_type_inc: NWBDataInterface - default_name: Position - doc: Position data, whether along the x, x/y or x/y/z axis. - groups: - - neurodata_type_inc: SpatialSeries - doc: SpatialSeries object containing position data. - quantity: '+' diff --git a/nwb-schema/core/nwb.device.yaml b/nwb-schema/core/nwb.device.yaml deleted file mode 100644 index d883e59a..00000000 --- a/nwb-schema/core/nwb.device.yaml +++ /dev/null @@ -1,14 +0,0 @@ -groups: -- neurodata_type_def: Device - neurodata_type_inc: NWBContainer - doc: Metadata about a data acquisition device, e.g., recording system, electrode, microscope. - attributes: - - name: description - dtype: text - doc: Description of the device (e.g., model, firmware version, processing software version, etc.) - as free-form text. - required: false - - name: manufacturer - dtype: text - doc: The name of the manufacturer of the device. - required: false diff --git a/nwb-schema/core/nwb.ecephys.yaml b/nwb-schema/core/nwb.ecephys.yaml deleted file mode 100644 index 90c8655d..00000000 --- a/nwb-schema/core/nwb.ecephys.yaml +++ /dev/null @@ -1,324 +0,0 @@ -groups: -- neurodata_type_def: ElectricalSeries - neurodata_type_inc: TimeSeries - doc: A time series of acquired voltage data from extracellular recordings. - The data field is an int or float array storing data in volts. The first - dimension should always represent time. The second dimension, if present, - should represent channels. - datasets: - - name: data - dtype: numeric - dims: - - - num_times - - - num_times - - num_channels - - - num_times - - num_channels - - num_samples - shape: - - - null - - - null - - null - - - null - - null - - null - doc: Recorded voltage data. - attributes: - - name: unit - dtype: text - value: volts - doc: Base unit of measurement for working with the data. This value is fixed to - 'volts'. Actual stored values are not necessarily stored in these units. To - access the data in these units, multiply 'data' by 'conversion' and - 'channel_conversion' (if present). - - name: electrodes - neurodata_type_inc: DynamicTableRegion - doc: DynamicTableRegion pointer to the electrodes that this time series was generated from. - - name: channel_conversion - dtype: float32 - dims: - - num_channels - shape: - - null - doc: Channel-specific conversion factor. Multiply the data in the 'data' dataset by these - values along the channel axis (as indicated by axis attribute) AND by the global - conversion factor in the 'conversion' attribute of 'data' to get the data values in - Volts, i.e, data in Volts = data * data.conversion * channel_conversion. This - approach allows for both global and per-channel data conversion factors needed - to support the storage of electrical recordings as native values generated by data - acquisition systems. If this dataset is not present, then there is no channel-specific - conversion factor, i.e. it is 1 for all channels. - quantity: '?' - attributes: - - name: axis - dtype: int32 - value: 1 - doc: The zero-indexed axis of the 'data' dataset that the channel-specific conversion - factor corresponds to. This value is fixed to 1. - -- neurodata_type_def: SpikeEventSeries - neurodata_type_inc: ElectricalSeries - doc: "Stores snapshots/snippets of recorded spike events (i.e., threshold crossings). This - may also be raw data, as reported by ephys hardware. If so, the TimeSeries::description - field should describe how events were detected. All SpikeEventSeries should - reside in a module (under EventWaveform interface) even if the spikes were reported - and stored by hardware. All events span the same recording channels and store - snapshots of equal duration. TimeSeries::data array structure: [num events] - [num channels] [num samples] (or [num events] [num samples] for single electrode)." - datasets: - - name: data - dtype: numeric - dims: - - - num_events - - num_samples - - - num_events - - num_channels - - num_samples - shape: - - - null - - null - - - null - - null - - null - doc: Spike waveforms. - attributes: - - name: unit - dtype: text - value: volts - doc: Unit of measurement for waveforms, which is fixed to 'volts'. - - name: timestamps - dtype: float64 - dims: - - num_times - shape: - - null - doc: Timestamps for samples stored in data, in seconds, relative to the - common experiment master-clock stored in NWBFile.timestamps_reference_time. - Timestamps are required for the events. Unlike for TimeSeries, timestamps are - required for SpikeEventSeries and are thus re-specified here. - attributes: - - name: interval - dtype: int32 - value: 1 - doc: Value is '1' - - name: unit - dtype: text - value: seconds - doc: Unit of measurement for timestamps, which is fixed to 'seconds'. - -- neurodata_type_def: FeatureExtraction - neurodata_type_inc: NWBDataInterface - default_name: FeatureExtraction - doc: Features, such as PC1 and PC2, that are extracted from signals stored in a - SpikeEventSeries or other source. - datasets: - - name: description - dtype: text - dims: - - num_features - shape: - - null - doc: Description of features (eg, ''PC1'') for each of the extracted features. - - name: features - dtype: float32 - dims: - - num_events - - num_channels - - num_features - shape: - - null - - null - - null - doc: Multi-dimensional array of features extracted from each event. - - name: times - dtype: float64 - dims: - - num_events - shape: - - null - doc: Times of events that features correspond to (can be a link). - - name: electrodes - neurodata_type_inc: DynamicTableRegion - doc: DynamicTableRegion pointer to the electrodes that this time series was generated from. - -- neurodata_type_def: EventDetection - neurodata_type_inc: NWBDataInterface - default_name: EventDetection - doc: Detected spike events from voltage trace(s). - datasets: - - name: detection_method - dtype: text - doc: Description of how events were detected, such as voltage threshold, or dV/dT - threshold, as well as relevant values. - - name: source_idx - dtype: int32 - dims: - - num_events - shape: - - null - doc: Indices (zero-based) into source ElectricalSeries::data array corresponding - to time of event. ''description'' should define what is meant by time of - event (e.g., .25 ms before action potential peak, zero-crossing time, etc). - The index points to each event from the raw data. - - name: times - dtype: float64 - dims: - - num_events - shape: - - null - doc: Timestamps of events, in seconds. - attributes: - - name: unit - dtype: text - value: seconds - doc: Unit of measurement for event times, which is fixed to 'seconds'. - links: - - name: source_electricalseries - target_type: ElectricalSeries - doc: Link to the ElectricalSeries that this data was calculated from. Metadata - about electrodes and their position can be read from that ElectricalSeries so - it's not necessary to include that information here. - -- neurodata_type_def: EventWaveform - neurodata_type_inc: NWBDataInterface - default_name: EventWaveform - doc: Represents either the waveforms of detected events, as extracted from a raw - data trace in /acquisition, or the event waveforms that were stored during experiment - acquisition. - groups: - - neurodata_type_inc: SpikeEventSeries - doc: SpikeEventSeries object(s) containing detected spike event waveforms. - quantity: '*' - -- neurodata_type_def: FilteredEphys - neurodata_type_inc: NWBDataInterface - default_name: FilteredEphys - doc: Electrophysiology data from one or more channels that has been subjected to filtering. - Examples of filtered data include Theta and Gamma (LFP has its own interface). - FilteredEphys modules publish an ElectricalSeries for each filtered channel or - set of channels. The name of each ElectricalSeries is arbitrary but should be - informative. The source of the filtered data, whether this is from analysis of - another time series or as acquired by hardware, should be noted in each's TimeSeries::description - field. There is no assumed 1::1 correspondence between filtered ephys signals - and electrodes, as a single signal can apply to many nearby electrodes, and one - electrode may have different filtered (e.g., theta and/or gamma) signals represented. - Filter properties should be noted in the ElectricalSeries. - groups: - - neurodata_type_inc: ElectricalSeries - doc: ElectricalSeries object(s) containing filtered electrophysiology data. - quantity: '+' - -- neurodata_type_def: LFP - neurodata_type_inc: NWBDataInterface - default_name: LFP - doc: LFP data from one or more channels. The electrode map in each published ElectricalSeries - will identify which channels are providing LFP data. Filter properties should - be noted in the ElectricalSeries description or comments field. - groups: - - neurodata_type_inc: ElectricalSeries - doc: ElectricalSeries object(s) containing LFP data for one or more channels. - quantity: '+' - -- neurodata_type_def: ElectrodeGroup - neurodata_type_inc: NWBContainer - doc: A physical grouping of electrodes, e.g. a shank of an array. - attributes: - - name: description - dtype: text - doc: Description of this electrode group. - - name: location - dtype: text - doc: Location of electrode group. Specify the area, layer, comments on estimation - of area/layer, etc. Use standard atlas names for anatomical regions when possible. - datasets: - - name: position - dtype: - - name: x - dtype: float32 - doc: x coordinate - - name: y - dtype: float32 - doc: y coordinate - - name: z - dtype: float32 - doc: z coordinate - doc: stereotaxic or common framework coordinates - quantity: '?' - links: - - name: device - target_type: Device - doc: Link to the device that was used to record from this electrode group. - -# The types below have been deprecated -- neurodata_type_def: ClusterWaveforms - neurodata_type_inc: NWBDataInterface - default_name: ClusterWaveforms - doc: DEPRECATED The mean waveform shape, including standard deviation, of the different - clusters. Ideally, the waveform analysis should be performed on data that is only - high-pass filtered. This is a separate module because it is expected to require - updating. For example, IMEC probes may require different storage requirements - to store/display mean waveforms, requiring a new interface or an extension of - this one. - datasets: - - name: waveform_filtering - dtype: text - doc: Filtering applied to data before generating mean/sd - - name: waveform_mean - dtype: float32 - dims: - - num_clusters - - num_samples - shape: - - null - - null - doc: The mean waveform for each cluster, using the same indices for each wave - as cluster numbers in the associated Clustering module (i.e, cluster 3 is in - array slot [3]). Waveforms corresponding to gaps in cluster sequence should - be empty (e.g., zero- filled) - - name: waveform_sd - dtype: float32 - dims: - - num_clusters - - num_samples - shape: - - null - - null - doc: Stdev of waveforms for each cluster, using the same indices as in mean - links: - - name: clustering_interface - target_type: Clustering - doc: Link to Clustering interface that was the source of the clustered data - -- neurodata_type_def: Clustering - neurodata_type_inc: NWBDataInterface - default_name: Clustering - doc: DEPRECATED Clustered spike data, whether from automatic clustering tools (e.g., - klustakwik) or as a result of manual sorting. - datasets: - - name: description - dtype: text - doc: Description of clusters or clustering, (e.g. cluster 0 is noise, clusters - curated using Klusters, etc) - - name: num - dtype: int32 - dims: - - num_events - shape: - - null - doc: Cluster number of each event - - name: peak_over_rms - dtype: float32 - dims: - - num_clusters - shape: - - null - doc: Maximum ratio of waveform peak to RMS on any channel in the cluster (provides - a basic clustering metric). - - name: times - dtype: float64 - dims: - - num_events - shape: - - null - doc: Times of clustered events, in seconds. This may be a link to times field - in associated FeatureExtraction module. diff --git a/nwb-schema/core/nwb.epoch.yaml b/nwb-schema/core/nwb.epoch.yaml deleted file mode 100644 index c4164691..00000000 --- a/nwb-schema/core/nwb.epoch.yaml +++ /dev/null @@ -1,44 +0,0 @@ -groups: -- neurodata_type_def: TimeIntervals - neurodata_type_inc: DynamicTable - doc: A container for aggregating epoch data and the TimeSeries that each epoch applies - to. - datasets: - - name: start_time - neurodata_type_inc: VectorData - dtype: float32 - doc: Start time of epoch, in seconds. - - name: stop_time - neurodata_type_inc: VectorData - dtype: float32 - doc: Stop time of epoch, in seconds. - - name: tags - neurodata_type_inc: VectorData - dtype: text - doc: User-defined tags that identify or categorize events. - quantity: '?' - - name: tags_index - neurodata_type_inc: VectorIndex - doc: Index for tags. - quantity: '?' - - name: timeseries - neurodata_type_inc: VectorData - dtype: - - name: idx_start - dtype: int32 - doc: Start index into the TimeSeries 'data' and 'timestamp' datasets of the - referenced TimeSeries. The first dimension of those arrays is always time. - - name: count - dtype: int32 - doc: Number of data samples available in this time series, during this epoch. - - name: timeseries - dtype: - target_type: TimeSeries - reftype: object - doc: the TimeSeries that this index applies to. - doc: An index into a TimeSeries object. - quantity: '?' - - name: timeseries_index - neurodata_type_inc: VectorIndex - doc: Index for timeseries. - quantity: '?' diff --git a/nwb-schema/core/nwb.file.yaml b/nwb-schema/core/nwb.file.yaml deleted file mode 100644 index 2376f36d..00000000 --- a/nwb-schema/core/nwb.file.yaml +++ /dev/null @@ -1,439 +0,0 @@ -groups: -- neurodata_type_def: NWBFile - neurodata_type_inc: NWBContainer - name: root - doc: An NWB:N file storing cellular-based neurophysiology data from a single - experimental session. - attributes: - - name: nwb_version - dtype: text - value: 2.2.5 - doc: File version string. Use semantic versioning, e.g. 1.2.1. This will be the - name of the format with trailing major, minor and patch numbers. - datasets: - - name: file_create_date - dtype: isodatetime - dims: - - num_modifications - shape: - - null - doc: 'A record of the date the file was created and of subsequent modifications. - The date is stored in UTC with local timezone offset as ISO 8601 - extended formatted strings: 2018-09-28T14:43:54.123+02:00. Dates stored in - UTC end in "Z" with no timezone offset. Date accuracy is up to milliseconds. - The file can be created after the experiment was run, so this may differ from - the experiment start time. Each modification to the nwb file adds a new entry - to the array.' - - name: identifier - dtype: text - doc: A unique text identifier for the file. For example, concatenated lab name, - file creation date/time and experimentalist, or a hash of these and/or other - values. The goal is that the string should be unique to all other files. - - name: session_description - dtype: text - doc: A description of the experimental session and data in the file. - - name: session_start_time - dtype: isodatetime - doc: 'Date and time of the experiment/session start. The date is stored - in UTC with local timezone offset as ISO 8601 extended formatted string: - 2018-09-28T14:43:54.123+02:00. - Dates stored in UTC end in "Z" with no timezone offset. Date accuracy is - up to milliseconds.' - - name: timestamps_reference_time - dtype: isodatetime - doc: 'Date and time corresponding to time zero of all timestamps. The - date is stored in UTC with local timezone offset as ISO 8601 extended formatted - string: 2018-09-28T14:43:54.123+02:00. Dates stored in UTC end in "Z" with - no timezone offset. Date accuracy is up to milliseconds. All times stored - in the file use this time as reference (i.e., time zero).' - groups: - - name: acquisition - doc: Data streams recorded from the system, including ephys, ophys, tracking, - etc. This group should be read-only after the experiment is completed and - timestamps are corrected to a common timebase. The data stored here may be links - to raw data stored in external NWB files. This will allow keeping bulky raw - data out of the file while preserving the option of keeping some/all in the - file. Acquired data includes tracking and experimental data streams - (i.e., everything measured from the system). If bulky data is stored in the /acquisition - group, the data can exist in a separate NWB file that is linked to by the file - being used for processing and analysis. - groups: - - neurodata_type_inc: NWBDataInterface - doc: Acquired, raw data. - quantity: '*' - - neurodata_type_inc: DynamicTable - doc: Tabular data that is relevent to acquisition - quantity: '*' - - name: analysis - doc: Lab-specific and custom scientific analysis of data. There is no defined - format for the content of this group - the format is up to the individual user/lab. - To facilitate sharing analysis data between labs, the contents here - should be stored in standard types (e.g., neurodata_types) and appropriately documented. - The file can store lab-specific and custom data analysis without - restriction on its form or schema, reducing data formatting restrictions on - end users. Such data should be placed in the analysis group. The analysis data - should be documented so that it could be shared with other labs. - groups: - - neurodata_type_inc: NWBContainer - doc: Custom analysis results. - quantity: '*' - - neurodata_type_inc: DynamicTable - doc: Tabular data that is relevent to data stored in analysis - quantity: '*' - - name: scratch - doc: 'A place to store one-off analysis results. Data placed here is not intended for - sharing. By placing data here, users acknowledge that there is no guarantee that - their data meets any standard.' - quantity: '?' - groups: - - neurodata_type_inc: NWBContainer - doc: Any one-off containers - quantity: '*' - - neurodata_type_inc: DynamicTable - doc: Any one-off tables - quantity: '*' - datasets: - - neurodata_type_inc: ScratchData - doc: Any one-off datasets - quantity: '*' - - name: processing - doc: "The home for ProcessingModules. These modules perform intermediate analysis\ - \ of data that is necessary to perform before scientific analysis. Examples\ - \ include spike clustering, extracting position from tracking data, stitching\ - \ together image slices. ProcessingModules can be large\ - \ and express many data sets from relatively complex analysis (e.g., spike detection\ - \ and clustering) or small, representing extraction of position information\ - \ from tracking video, or even binary lick/no-lick decisions. Common software\ - \ tools (e.g., klustakwik, MClust) are expected to read/write data here. \ - \ 'Processing' refers to intermediate analysis of the acquired data to make\ - \ it more amenable to scientific analysis." - groups: - - neurodata_type_inc: ProcessingModule - doc: Intermediate analysis of acquired data. - quantity: '*' - - name: stimulus - doc: 'Data pushed into the system (eg, video stimulus, sound, voltage, etc) and - secondary representations of that data (eg, measurements of something used as - a stimulus). This group should be made read-only after experiment complete and timestamps - are corrected to common timebase. Stores both presented stimuli and stimulus - templates, the latter in case the same stimulus is presented multiple times, - or is pulled from an external stimulus library. Stimuli are here - defined as any signal that is pushed into the system as part of the experiment - (eg, sound, video, voltage, etc). Many different experiments can use the same - stimuli, and stimuli can be re-used during an experiment. The stimulus group - is organized so that one version of template stimuli can be stored and these - be used multiple times. These templates can exist in the present file or can - be linked to a remote library file.' - groups: - - name: presentation - doc: Stimuli presented during the experiment. - groups: - - neurodata_type_inc: TimeSeries - doc: TimeSeries objects containing data of presented stimuli. - quantity: '*' - - name: templates - doc: 'Template stimuli. Timestamps in templates are based on stimulus - design and are relative to the beginning of the stimulus. When templates are - used, the stimulus instances must convert presentation times to the experiment`s - time reference frame.' - groups: - - neurodata_type_inc: TimeSeries - doc: TimeSeries objects containing template data of presented stimuli. - quantity: '*' - - name: general - doc: "Experimental metadata, including protocol, notes and description of hardware\ - \ device(s). The metadata stored in this section should be used to\ - \ describe the experiment. Metadata necessary for interpreting the data is stored\ - \ with the data. General experimental metadata, including animal\ - \ strain, experimental protocols, experimenter, devices, etc, are stored under\ - \ 'general'. Core metadata (e.g., that required to interpret data fields) is\ - \ stored with the data itself, and implicitly defined by the file specification\ - \ (e.g., time is in seconds). The strategy used here for storing non-core metadata\ - \ is to use free-form text fields, such as would appear in sentences or paragraphs\ - \ from a Methods section. Metadata fields are text to enable them to be more\ - \ general, for example to represent ranges instead of numerical values. Machine-readable\ - \ metadata is stored as attributes to these free-form datasets. All entries\ - \ in the below table are to be included when data is present. Unused groups\ - \ (e.g., intracellular_ephys in an optophysiology experiment) should not be\ - \ created unless there is data to store within them." - datasets: - - name: data_collection - dtype: text - doc: Notes about data collection and analysis. - quantity: '?' - - name: experiment_description - dtype: text - doc: General description of the experiment. - quantity: '?' - - name: experimenter - dtype: text - doc: Name of person(s) who performed the experiment. Can also specify roles - of different people involved. - quantity: '?' - dims: - - num_experimenters - shape: - - null - - name: institution - dtype: text - doc: Institution(s) where experiment was performed. - quantity: '?' - - name: keywords - dtype: text - dims: - - num_keywords - shape: - - null - doc: Terms to search over. - quantity: '?' - - name: lab - dtype: text - doc: Laboratory where experiment was performed. - quantity: '?' - - name: notes - dtype: text - doc: Notes about the experiment. - quantity: '?' - - name: pharmacology - dtype: text - doc: Description of drugs used, including how and when they were administered. - Anesthesia(s), painkiller(s), etc., plus dosage, concentration, etc. - quantity: '?' - - name: protocol - dtype: text - doc: Experimental protocol, if applicable. e.g., include IACUC protocol number. - quantity: '?' - - name: related_publications - dtype: text - doc: Publication information. PMID, DOI, URL, etc. - dims: - - num_publications - shape: - - null - quantity: '?' - - name: session_id - dtype: text - doc: Lab-specific ID for the session. - quantity: '?' - - name: slices - dtype: text - doc: Description of slices, including information about preparation thickness, - orientation, temperature, and bath solution. - quantity: '?' - - name: source_script - dtype: text - doc: Script file or link to public source code used to create this NWB file. - quantity: '?' - attributes: - - name: file_name - dtype: text - doc: Name of script file. - - name: stimulus - dtype: text - doc: Notes about stimuli, such as how and where they were presented. - quantity: '?' - - name: surgery - dtype: text - doc: Narrative description about surgery/surgeries, including date(s) and who - performed surgery. - quantity: '?' - - name: virus - dtype: text - doc: Information about virus(es) used in experiments, including virus ID, source, - date made, injection location, volume, etc. - quantity: '?' - groups: - - neurodata_type_inc: LabMetaData - doc: Place-holder than can be extended so that lab-specific meta-data can be - placed in /general. - quantity: '*' - - name: devices - doc: Description of hardware devices used during experiment, e.g., monitors, - ADC boards, microscopes, etc. - quantity: '?' - groups: - - neurodata_type_inc: Device - doc: Data acquisition devices. - quantity: '*' - - name: subject - neurodata_type_inc: Subject - doc: Information about the animal or person from which the data was measured. - quantity: '?' - - name: extracellular_ephys - doc: Metadata related to extracellular electrophysiology. - quantity: '?' - groups: - - neurodata_type_inc: ElectrodeGroup - doc: Physical group of electrodes. - quantity: '*' - - name: electrodes - neurodata_type_inc: DynamicTable - doc: A table of all electrodes (i.e. channels) used for recording. - quantity: '?' - datasets: - - name: x - neurodata_type_inc: VectorData - dtype: float32 - doc: x coordinate of the channel location in the brain (+x is posterior). - - name: y - neurodata_type_inc: VectorData - dtype: float32 - doc: y coordinate of the channel location in the brain (+y is inferior). - - name: z - neurodata_type_inc: VectorData - dtype: float32 - doc: z coordinate of the channel location in the brain (+z is right). - - name: imp - neurodata_type_inc: VectorData - dtype: float32 - doc: Impedance of the channel. - - name: location - neurodata_type_inc: VectorData - dtype: text - doc: Location of the electrode (channel). Specify the area, layer, comments - on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use - standard atlas names for anatomical regions when possible. - - name: filtering - neurodata_type_inc: VectorData - dtype: float32 - doc: Description of hardware filtering. - - name: group - neurodata_type_inc: VectorData - dtype: - target_type: ElectrodeGroup - reftype: object - doc: Reference to the ElectrodeGroup this electrode is a part of. - - name: group_name - neurodata_type_inc: VectorData - dtype: text - doc: Name of the ElectrodeGroup this electrode is a part of. - - name: rel_x - neurodata_type_inc: VectorData - dtype: float32 - doc: x coordinate in electrode group - quantity: '?' - - name: rel_y - neurodata_type_inc: VectorData - dtype: float32 - doc: y coordinate in electrode group - quantity: '?' - - name: rel_z - neurodata_type_inc: VectorData - dtype: float32 - doc: z coordinate in electrode group - quantity: '?' - - name: reference - neurodata_type_inc: VectorData - dtype: text - doc: Description of the reference used for this electrode. - quantity: '?' - - name: intracellular_ephys - doc: Metadata related to intracellular electrophysiology. - quantity: '?' - datasets: - - name: filtering - dtype: text - doc: Description of filtering used. Includes filtering type and - parameters, frequency fall-off, etc. If this changes between TimeSeries, - filter description should be stored as a text attribute for each TimeSeries. - quantity: '?' - groups: - - neurodata_type_inc: IntracellularElectrode - doc: An intracellular electrode. - quantity: '*' - - name: sweep_table - neurodata_type_inc: SweepTable - doc: The table which groups different PatchClampSeries together. - quantity: '?' - - name: optogenetics - doc: Metadata describing optogenetic stimuluation. - quantity: '?' - groups: - - neurodata_type_inc: OptogeneticStimulusSite - doc: An optogenetic stimulation site. - quantity: '*' - - name: optophysiology - doc: Metadata related to optophysiology. - quantity: '?' - groups: - - neurodata_type_inc: ImagingPlane - doc: An imaging plane. - quantity: '*' - - name: intervals - doc: Experimental intervals, whether that be logically distinct sub-experiments - having a particular scientific goal, trials (see trials subgroup) during an - experiment, or epochs (see epochs subgroup) deriving from analysis of data. - quantity: '?' - groups: - - name: epochs - neurodata_type_inc: TimeIntervals - doc: Divisions in time marking experimental stages or sub-divisions of a single - recording session. - quantity: '?' - - name: trials - neurodata_type_inc: TimeIntervals - doc: Repeated experimental events that have a logical grouping. - quantity: '?' - - name: invalid_times - neurodata_type_inc: TimeIntervals - doc: Time intervals that should be removed from analysis. - quantity: '?' - - neurodata_type_inc: TimeIntervals - doc: Optional additional table(s) for describing other experimental time intervals. - quantity: '*' - - name: units - neurodata_type_inc: Units - doc: Data about sorted spike units. - quantity: '?' - -- neurodata_type_def: LabMetaData - neurodata_type_inc: NWBContainer - doc: Lab-specific meta-data. - -- neurodata_type_def: Subject - neurodata_type_inc: NWBContainer - doc: Information about the animal or person from which the data was measured. - datasets: - - name: age - dtype: text - doc: Age of subject. Can be supplied instead of 'date_of_birth'. - quantity: '?' - - name: date_of_birth - dtype: isodatetime - doc: Date of birth of subject. Can be supplied instead of 'age'. - quantity: '?' - - name: description - dtype: text - doc: Description of subject and where subject came from (e.g., breeder, if - animal). - quantity: '?' - - name: genotype - dtype: text - doc: Genetic strain. If absent, assume Wild Type (WT). - quantity: '?' - - name: sex - dtype: text - doc: Gender of subject. - quantity: '?' - - name: species - dtype: text - doc: Species of subject. - quantity: '?' - - name: subject_id - dtype: text - doc: ID of animal/person used/participating in experiment (lab convention). - quantity: '?' - - name: weight - dtype: text - doc: Weight at time of experiment, at time of surgery and at other important - times. - quantity: '?' - -datasets: -- neurodata_type_def: ScratchData - neurodata_type_inc: NWBData - doc: Any one-off datasets - attributes: - - name: notes - doc: 'Any notes the user has about the dataset being stored' - dtype: text diff --git a/nwb-schema/core/nwb.icephys.yaml b/nwb-schema/core/nwb.icephys.yaml deleted file mode 100644 index a3065166..00000000 --- a/nwb-schema/core/nwb.icephys.yaml +++ /dev/null @@ -1,247 +0,0 @@ -groups: -- neurodata_type_def: PatchClampSeries - neurodata_type_inc: TimeSeries - doc: An abstract base class for patch-clamp data - stimulus or response, - current or voltage. - attributes: - - name: stimulus_description - dtype: text - doc: Protocol/stimulus name for this patch-clamp dataset. - - name: sweep_number - dtype: uint32 - doc: Sweep number, allows to group different PatchClampSeries together. - required: false - datasets: - - name: data - dtype: numeric - dims: - - num_times - shape: - - null - doc: Recorded voltage or current. - attributes: - - name: unit - dtype: text - doc: Base unit of measurement for working with the data. Actual stored values are - not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - - name: gain - dtype: float32 - doc: Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp). - quantity: '?' - links: - - name: electrode - target_type: IntracellularElectrode - doc: Link to IntracellularElectrode object that describes the electrode that was - used to apply or record this data. - -- neurodata_type_def: CurrentClampSeries - neurodata_type_inc: PatchClampSeries - doc: Voltage data from an intracellular current-clamp recording. A - corresponding CurrentClampStimulusSeries (stored separately as a stimulus) is - used to store the current injected. - datasets: - - name: data - doc: Recorded voltage. - attributes: - - name: unit - dtype: text - value: volts - doc: Base unit of measurement for working with the data. which is fixed to 'volts'. - Actual stored values are not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - - name: bias_current - dtype: float32 - doc: Bias current, in amps. - quantity: '?' - - name: bridge_balance - dtype: float32 - doc: Bridge balance, in ohms. - quantity: '?' - - name: capacitance_compensation - dtype: float32 - doc: Capacitance compensation, in farads. - quantity: '?' - -- neurodata_type_def: IZeroClampSeries - neurodata_type_inc: CurrentClampSeries - doc: Voltage data from an intracellular recording when all current - and amplifier settings are off (i.e., CurrentClampSeries fields will be zero). - There is no CurrentClampStimulusSeries associated with an IZero series because - the amplifier is disconnected and no stimulus can reach the cell. - datasets: - - name: bias_current - dtype: float32 - value: 0.0 - doc: Bias current, in amps, fixed to 0.0. - - name: bridge_balance - dtype: float32 - value: 0.0 - doc: Bridge balance, in ohms, fixed to 0.0. - - name: capacitance_compensation - dtype: float32 - value: 0.0 - doc: Capacitance compensation, in farads, fixed to 0.0. - -- neurodata_type_def: CurrentClampStimulusSeries - neurodata_type_inc: PatchClampSeries - doc: Stimulus current applied during current clamp recording. - datasets: - - name: data - doc: Stimulus current applied. - attributes: - - name: unit - dtype: text - value: amperes - doc: Base unit of measurement for working with the data. which is fixed to 'amperes'. - Actual stored values are not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - -- neurodata_type_def: VoltageClampSeries - neurodata_type_inc: PatchClampSeries - doc: Current data from an intracellular voltage-clamp recording. A - corresponding VoltageClampStimulusSeries (stored separately as a stimulus) is - used to store the voltage injected. - datasets: - - name: data - doc: Recorded current. - attributes: - - name: unit - dtype: text - value: amperes - doc: Base unit of measurement for working with the data. which is fixed to 'amperes'. - Actual stored values are not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - - name: capacitance_fast - dtype: float32 - doc: Fast capacitance, in farads. - quantity: '?' - attributes: - - name: unit - dtype: text - value: farads - doc: Unit of measurement for capacitance_fast, which is fixed to 'farads'. - - name: capacitance_slow - dtype: float32 - doc: Slow capacitance, in farads. - quantity: '?' - attributes: - - name: unit - dtype: text - value: farads - doc: Unit of measurement for capacitance_fast, which is fixed to 'farads'. - - name: resistance_comp_bandwidth - dtype: float32 - doc: Resistance compensation bandwidth, in hertz. - quantity: '?' - attributes: - - name: unit - dtype: text - value: hertz - doc: Unit of measurement for resistance_comp_bandwidth, which is fixed to 'hertz'. - - name: resistance_comp_correction - dtype: float32 - doc: Resistance compensation correction, in percent. - quantity: '?' - attributes: - - name: unit - dtype: text - value: percent - doc: Unit of measurement for resistance_comp_correction, which is fixed to 'percent'. - - name: resistance_comp_prediction - dtype: float32 - doc: Resistance compensation prediction, in percent. - quantity: '?' - attributes: - - name: unit - dtype: text - value: percent - doc: Unit of measurement for resistance_comp_prediction, which is fixed to 'percent'. - - name: whole_cell_capacitance_comp - dtype: float32 - doc: Whole cell capacitance compensation, in farads. - quantity: '?' - attributes: - - name: unit - dtype: text - value: farads - doc: Unit of measurement for whole_cell_capacitance_comp, which is fixed to 'farads'. - - name: whole_cell_series_resistance_comp - dtype: float32 - doc: Whole cell series resistance compensation, in ohms. - quantity: '?' - attributes: - - name: unit - dtype: text - value: ohms - doc: Unit of measurement for whole_cell_series_resistance_comp, which is fixed to 'ohms'. - -- neurodata_type_def: VoltageClampStimulusSeries - neurodata_type_inc: PatchClampSeries - doc: Stimulus voltage applied during a voltage clamp recording. - datasets: - - name: data - doc: Stimulus voltage applied. - attributes: - - name: unit - dtype: text - value: volts - doc: Base unit of measurement for working with the data. which is fixed to 'volts'. - Actual stored values are not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - -- neurodata_type_def: IntracellularElectrode - neurodata_type_inc: NWBContainer - doc: An intracellular electrode and its metadata. - datasets: - - name: description - dtype: text - doc: Description of electrode (e.g., whole-cell, sharp, etc.). - - name: filtering - dtype: text - doc: Electrode specific filtering. - quantity: '?' - - name: initial_access_resistance - dtype: text - doc: Initial access resistance. - quantity: '?' - - name: location - dtype: text - doc: Location of the electrode. Specify the area, layer, comments on estimation - of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas - names for anatomical regions when possible. - quantity: '?' - - name: resistance - dtype: text - doc: Electrode resistance, in ohms. - quantity: '?' - - name: seal - dtype: text - doc: Information about seal used for recording. - quantity: '?' - - name: slice - dtype: text - doc: Information about slice used for recording. - quantity: '?' - links: - - name: device - target_type: Device - doc: Device that was used to record from this electrode. - -- neurodata_type_def: SweepTable - neurodata_type_inc: DynamicTable - doc: The table which groups different PatchClampSeries together. - datasets: - - name: sweep_number - neurodata_type_inc: VectorData - dtype: uint32 - doc: Sweep number of the PatchClampSeries in that row. - - name: series - neurodata_type_inc: VectorData - dtype: - target_type: PatchClampSeries - reftype: object - doc: The PatchClampSeries with the sweep number in that row. - - name: series_index - neurodata_type_inc: VectorIndex - doc: Index for series. diff --git a/nwb-schema/core/nwb.image.yaml b/nwb-schema/core/nwb.image.yaml deleted file mode 100644 index 50d3367a..00000000 --- a/nwb-schema/core/nwb.image.yaml +++ /dev/null @@ -1,192 +0,0 @@ -datasets: -- neurodata_type_def: GrayscaleImage - neurodata_type_inc: Image - dims: - - x - - y - shape: - - null - - null - doc: A grayscale image. - dtype: numeric - -- neurodata_type_def: RGBImage - neurodata_type_inc: Image - dims: - - x - - y - - r, g, b - shape: - - null - - null - - 3 - doc: A color image. - dtype: numeric - -- neurodata_type_def: RGBAImage - neurodata_type_inc: Image - dims: - - x - - y - - r, g, b, a - shape: - - null - - null - - 4 - doc: A color image with transparency. - dtype: numeric - -groups: -- neurodata_type_def: ImageSeries - neurodata_type_inc: TimeSeries - doc: General image data that is common between acquisition and stimulus time series. - Sometimes the image data is stored in the file in a raw format while other - times it will be stored as a series of external image files in the host file system. - The data field will either be binary data, if the data is stored in the NWB file, or - empty, if the data is stored in an external image stack. [frame][x][y] or [frame][x][y][z]. - datasets: - - name: data - dtype: numeric - dims: - - - frame - - x - - y - - - frame - - x - - y - - z - shape: - - - null - - null - - null - - - null - - null - - null - - null - doc: Binary data representing images across frames. - quantity: '?' - - name: dimension - dtype: int32 - dims: - - rank - shape: - - null - doc: Number of pixels on x, y, (and z) axes. - quantity: '?' - - name: external_file - dtype: text - dims: - - num_files - shape: - - null - doc: Paths to one or more external file(s). The field is only present if format='external'. - This is only relevant if the image series is stored in the file system as one - or more image file(s). This field should NOT be used if the image is stored - in another NWB file and that file is linked to this file. - quantity: '?' - attributes: - - name: starting_frame - dtype: int32 - dims: - - num_files - shape: - - null - doc: Each external image may contain one or more consecutive frames of the full - ImageSeries. This attribute serves as an index to indicate which frames each file - contains, to faciliate random access. The 'starting_frame' attribute, hence, - contains a list of frame numbers within the full ImageSeries of the first frame - of each file listed in the parent 'external_file' dataset. Zero-based indexing is - used (hence, the first element will always be zero). For example, if the - 'external_file' dataset has three paths to files and the first file has 5 frames, - the second file has 10 frames, and the third file has 20 frames, then this - attribute will have values [0, 5, 15]. If there is a single external file that - holds all of the frames of the ImageSeries (and so there is a single element in - the 'external_file' dataset), then this attribute should have value [0]. - - name: format - dtype: text - default_value: raw - doc: Format of image. If this is 'external', then the attribute 'external_file' - contains the path information to the image files. If this is 'raw', then the raw - (single-channel) binary data is stored in the 'data' dataset. If this attribute - is not present, then the default format='raw' case is assumed. - quantity: '?' - -- neurodata_type_def: ImageMaskSeries - neurodata_type_inc: ImageSeries - doc: An alpha mask that is applied to a presented visual stimulus. The 'data' array - contains an array of mask values that are applied to the displayed image. Mask - values are stored as RGBA. Mask can vary with time. The timestamps array indicates - the starting time of a mask, and that mask pattern continues until it's explicitly - changed. - links: - - name: masked_imageseries - target_type: ImageSeries - doc: Link to ImageSeries object that this image mask is applied to. - -- neurodata_type_def: OpticalSeries - neurodata_type_inc: ImageSeries - doc: Image data that is presented or recorded. A stimulus template movie will be - stored only as an image. When the image is presented as stimulus, additional data - is required, such as field of view (e.g., how much of the visual field the image - covers, or how what is the area of the target being imaged). If the OpticalSeries - represents acquired imaging data, orientation is also important. - datasets: - - name: distance - dtype: float32 - doc: Distance from camera/monitor to target/eye. - quantity: '?' - - name: field_of_view - dtype: float32 - dims: - - - width, height - - - width, height, depth - shape: - - - 2 - - - 3 - doc: Width, height and depth of image, or imaged area, in meters. - quantity: '?' - - name: data - dtype: numeric - dims: - - - frame - - x - - y - - - frame - - x - - y - - r, g, b - shape: - - - null - - null - - null - - - null - - null - - null - - 3 - doc: Images presented to subject, either grayscale or RGB - - name: orientation - dtype: text - doc: Description of image relative to some reference frame (e.g., which way is - up). Must also specify frame of reference. - quantity: '?' - -- neurodata_type_def: IndexSeries - neurodata_type_inc: TimeSeries - doc: Stores indices to image frames stored in an ImageSeries. The purpose of the - ImageIndexSeries is to allow a static image stack to be stored somewhere, and - the images in the stack to be referenced out-of-order. This can be for the display - of individual images, or of movie segments (as a movie is simply a series of images). - The data field stores the index of the frame in the referenced ImageSeries, and - the timestamps array indicates when that image was displayed. - datasets: - - name: data - dtype: int32 - dims: - - num_times - shape: - - null - doc: Index of the frame in the referenced ImageSeries. - links: - - name: indexed_timeseries - target_type: ImageSeries - doc: Link to ImageSeries object containing images that are indexed. diff --git a/nwb-schema/core/nwb.misc.yaml b/nwb-schema/core/nwb.misc.yaml deleted file mode 100644 index c8723ba3..00000000 --- a/nwb-schema/core/nwb.misc.yaml +++ /dev/null @@ -1,279 +0,0 @@ -groups: -- neurodata_type_def: AbstractFeatureSeries - neurodata_type_inc: TimeSeries - doc: Abstract features, such as quantitative descriptions of sensory stimuli. The - TimeSeries::data field is a 2D array, storing those features (e.g., for visual - grating stimulus this might be orientation, spatial frequency and contrast). Null - stimuli (eg, uniform gray) can be marked as being an independent feature (eg, - 1.0 for gray, 0.0 for actual stimulus) or by storing NaNs for feature values, - or through use of the TimeSeries::control fields. A set of features is considered - to persist until the next set of features is defined. The final set of features - stored should be the null set. This is useful when storing the raw stimulus - is impractical. - datasets: - - name: data - dtype: numeric - dims: - - - num_times - - - num_times - - num_features - shape: - - - null - - - null - - null - doc: Values of each feature at each time. - attributes: - - name: unit - dtype: text - default_value: see 'feature_units' - doc: Since there can be different units for different features, store the units - in 'feature_units'. The default value for this attribute is "see 'feature_units'". - required: false - - name: feature_units - dtype: text - dims: - - num_features - shape: - - null - doc: Units of each feature. - quantity: '?' - - name: features - dtype: text - dims: - - num_features - shape: - - null - doc: Description of the features represented in TimeSeries::data. - -- neurodata_type_def: AnnotationSeries - neurodata_type_inc: TimeSeries - doc: Stores user annotations made during an experiment. The data[] - field stores a text array, and timestamps are stored for each annotation (ie, - interval=1). This is largely an alias to a standard TimeSeries storing a text - array but that is identifiable as storing annotations in a machine-readable way. - datasets: - - name: data - dtype: text - dims: - - num_times - shape: - - null - doc: Annotations made during an experiment. - attributes: - - name: resolution - dtype: float32 - value: -1.0 - doc: Smallest meaningful difference between values in data. Annotations have - no units, so the value is fixed to -1.0. - - name: unit - dtype: text - value: n/a - doc: Base unit of measurement for working with the data. Annotations have - no units, so the value is fixed to 'n/a'. - -- neurodata_type_def: IntervalSeries - neurodata_type_inc: TimeSeries - doc: Stores intervals of data. The timestamps field stores the beginning and end - of intervals. The data field stores whether the interval just started (>0 value) - or ended (<0 value). Different interval types can be represented in the same series - by using multiple key values (eg, 1 for feature A, 2 for feature B, 3 for feature - C, etc). The field data stores an 8-bit integer. This is largely an alias of a - standard TimeSeries but that is identifiable as representing time intervals in - a machine-readable way. - datasets: - - name: data - dtype: int8 - dims: - - num_times - shape: - - null - doc: Use values >0 if interval started, <0 if interval ended. - attributes: - - name: resolution - dtype: float32 - value: -1.0 - doc: Smallest meaningful difference between values in data. Annotations have - no units, so the value is fixed to -1.0. - - name: unit - dtype: text - value: n/a - doc: Base unit of measurement for working with the data. Annotations have - no units, so the value is fixed to 'n/a'. - -- neurodata_type_def: DecompositionSeries - neurodata_type_inc: TimeSeries - doc: Spectral analysis of a time series, e.g. of an LFP or a speech signal. - datasets: - - name: data - dtype: numeric - dims: - - num_times - - num_channels - - num_bands - shape: - - null - - null - - null - doc: Data decomposed into frequency bands. - attributes: - - name: unit - dtype: text - default_value: no unit - doc: Base unit of measurement for working with the data. Actual stored values are - not necessarily stored in these units. To access the data in these units, - multiply 'data' by 'conversion'. - - name: metric - dtype: text - doc: The metric used, e.g. phase, amplitude, power. - groups: - - name: bands - neurodata_type_inc: DynamicTable - doc: Table for describing the bands that this series was generated from. There - should be one row in this table for each band. - datasets: - - name: band_name - neurodata_type_inc: VectorData - dtype: text - doc: Name of the band, e.g. theta. - - name: band_limits - neurodata_type_inc: VectorData - dtype: float32 - dims: - - num_bands - - low, high - shape: - - null - - 2 - doc: Low and high limit of each band in Hz. If it is a Gaussian filter, use - 2 SD on either side of the center. - - name: band_mean - neurodata_type_inc: VectorData - dtype: float32 - dims: - - num_bands - shape: - - null - doc: The mean Gaussian filters, in Hz. - - name: band_stdev - neurodata_type_inc: VectorData - dtype: float32 - dims: - - num_bands - shape: - - null - doc: The standard deviation of Gaussian filters, in Hz. - links: - - name: source_timeseries - target_type: TimeSeries - doc: Link to TimeSeries object that this data was calculated from. Metadata about - electrodes and their position can be read from that ElectricalSeries so it is - not necessary to store that information here. - quantity: '?' - -- neurodata_type_def: Units - neurodata_type_inc: DynamicTable - default_name: Units - doc: Data about spiking units. Event times of observed units (e.g. cell, synapse, - etc.) should be concatenated and stored in spike_times. - datasets: - - name: spike_times_index - neurodata_type_inc: VectorIndex - doc: Index into the spike_times dataset. - quantity: '?' - - name: spike_times - neurodata_type_inc: VectorData - dtype: float64 - doc: Spike times for each unit. - quantity: '?' - attributes: - - name: resolution - dtype: float64 - doc: The smallest possible difference between two spike times. Usually 1 divided by the acquisition sampling rate - from which spike times were extracted, but could be larger if the acquisition time series was downsampled or - smaller if the acquisition time series was smoothed/interpolated and it is possible for the spike time to be - between samples. - required: false - - name: obs_intervals_index - neurodata_type_inc: VectorIndex - doc: Index into the obs_intervals dataset. - quantity: '?' - - name: obs_intervals - neurodata_type_inc: VectorData - dtype: float64 - dims: - - num_intervals - - start|end - shape: - - null - - 2 - doc: Observation intervals for each unit. - quantity: '?' - - name: electrodes_index - neurodata_type_inc: VectorIndex - doc: Index into electrodes. - quantity: '?' - - name: electrodes - neurodata_type_inc: DynamicTableRegion - doc: Electrode that each spike unit came from, specified using a DynamicTableRegion. - quantity: '?' - - name: electrode_group - neurodata_type_inc: VectorData - dtype: - target_type: ElectrodeGroup - reftype: object - doc: Electrode group that each spike unit came from. - quantity: '?' - - name: waveform_mean - neurodata_type_inc: VectorData - dtype: float32 - dims: - - - num_units - - num_samples - - - num_units - - num_samples - - num_electrodes - shape: - - - null - - null - - - null - - null - - null - doc: Spike waveform mean for each spike unit. - quantity: '?' - attributes: - - name: sampling_rate - dtype: float32 - doc: Sampling rate, in hertz. - required: false - - name: unit - dtype: text - value: volts - doc: Unit of measurement. This value is fixed to 'volts'. - required: false - - name: waveform_sd - neurodata_type_inc: VectorData - dtype: float32 - dims: - - - num_units - - num_samples - - - num_units - - num_samples - - num_electrodes - shape: - - - null - - null - - - null - - null - - null - doc: Spike waveform standard deviation for each spike unit. - quantity: '?' - attributes: - - name: sampling_rate - dtype: float32 - doc: Sampling rate, in hertz. - required: false - - name: unit - dtype: text - value: volts - doc: Unit of measurement. This value is fixed to 'volts'. - required: false diff --git a/nwb-schema/core/nwb.namespace.yaml b/nwb-schema/core/nwb.namespace.yaml deleted file mode 100644 index c3ec78ad..00000000 --- a/nwb-schema/core/nwb.namespace.yaml +++ /dev/null @@ -1,60 +0,0 @@ -namespaces: -- name: core - doc: NWB namespace - author: - - Andrew Tritt - - Oliver Ruebel - - Ryan Ly - - Ben Dichter - - Keith Godfrey - - Jeff Teeters - contact: - - ajtritt@lbl.gov - - oruebel@lbl.gov - - rly@lbl.gov - - bdichter@lbl.gov - - keithg@alleninstitute.org - - jteeters@berkeley.edu - full_name: NWB core - schema: - - namespace: hdmf-common - - doc: This source module contains base data types used throughout the NWB:N data - format. - source: nwb.base.yaml - title: Base data types - - doc: This source module contains neurodata_types for device data. - source: nwb.device.yaml - title: Devices - - doc: This source module contains neurodata_types for epoch data. - source: nwb.epoch.yaml - title: Epochs - - doc: This source module contains neurodata_types for image data. - source: nwb.image.yaml - title: Image data - - doc: Main NWB:N file specification. - source: nwb.file.yaml - title: NWB:N file - - doc: Miscellaneous types. - source: nwb.misc.yaml - title: Miscellaneous neurodata_types. - - doc: This source module contains neurodata_types for behavior data. - source: nwb.behavior.yaml - title: Behavior - - doc: This source module contains neurodata_types for extracellular electrophysiology - data. - source: nwb.ecephys.yaml - title: Extracellular electrophysiology - - doc: This source module contains neurodata_types for intracellular electrophysiology - data. - source: nwb.icephys.yaml - title: Intracellular electrophysiology - - doc: This source module contains neurodata_types for opto-genetics data. - source: nwb.ogen.yaml - title: Optogenetics - - doc: This source module contains neurodata_types for optical physiology data. - source: nwb.ophys.yaml - title: Optical physiology - - doc: This source module contains neurodata_type for retinotopy data. - source: nwb.retinotopy.yaml - title: Retinotopy - version: 2.2.5 diff --git a/nwb-schema/core/nwb.ogen.yaml b/nwb-schema/core/nwb.ogen.yaml deleted file mode 100644 index 1756ba85..00000000 --- a/nwb-schema/core/nwb.ogen.yaml +++ /dev/null @@ -1,43 +0,0 @@ -groups: -- neurodata_type_def: OptogeneticSeries - neurodata_type_inc: TimeSeries - doc: An optogenetic stimulus. - datasets: - - name: data - dtype: numeric - dims: - - num_times - shape: - - null - doc: Applied power for optogenetic stimulus, in watts. - attributes: - - name: unit - dtype: text - value: watts - doc: Unit of measurement for data, which is fixed to 'watts'. - links: - - name: site - target_type: OptogeneticStimulusSite - doc: Link to OptogeneticStimulusSite object that describes the site to which this - stimulus was applied. - -- neurodata_type_def: OptogeneticStimulusSite - neurodata_type_inc: NWBContainer - doc: A site of optogenetic stimulation. - quantity: '*' - datasets: - - name: description - dtype: text - doc: Description of stimulation site. - - name: excitation_lambda - dtype: float32 - doc: Excitation wavelength, in nm. - - name: location - dtype: text - doc: Location of the stimulation site. Specify the area, layer, comments on estimation - of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas - names for anatomical regions when possible. - links: - - name: device - target_type: Device - doc: Device that generated the stimulus. diff --git a/nwb-schema/core/nwb.ophys.yaml b/nwb-schema/core/nwb.ophys.yaml deleted file mode 100644 index 386dca9b..00000000 --- a/nwb-schema/core/nwb.ophys.yaml +++ /dev/null @@ -1,326 +0,0 @@ -groups: -- neurodata_type_def: TwoPhotonSeries - neurodata_type_inc: ImageSeries - doc: Image stack recorded over time from 2-photon microscope. - attributes: - - name: pmt_gain - dtype: float32 - doc: Photomultiplier gain. - required: false - - name: scan_line_rate - dtype: float32 - doc: Lines imaged per second. This is also stored in /general/optophysiology but - is kept here as it is useful information for analysis, and so good to be stored - w/ the actual data. - required: false - datasets: - - name: field_of_view - dtype: float32 - dims: - - - width|height - - - width|height|depth - shape: - - - 2 - - - 3 - doc: Width, height and depth of image, or imaged area, in meters. - quantity: '?' - links: - - name: imaging_plane - target_type: ImagingPlane - doc: Link to ImagingPlane object from which this TimeSeries data was generated. - -- neurodata_type_def: RoiResponseSeries - neurodata_type_inc: TimeSeries - doc: ROI responses over an imaging plane. The first dimension represents time. - The second dimension, if present, represents ROIs. - datasets: - - name: data - dtype: numeric - dims: - - - num_times - - - num_times - - num_ROIs - shape: - - - null - - - null - - null - doc: Signals from ROIs. - - name: rois - neurodata_type_inc: DynamicTableRegion - doc: DynamicTableRegion referencing into an ROITable containing information on the ROIs - stored in this timeseries. - -- neurodata_type_def: DfOverF - neurodata_type_inc: NWBDataInterface - default_name: DfOverF - doc: dF/F information about a region of interest (ROI). Storage hierarchy of dF/F - should be the same as for segmentation (i.e., same names for ROIs and for image - planes). - groups: - - neurodata_type_inc: RoiResponseSeries - doc: RoiResponseSeries object(s) containing dF/F for a ROI. - quantity: '+' - -- neurodata_type_def: Fluorescence - neurodata_type_inc: NWBDataInterface - default_name: Fluorescence - doc: Fluorescence information about a region of interest (ROI). Storage hierarchy - of fluorescence should be the same as for segmentation (ie, same names for ROIs - and for image planes). - groups: - - neurodata_type_inc: RoiResponseSeries - doc: RoiResponseSeries object(s) containing fluorescence data for a ROI. - quantity: '+' - -- neurodata_type_def: ImageSegmentation - neurodata_type_inc: NWBDataInterface - default_name: ImageSegmentation - doc: Stores pixels in an image that represent different regions of interest (ROIs) - or masks. All segmentation for a given imaging plane is stored together, with - storage for multiple imaging planes (masks) supported. Each ROI is stored in its - own subgroup, with the ROI group containing both a 2D mask and a list of pixels - that make up this mask. Segments can also be used for masking neuropil. If segmentation - is allowed to change with time, a new imaging plane (or module) is required and - ROI names should remain consistent between them. - groups: - - neurodata_type_inc: PlaneSegmentation - doc: Results from image segmentation of a specific imaging plane. - quantity: '+' - -- neurodata_type_def: PlaneSegmentation - neurodata_type_inc: DynamicTable - doc: Results from image segmentation of a specific imaging plane. - datasets: - - name: image_mask - neurodata_type_inc: VectorData - dims: - - - num_roi - - num_x - - num_y - - - num_roi - - num_x - - num_y - - num_z - shape: - - - null - - null - - null - - - null - - null - - null - - null - doc: ROI masks for each ROI. Each image mask is the size of the original imaging - plane (or volume) and members of the ROI are finite non-zero. - quantity: '?' - - name: pixel_mask_index - neurodata_type_inc: VectorIndex - doc: Index into pixel_mask. - quantity: '?' - - name: pixel_mask - neurodata_type_inc: VectorData - dtype: - - name: x - dtype: uint32 - doc: Pixel x-coordinate. - - name: y - dtype: uint32 - doc: Pixel y-coordinate. - - name: weight - dtype: float32 - doc: Weight of the pixel. - doc: 'Pixel masks for each ROI: a list of indices and weights for the ROI. Pixel - masks are concatenated and parsing of this dataset is maintained by the PlaneSegmentation' - quantity: '?' - - name: voxel_mask_index - neurodata_type_inc: VectorIndex - doc: Index into voxel_mask. - quantity: '?' - - name: voxel_mask - neurodata_type_inc: VectorData - dtype: - - name: x - dtype: uint32 - doc: Voxel x-coordinate. - - name: y - dtype: uint32 - doc: Voxel y-coordinate. - - name: z - dtype: uint32 - doc: Voxel z-coordinate. - - name: weight - dtype: float32 - doc: Weight of the voxel. - doc: 'Voxel masks for each ROI: a list of indices and weights for the ROI. Voxel - masks are concatenated and parsing of this dataset is maintained by the PlaneSegmentation' - quantity: '?' - groups: - - name: reference_images - doc: Image stacks that the segmentation masks apply to. - groups: - - neurodata_type_inc: ImageSeries - doc: One or more image stacks that the masks apply to (can be one-element - stack). - quantity: '*' - links: - - name: imaging_plane - target_type: ImagingPlane - doc: Link to ImagingPlane object from which this data was generated. - -- neurodata_type_def: ImagingPlane - neurodata_type_inc: NWBContainer - doc: An imaging plane and its metadata. - quantity: '*' - datasets: - - name: description - dtype: text - doc: Description of the imaging plane. - quantity: '?' - - name: excitation_lambda - dtype: float32 - doc: Excitation wavelength, in nm. - - name: imaging_rate - dtype: float32 - doc: Rate that images are acquired, in Hz. If the corresponding TimeSeries is present, the rate should be stored - there instead. - quantity: '?' - - name: indicator - dtype: text - doc: Calcium indicator. - - name: location - dtype: text - doc: Location of the imaging plane. Specify the area, layer, comments on estimation - of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas - names for anatomical regions when possible. - - name: manifold - dtype: float32 - dims: - - - height - - width - - x, y, z - - - height - - width - - depth - - x, y, z - shape: - - - null - - null - - 3 - - - null - - null - - null - - 3 - doc: "DEPRECATED Physical position of each pixel. 'xyz' represents the position\ - \ of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing." - quantity: '?' - attributes: - - name: conversion - dtype: float32 - default_value: 1.0 - doc: Scalar to multiply each element in data to convert it to the specified 'unit'. - If the data are stored in acquisition system units or other units - that require a conversion to be interpretable, multiply the data by 'conversion' - to convert the data to the specified 'unit'. e.g. if the data acquisition system - stores values in this object as pixels from x = -500 to 499, y = -500 to 499 - that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get - from raw data acquisition pixel units to meters is 2/1000. - required: false - - name: unit - dtype: text - default_value: meters - doc: Base unit of measurement for working with the data. The default value is 'meters'. - required: false - - name: origin_coords - dtype: float32 - dims: - - - x, y - - - x, y, z - shape: - - - 2 - - - 3 - doc: Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. - See also reference_frame for what the physical location is relative to (e.g., bregma). - quantity: '?' - attributes: - - name: unit - dtype: text - default_value: meters - doc: Measurement units for origin_coords. The default value is 'meters'. - - name: grid_spacing - dtype: float32 - dims: - - - x, y - - - x, y, z - shape: - - - 2 - - - 3 - doc: Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. - Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid. - quantity: '?' - attributes: - - name: unit - dtype: text - default_value: meters - doc: Measurement units for grid_spacing. The default value is 'meters'. - - name: reference_frame - dtype: text - doc: Describes reference frame of origin_coords and grid_spacing. - For example, this can be a text description of the anatomical location and orientation of the grid - defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to - a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. - If origin_coords and grid_spacing are not present, then this field is not required. - For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix - (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in - x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more - rightward, and larger numbers in z means more ventral, then enter the following -- - origin_coords = (-1.2, -0.6, -2) - grid_spacing = (0.2, 0.2, 0.5) - reference_frame = "Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior - axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more - rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral)." - quantity: '?' - groups: - - neurodata_type_inc: OpticalChannel - doc: An optical channel used to record from an imaging plane. - quantity: '+' - links: - - name: device - target_type: Device - doc: Link to the Device object that was used to record from this electrode. - -- neurodata_type_def: OpticalChannel - neurodata_type_inc: NWBContainer - doc: An optical channel used to record from an imaging plane. - datasets: - - name: description - dtype: text - doc: Description or other notes about the channel. - - name: emission_lambda - dtype: float32 - doc: Emission wavelength for channel, in nm. - -- neurodata_type_def: MotionCorrection - neurodata_type_inc: NWBDataInterface - default_name: MotionCorrection - doc: 'An image stack where all frames are shifted (registered) to a common coordinate - system, to account for movement and drift between frames. Note: each frame at - each point in time is assumed to be 2-D (has only x & y dimensions).' - groups: - - neurodata_type_inc: CorrectedImageStack - doc: Reuslts from motion correction of an image stack. - quantity: '+' - -- neurodata_type_def: CorrectedImageStack - neurodata_type_inc: NWBDataInterface - doc: Reuslts from motion correction of an image stack. - groups: - - name: corrected - neurodata_type_inc: ImageSeries - doc: Image stack with frames shifted to the common coordinates. - - name: xy_translation - neurodata_type_inc: TimeSeries - doc: Stores the x,y delta necessary to align each frame to the common coordinates, - for example, to align each frame to a reference image. - links: - - name: original - target_type: ImageSeries - doc: Link to ImageSeries object that is being registered. diff --git a/nwb-schema/core/nwb.retinotopy.yaml b/nwb-schema/core/nwb.retinotopy.yaml deleted file mode 100644 index e8972395..00000000 --- a/nwb-schema/core/nwb.retinotopy.yaml +++ /dev/null @@ -1,234 +0,0 @@ -groups: -- neurodata_type_def: ImagingRetinotopy - neurodata_type_inc: NWBDataInterface - default_name: ImagingRetinotopy - doc: 'Intrinsic signal optical imaging or widefield imaging for measuring retinotopy. - Stores orthogonal maps (e.g., altitude/azimuth; radius/theta) of responses to - specific stimuli and a combined polarity map from which to identify visual areas. - This group does not store the raw responses imaged during retinotopic mapping or the - stimuli presented, but rather the resulting phase and power maps after applying a Fourier - transform on the averaged responses. - Note: for data consistency, all images and arrays are stored in the format [row][column] - and [row, col], which equates to [y][x]. Field of view and dimension arrays may - appear backward (i.e., y before x).' - datasets: - - name: axis_1_phase_map - dtype: float32 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: Phase response to stimulus on the first measured axis. - attributes: - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: unit - dtype: text - doc: Unit that axis data is stored in (e.g., degrees). - - name: axis_1_power_map - dtype: float32 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: Power response on the first measured axis. Response is scaled so 0.0 is no - power in the response and 1.0 is maximum relative power. - quantity: '?' - attributes: - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: unit - dtype: text - doc: Unit that axis data is stored in (e.g., degrees). - - name: axis_2_phase_map - dtype: float32 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: Phase response to stimulus on the second measured axis. - attributes: - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: unit - dtype: text - doc: Unit that axis data is stored in (e.g., degrees). - - name: axis_2_power_map - dtype: float32 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: Power response on the second measured axis. Response is scaled so 0.0 is - no power in the response and 1.0 is maximum relative power. - quantity: '?' - attributes: - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: unit - dtype: text - doc: Unit that axis data is stored in (e.g., degrees). - - name: axis_descriptions - dtype: text - dims: - - axis_1, axis_2 - shape: - - 2 - doc: Two-element array describing the contents of the two response axis fields. - Description should be something like ['altitude', 'azimuth'] or '['radius', - 'theta']. - - name: focal_depth_image - dtype: uint16 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: 'Gray-scale image taken with same settings/parameters (e.g., focal depth, - wavelength) as data collection. Array format: [rows][columns].' - quantity: '?' - attributes: - - name: bits_per_pixel - dtype: int32 - doc: Number of bits used to represent each value. This is necessary to determine - maximum (white) pixel value. - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: focal_depth - dtype: float32 - doc: Focal depth offset, in meters. - - name: format - dtype: text - doc: Format of image. Right now only 'raw' is supported. - - name: sign_map - dtype: float32 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: Sine of the angle between the direction of the gradient in axis_1 and axis_2. - quantity: '?' - attributes: - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: vasculature_image - dtype: uint16 - dims: - - num_rows - - num_cols - shape: - - null - - null - doc: 'Gray-scale anatomical image of cortical surface. Array structure: [rows][columns]' - attributes: - - name: bits_per_pixel - dtype: int32 - doc: Number of bits used to represent each value. This is necessary to determine - maximum (white) pixel value - - name: dimension - dtype: int32 - dims: - - num_rows, num_cols - shape: - - 2 - doc: 'Number of rows and columns in the image. NOTE: row, column representation - is equivalent to height, width.' - - name: field_of_view - dtype: float32 - dims: - - height, width - shape: - - 2 - doc: Size of viewing area, in meters. - - name: format - dtype: text - doc: Format of image. Right now only 'raw' is supported. diff --git a/nwb-schema/hdmf-common-schema/common/namespace.yaml b/nwb-schema/hdmf-common-schema/common/namespace.yaml deleted file mode 100644 index 42df23e4..00000000 --- a/nwb-schema/hdmf-common-schema/common/namespace.yaml +++ /dev/null @@ -1,21 +0,0 @@ -namespaces: -- name: hdmf-common - doc: Common data structures provided by HDMF - author: - - Andrew Tritt - - Oliver Ruebel - - Ryan Ly - - Ben Dichter - contact: - - ajtritt@lbl.gov - - oruebel@lbl.gov - - rly@lbl.gov - - bdichter@lbl.gov - full_name: HDMF Common - schema: - - doc: data types for a column-based table - source: table.yaml - title: Table data types - - doc: data types for different types of sparse matrices - source: sparse.yaml - version: 1.1.3 diff --git a/nwb-schema/hdmf-common-schema/common/sparse.yaml b/nwb-schema/hdmf-common-schema/common/sparse.yaml deleted file mode 100644 index 49f9a526..00000000 --- a/nwb-schema/hdmf-common-schema/common/sparse.yaml +++ /dev/null @@ -1,24 +0,0 @@ -groups: -- data_type_def: CSRMatrix - doc: a compressed sparse row matrix - attributes: - - name: shape - dtype: int - shape: - - 2 - doc: the shape of this sparse matrix - datasets: - - name: indices - dtype: int - shape: - - null - doc: column indices - - name: indptr - dtype: int - shape: - - null - doc: index pointer - - name: data - shape: - - null - doc: values in the matrix diff --git a/nwb-schema/hdmf-common-schema/common/table.yaml b/nwb-schema/hdmf-common-schema/common/table.yaml deleted file mode 100644 index 9ed2ff0e..00000000 --- a/nwb-schema/hdmf-common-schema/common/table.yaml +++ /dev/null @@ -1,155 +0,0 @@ -datasets: -- data_type_def: Data - doc: An abstract data type for a dataset. - -- data_type_def: Index - data_type_inc: Data - doc: Pointers that index data values. - attributes: - - name: target - dtype: - target_type: Data - reftype: object - doc: Target dataset that this index applies to. - -- data_type_def: VectorData - data_type_inc: Data - doc: An n-dimensional dataset representing a column of a DynamicTable. - If used without an accompanying VectorIndex, first dimension is - along the rows of the DynamicTable and each step along the first - dimension is a cell of the larger table. VectorData can also be - used to represent a ragged array if paired with a VectorIndex. - This allows for storing arrays of varying length in a single cell - of the DynamicTable by indexing into this VectorData. The first - vector is at VectorData[0:VectorIndex(0)+1]. The second vector is at - VectorData[VectorIndex(0)+1:VectorIndex(1)+1], and so on. - dims: - - - dim0 - - - dim0 - - dim1 - - - dim0 - - dim1 - - dim2 - - - dim0 - - dim1 - - dim2 - - dim3 - shape: - - - null - - - null - - null - - - null - - null - - null - - - null - - null - - null - - null - attributes: - - name: description - dtype: text - doc: Description of what these vectors represent. - -- data_type_def: VectorIndex - data_type_inc: Index - doc: Used with VectorData to encode a ragged array. An array of indices - into the first dimension of the target VectorData, and forming a map - between the rows of a DynamicTable and the indices of the VectorData. - dims: - - num_rows - shape: - - null - attributes: - - name: target - dtype: - target_type: VectorData - reftype: object - doc: Reference to the target dataset that this index applies to. - -- data_type_def: ElementIdentifiers - data_type_inc: Data - default_name: element_id - dtype: int - dims: - - num_elements - shape: - - null - doc: A list of unique identifiers for values within a dataset, e.g. rows of a DynamicTable. - -- data_type_def: DynamicTableRegion - data_type_inc: VectorData - dtype: int - doc: DynamicTableRegion provides a link from one table to an index or region of another. The `table` attribute is a - link to another `DynamicTable`, indicating which table is referenced, and the data is int(s) indicating the row(s) - (0-indexed) of the target array. `DynamicTableRegion`s can be used to associate rows with repeated meta-data without - data duplication. They can also be used to create hierarchical relationships between multiple `DynamicTable`s. - `DynamicTableRegion` objects may be paired with a `VectorIndex` object to create ragged references, so a single cell - of a `DynamicTable` can reference many rows of another `DynamicTable`. - dims: - - num_rows - shape: - - null - attributes: - - name: table - dtype: - target_type: DynamicTable - reftype: object - doc: Reference to the DynamicTable object that this region applies to. - - name: description - dtype: text - doc: Description of what this table region points to. - -groups: -- data_type_def: Container - doc: An abstract data type for a generic container storing collections of data and - metadata. Base type for all data and metadata containers. - -- data_type_def: DynamicTable - data_type_inc: Container - doc: A group containing multiple datasets that are aligned on the first dimension - (Currently, this requirement if left up to APIs to check and enforce). Apart from - a column that contains unique identifiers for each row there are no other required - datasets. Users are free to add any number of VectorData objects here. Table functionality - is already supported through compound types, which is analogous to storing an - array-of-structs. DynamicTable can be thought of as a struct-of-arrays. This provides - an alternative structure to choose from when optimizing storage for anticipated - access patterns. Additionally, this type provides a way of creating a table without - having to define a compound type up front. Although this convenience may be attractive, - users should think carefully about how data will be accessed. DynamicTable is - more appropriate for column-centric access, whereas a dataset with a compound - type would be more appropriate for row-centric access. Finally, data size should - also be taken into account. For small tables, performance loss may be an acceptable - trade-off for the flexibility of a DynamicTable. For example, DynamicTable was - originally developed for storing trial data and spike unit metadata. Both of these - use cases are expected to produce relatively small tables, so the spatial locality - of multiple datasets present in a DynamicTable is not expected to have a significant - performance impact. Additionally, requirements of trial and unit metadata tables - are sufficiently diverse that performance implications can be overlooked in favor - of usability. - attributes: - - name: colnames - dtype: text - dims: - - num_columns - shape: - - null - doc: The names of the columns in this table. This should be used to specify - an order to the columns. - - name: description - dtype: text - doc: Description of what is in this dynamic table. - datasets: - - name: id - data_type_inc: ElementIdentifiers - dtype: int - dims: - - num_rows - shape: - - null - doc: Array of unique identifiers for the rows of this dynamic table. - - data_type_inc: VectorData - doc: Vector columns of this dynamic table. - quantity: '*' - - data_type_inc: VectorIndex - doc: Indices for the vector columns of this dynamic table. - quantity: '*' diff --git a/nwbRead.m b/nwbRead.m index fccb847e..975ea24b 100644 --- a/nwbRead.m +++ b/nwbRead.m @@ -1,19 +1,18 @@ function nwb = nwbRead(filename, varargin) %NWBREAD Reads an NWB file. -% nwb = nwbRead(filename) Reads the nwb file at filename and returns an +% nwb = NWBREAD(filename) Reads the nwb file at filename and returns an % NWBFile object representing its contents. % nwb = nwbRead(filename, 'ignorecache') Reads the nwb file without generating classes % off of the cached schema if one exists. % +% nwb = NWBREAD(filename, options) +% % Requires that core and extension NWB types have been generated % and reside in a 'types' package on the matlab path. % % Example: -% %Generate Matlab code for the NWB objects from the core schema. -% %This only needs to be done once. -% generateCore('schema\core\nwb.namespace.yaml'); -% %Now we can read nwb files! -% nwb=nwbRead('data.nwb'); +% nwb = nwbRead('data.nwb'); +% nwb = nwbRead('data.nwb', % % See also GENERATECORE, GENERATEEXTENSION, NWBFILE, NWBEXPORT ignoreCache = ~isempty(varargin) && ischar(varargin{1}) &&... @@ -35,25 +34,27 @@ function specLocation = checkEmbeddedSpec(filename) specLocation = ''; +fid = H5F.open(filename); try %check for .specloc - fid = H5F.open(filename); attributeId = H5A.open(fid, '.specloc'); referenceRawData = H5A.read(attributeId); specLocation = H5R.get_name(attributeId, 'H5R_OBJECT', referenceRawData); - generateSpec(fid, h5info(filename, specLocation)); - rehash(); %required if we want parseGroup to read the right files. H5A.close(attributeId); - H5F.close(fid); + generateSpec(fid, h5info(filename, specLocation)); catch ME if ~strcmp(ME.identifier, 'MATLAB:imagesci:hdf5lib:libraryError') rethrow(ME); end - warning('MatNWB:NWBRead:NoSpec',... - ['No embedded specification found. Ensure your environment is accurate to what '... - 'is stored in this NWB file.'... - '\nTo disable this warning run: `warning(''off'', ''MatNWB:NWBRead:NoSpec'')`']); + + attributeId = H5A.open(fid, 'nwb_version'); + version = H5A.read(attributeId); + H5A.close(attributeId); + + generateCore(version); end +rehash(); % required if we want parseGroup to read the right files. +H5F.close(fid); end function generateSpec(fid, specinfo)