model rebuild

This commit is contained in:
sneakers-the-rat 2024-10-02 20:20:50 -07:00
parent 8449e9f742
commit 06b68e8b42
Signed by untrusted user who does not match committer: jonny
GPG key ID: 6DCB96EF1E4D232D
159 changed files with 9820 additions and 4130 deletions

View file

@ -170,9 +170,9 @@ class Image(NWBData):
description: Optional[str] = Field(None, description="""Description of the image.""") description: Optional[str] = Field(None, description="""Description of the image.""")
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* x, * y"], float], NDArray[Shape["* x, * y"], float | int],
NDArray[Shape["* x, * y, 3 r_g_b"], float], NDArray[Shape["* x, * y, 3 r_g_b"], float | int],
NDArray[Shape["* x, * y, 4 r_g_b_a"], float], NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -333,13 +333,16 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True} {"from_schema": "core.nwb.base", "tree_root": True}
) )
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( name: str = Field(...)
description: str = Field(
..., description="""Description of this collection of processed data."""
)
value: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
name: str = Field(...)
class Images(NWBDataInterface): class Images(NWBDataInterface):
@ -353,7 +356,7 @@ class Images(NWBDataInterface):
name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}}) name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}})
description: str = Field(..., description="""Description of this collection of images.""") description: str = Field(..., description="""Description of this collection of images.""")
image: List[Image] = Field(..., description="""Images stored in this collection.""") image: List[str] = Field(..., description="""Images stored in this collection.""")
# Model rebuild # Model rebuild

View file

@ -213,6 +213,16 @@ class SpatialSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"meters", "meters",
description="""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'.""", description="""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'.""",
@ -220,8 +230,8 @@ class SpatialSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -235,10 +245,13 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[IntervalSeries]] = Field( name: str = Field(
"BehavioralEpochs",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEpochs)"}},
)
value: Optional[Dict[str, IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
) )
name: str = Field(...)
class BehavioralEvents(NWBDataInterface): class BehavioralEvents(NWBDataInterface):
@ -250,10 +263,13 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralEvents",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEvents)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class BehavioralTimeSeries(NWBDataInterface): class BehavioralTimeSeries(NWBDataInterface):
@ -265,10 +281,13 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralTimeSeries",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralTimeSeries)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class PupilTracking(NWBDataInterface): class PupilTracking(NWBDataInterface):
@ -280,10 +299,12 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"PupilTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(PupilTracking)"}}
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class EyeTracking(NWBDataInterface): class EyeTracking(NWBDataInterface):
@ -295,10 +316,12 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"EyeTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(EyeTracking)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class CompassDirection(NWBDataInterface): class CompassDirection(NWBDataInterface):
@ -310,10 +333,13 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"CompassDirection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(CompassDirection)"}},
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class Position(NWBDataInterface): class Position(NWBDataInterface):
@ -325,10 +351,12 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"Position", json_schema_extra={"linkml_meta": {"ifabsent": "string(Position)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -190,11 +190,12 @@ class ElectricalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
NDArray[Shape["* num_times"], float], None,
NDArray[Shape["* num_times, * num_channels"], float], description="""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.""",
NDArray[Shape["* num_times, * num_channels, * num_samples"], float], json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
] = Field(..., description="""Recorded voltage data.""") )
data: ElectricalSeriesData = Field(..., description="""Recorded voltage data.""")
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -207,11 +208,6 @@ class ElectricalSeries(TimeSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -249,6 +245,41 @@ class ElectricalSeries(TimeSeries):
) )
class ElectricalSeriesData(ConfiguredBaseModel):
"""
Recorded voltage data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""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).""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_channels"], float | int],
NDArray[Shape["* num_times, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class SpikeEventSeries(ElectricalSeries): class SpikeEventSeries(ElectricalSeries):
""" """
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). 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).
@ -259,15 +290,17 @@ class SpikeEventSeries(ElectricalSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: SpikeEventSeriesData = Field(..., description="""Spike waveforms.""")
NDArray[Shape["* num_events, * num_samples"], float],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float],
] = Field(..., description="""Spike waveforms.""")
timestamps: NDArray[Shape["* num_times"], float] = Field( timestamps: NDArray[Shape["* num_times"], float] = Field(
..., ...,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -280,11 +313,6 @@ class SpikeEventSeries(ElectricalSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -317,6 +345,40 @@ class SpikeEventSeries(ElectricalSeries):
) )
class SpikeEventSeriesData(ConfiguredBaseModel):
"""
Spike waveforms.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""Unit of measurement for waveforms, which is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_events, * num_samples"], float | int],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class FeatureExtraction(NWBDataInterface): class FeatureExtraction(NWBDataInterface):
""" """
Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source. Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source.
@ -415,10 +477,12 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[SpikeEventSeries]] = Field( name: str = Field(
"EventWaveform", json_schema_extra={"linkml_meta": {"ifabsent": "string(EventWaveform)"}}
)
value: Optional[Dict[str, SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
) )
name: str = Field(...)
class FilteredEphys(NWBDataInterface): class FilteredEphys(NWBDataInterface):
@ -430,10 +494,12 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field(
"FilteredEphys", json_schema_extra={"linkml_meta": {"ifabsent": "string(FilteredEphys)"}}
)
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class LFP(NWBDataInterface): class LFP(NWBDataInterface):
@ -445,10 +511,10 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field("LFP", json_schema_extra={"linkml_meta": {"ifabsent": "string(LFP)"}})
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class ElectrodeGroup(NWBContainer): class ElectrodeGroup(NWBContainer):
@ -591,7 +657,9 @@ class Clustering(NWBDataInterface):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
ElectricalSeries.model_rebuild() ElectricalSeries.model_rebuild()
ElectricalSeriesData.model_rebuild()
SpikeEventSeries.model_rebuild() SpikeEventSeries.model_rebuild()
SpikeEventSeriesData.model_rebuild()
FeatureExtraction.model_rebuild() FeatureExtraction.model_rebuild()
EventDetection.model_rebuild() EventDetection.model_rebuild()
EventWaveform.model_rebuild() EventWaveform.model_rebuild()

View file

@ -247,9 +247,6 @@ class TimeIntervals(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class TimeIntervalsTimeseries(VectorData): class TimeIntervalsTimeseries(VectorData):

View file

@ -211,28 +211,28 @@ class NWBFile(NWBContainer):
..., ...,
description="""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).""", description="""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).""",
) )
acquisition: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( acquisition: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
analysis: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( analysis: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
scratch: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( scratch: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
processing: Optional[List[ProcessingModule]] = Field( processing: Optional[Dict[str, ProcessingModule]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}},
@ -250,6 +250,9 @@ class NWBFile(NWBContainer):
description="""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.""", description="""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.""",
) )
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""") units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
specifications: Optional[dict] = Field(
None, description="""Nested dictionary of schema specifications"""
)
class NWBFileStimulus(ConfiguredBaseModel): class NWBFileStimulus(ConfiguredBaseModel):
@ -265,12 +268,12 @@ class NWBFileStimulus(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"} "linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"}
}, },
) )
presentation: Optional[List[TimeSeries]] = Field( presentation: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""Stimuli presented during the experiment.""", description="""Stimuli presented during the experiment.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
) )
templates: Optional[List[TimeSeries]] = Field( templates: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
@ -348,11 +351,11 @@ class NWBFileGeneral(ConfiguredBaseModel):
None, None,
description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""", description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""",
) )
nwb_container: Optional[List[NWBContainer]] = Field( nwb_container: Optional[Dict[str, NWBContainer]] = Field(
None, None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""", description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
) )
devices: Optional[List[Device]] = Field( devices: Optional[Dict[str, Device]] = Field(
None, None,
description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""", description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}},
@ -367,12 +370,12 @@ class NWBFileGeneral(ConfiguredBaseModel):
intracellular_ephys: Optional[GeneralIntracellularEphys] = Field( intracellular_ephys: Optional[GeneralIntracellularEphys] = Field(
None, description="""Metadata related to intracellular electrophysiology.""" None, description="""Metadata related to intracellular electrophysiology."""
) )
optogenetics: Optional[List[OptogeneticStimulusSite]] = Field( optogenetics: Optional[Dict[str, OptogeneticStimulusSite]] = Field(
None, None,
description="""Metadata describing optogenetic stimuluation.""", description="""Metadata describing optogenetic stimuluation.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}},
) )
optophysiology: Optional[List[ImagingPlane]] = Field( optophysiology: Optional[Dict[str, ImagingPlane]] = Field(
None, None,
description="""Metadata related to optophysiology.""", description="""Metadata related to optophysiology.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}},
@ -450,12 +453,12 @@ class GeneralExtracellularEphys(ConfiguredBaseModel):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
electrodes: Optional[ExtracellularEphysElectrodes] = Field( electrodes: Optional[ExtracellularEphysElectrodes] = Field(
None, description="""A table of all electrodes (i.e. channels) used for recording.""" None, description="""A table of all electrodes (i.e. channels) used for recording."""
) )
value: Optional[Dict[str, ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
class ExtracellularEphysElectrodes(DynamicTable): class ExtracellularEphysElectrodes(DynamicTable):
@ -525,8 +528,14 @@ class ExtracellularEphysElectrodes(DynamicTable):
} }
}, },
) )
group: List[ElectrodeGroup] = Field( group: VectorData[NDArray[Any, ElectrodeGroup]] = Field(
..., description="""Reference to the ElectrodeGroup this electrode is a part of.""" ...,
description="""Reference to the ElectrodeGroup this electrode is a part of.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
) )
group_name: VectorData[NDArray[Any, str]] = Field( group_name: VectorData[NDArray[Any, str]] = Field(
..., ...,
@ -583,9 +592,6 @@ class ExtracellularEphysElectrodes(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class GeneralIntracellularEphys(ConfiguredBaseModel): class GeneralIntracellularEphys(ConfiguredBaseModel):
@ -608,12 +614,12 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
None, None,
description="""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.""", description="""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.""",
) )
intracellular_electrode: Optional[List[IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
sweep_table: Optional[SweepTable] = Field( sweep_table: Optional[SweepTable] = Field(
None, description="""The table which groups different PatchClampSeries together.""" None, description="""The table which groups different PatchClampSeries together."""
) )
value: Optional[Dict[str, IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
class NWBFileIntervals(ConfiguredBaseModel): class NWBFileIntervals(ConfiguredBaseModel):
@ -639,7 +645,7 @@ class NWBFileIntervals(ConfiguredBaseModel):
invalid_times: Optional[TimeIntervals] = Field( invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis.""" None, description="""Time intervals that should be removed from analysis."""
) )
time_intervals: Optional[List[TimeIntervals]] = Field( value: Optional[Dict[str, TimeIntervals]] = Field(
None, None,
description="""Optional additional table(s) for describing other experimental time intervals.""", description="""Optional additional table(s) for describing other experimental time intervals.""",
) )

View file

@ -262,11 +262,21 @@ class PatchClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
..., ...,
description="""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'.""", description="""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'.""",
) )
value: Optional[NDArray[Shape["* num_times"], float]] = Field( value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}} None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
) )
@ -281,12 +291,12 @@ class CurrentClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""") bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""")
bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""") bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""")
capacitance_compensation: Optional[float] = Field( capacitance_compensation: Optional[float] = Field(
None, description="""Capacitance compensation, in farads.""" None, description="""Capacitance compensation, in farads."""
) )
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
stimulus_description: str = Field( stimulus_description: str = Field(
..., description="""Protocol/stimulus name for this patch-clamp dataset.""" ..., description="""Protocol/stimulus name for this patch-clamp dataset."""
) )
@ -354,12 +364,24 @@ class CurrentClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IZeroClampSeries(CurrentClampSeries): class IZeroClampSeries(CurrentClampSeries):
@ -512,6 +534,16 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field( unit: Literal["amperes"] = Field(
"amperes", "amperes",
description="""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'.""", description="""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'.""",
@ -519,7 +551,9 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"} "linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
}, },
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeries(PatchClampSeries): class VoltageClampSeries(PatchClampSeries):
@ -532,13 +566,13 @@ class VoltageClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field( capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field(
None, description="""Fast capacitance, in farads.""" None, description="""Fast capacitance, in farads."""
) )
capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field( capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field(
None, description="""Slow capacitance, in farads.""" None, description="""Slow capacitance, in farads."""
) )
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field( resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field(
None, description="""Resistance compensation bandwidth, in hertz.""" None, description="""Resistance compensation bandwidth, in hertz."""
) )
@ -610,27 +644,6 @@ class VoltageClampSeries(PatchClampSeries):
) )
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Any = Field(...)
class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel): class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel):
""" """
Fast capacitance, in farads. Fast capacitance, in farads.
@ -683,6 +696,39 @@ class VoltageClampSeriesCapacitanceSlow(ConfiguredBaseModel):
value: float = Field(...) value: float = Field(...)
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel): class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel):
""" """
Resistance compensation bandwidth, in hertz. Resistance compensation bandwidth, in hertz.
@ -887,12 +933,24 @@ class VoltageClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntracellularElectrode(NWBContainer): class IntracellularElectrode(NWBContainer):
@ -942,18 +1000,15 @@ class SweepTable(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
sweep_number: VectorData[NDArray[Any, int]] = Field( series: VectorData[NDArray[Any, PatchClampSeries]] = Field(
..., ...,
description="""Sweep number of the PatchClampSeries in that row.""", description="""The PatchClampSeries with the sweep number in that row.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1} "array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
} }
}, },
) )
series: List[PatchClampSeries] = Field(
..., description="""The PatchClampSeries with the sweep number in that row."""
)
series_index: Named[VectorIndex] = Field( series_index: Named[VectorIndex] = Field(
..., ...,
description="""Index for series.""", description="""Index for series.""",
@ -966,6 +1021,15 @@ class SweepTable(DynamicTable):
} }
}, },
) )
sweep_number: VectorData[NDArray[Any, int]] = Field(
...,
description="""Sweep number of the PatchClampSeries in that row.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -976,9 +1040,6 @@ class SweepTable(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild
@ -991,9 +1052,9 @@ IZeroClampSeries.model_rebuild()
CurrentClampStimulusSeries.model_rebuild() CurrentClampStimulusSeries.model_rebuild()
CurrentClampStimulusSeriesData.model_rebuild() CurrentClampStimulusSeriesData.model_rebuild()
VoltageClampSeries.model_rebuild() VoltageClampSeries.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesCapacitanceFast.model_rebuild() VoltageClampSeriesCapacitanceFast.model_rebuild()
VoltageClampSeriesCapacitanceSlow.model_rebuild() VoltageClampSeriesCapacitanceSlow.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesResistanceCompBandwidth.model_rebuild() VoltageClampSeriesResistanceCompBandwidth.model_rebuild()
VoltageClampSeriesResistanceCompCorrection.model_rebuild() VoltageClampSeriesResistanceCompCorrection.model_rebuild()
VoltageClampSeriesResistanceCompPrediction.model_rebuild() VoltageClampSeriesResistanceCompPrediction.model_rebuild()

View file

@ -152,7 +152,7 @@ class GrayscaleImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -174,7 +174,7 @@ class RGBImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -204,7 +204,7 @@ class RGBAImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -234,12 +234,9 @@ class ImageSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -250,8 +247,9 @@ class ImageSeries(TimeSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -290,6 +288,39 @@ class ImageSeries(TimeSeries):
) )
class ImageSeriesData(ConfiguredBaseModel):
"""
Binary data representing images across frames.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, * z"], float | int],
]
] = Field(None)
class ImageSeriesExternalFile(ConfiguredBaseModel): class ImageSeriesExternalFile(ConfiguredBaseModel):
""" """
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. 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.
@ -331,12 +362,9 @@ class ImageMaskSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -347,8 +375,9 @@ class ImageMaskSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -409,12 +438,9 @@ class OpticalSeries(ImageSeries):
None, None,
description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""", description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""",
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -425,8 +451,9 @@ class OpticalSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -475,10 +502,8 @@ class IndexSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IndexSeriesData = Field(
..., ..., description="""Index of the frame in the referenced ImageSeries."""
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
indexed_timeseries: Union[ImageSeries, str] = Field( indexed_timeseries: Union[ImageSeries, str] = Field(
..., ...,
@ -526,13 +551,45 @@ class IndexSeries(TimeSeries):
) )
class IndexSeriesData(ConfiguredBaseModel):
"""
Index of the frame in the referenced ImageSeries.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
GrayscaleImage.model_rebuild() GrayscaleImage.model_rebuild()
RGBImage.model_rebuild() RGBImage.model_rebuild()
RGBAImage.model_rebuild() RGBAImage.model_rebuild()
ImageSeries.model_rebuild() ImageSeries.model_rebuild()
ImageSeriesData.model_rebuild()
ImageSeriesExternalFile.model_rebuild() ImageSeriesExternalFile.model_rebuild()
ImageMaskSeries.model_rebuild() ImageMaskSeries.model_rebuild()
OpticalSeries.model_rebuild() OpticalSeries.model_rebuild()
IndexSeries.model_rebuild() IndexSeries.model_rebuild()
IndexSeriesData.model_rebuild()

View file

@ -251,6 +251,16 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"see ", "see ",
description="""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'\".""", description="""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'\".""",
@ -258,8 +268,8 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -274,10 +284,8 @@ class AnnotationSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], str] = Field( data: AnnotationSeriesData = Field(
..., ..., description="""Annotations made during an experiment."""
description="""Annotations made during an experiment.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -316,6 +324,39 @@ class AnnotationSeries(TimeSeries):
) )
class AnnotationSeriesData(ConfiguredBaseModel):
"""
Annotations made during an experiment.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntervalSeries(TimeSeries): class IntervalSeries(TimeSeries):
""" """
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. 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.
@ -326,10 +367,8 @@ class IntervalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IntervalSeriesData = Field(
..., ..., description="""Use values >0 if interval started, <0 if interval ended."""
description="""Use values >0 if interval started, <0 if interval ended.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -368,6 +407,39 @@ class IntervalSeries(TimeSeries):
) )
class IntervalSeriesData(ConfiguredBaseModel):
"""
Use values >0 if interval started, <0 if interval ended.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class DecompositionSeries(TimeSeries): class DecompositionSeries(TimeSeries):
""" """
Spectral analysis of a time series, e.g. of an LFP or a speech signal. Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -443,24 +515,36 @@ class DecompositionSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
"no unit", "no unit",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}}, json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}},
) )
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field( value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float | int]] = (
None, Field(
json_schema_extra={ None,
"linkml_meta": { json_schema_extra={
"array": { "linkml_meta": {
"dimensions": [ "array": {
{"alias": "num_times"}, "dimensions": [
{"alias": "num_channels"}, {"alias": "num_times"},
{"alias": "num_bands"}, {"alias": "num_channels"},
] {"alias": "num_bands"},
]
}
} }
} },
}, )
) )
@ -518,9 +602,6 @@ class DecompositionSeriesBands(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class Units(DynamicTable): class Units(DynamicTable):
@ -533,9 +614,18 @@ class Units(DynamicTable):
) )
name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}}) name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}})
spike_times_index: Optional[Named[VectorIndex]] = Field( electrode_group: Optional[VectorData[NDArray[Any, ElectrodeGroup]]] = Field(
None, None,
description="""Index into the spike_times dataset.""", description="""Electrode group that each spike unit came from.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
electrodes: Optional[Named[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -545,12 +635,9 @@ class Units(DynamicTable):
} }
}, },
) )
spike_times: Optional[UnitsSpikeTimes] = Field( electrodes_index: Optional[Named[VectorIndex]] = Field(
None, description="""Spike times for each unit."""
)
obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into the obs_intervals dataset.""", description="""Index into electrodes.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -576,9 +663,9 @@ class Units(DynamicTable):
}, },
) )
) )
electrodes_index: Optional[Named[VectorIndex]] = Field( obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into electrodes.""", description="""Index into the obs_intervals dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -588,9 +675,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrodes: Optional[Named[DynamicTableRegion]] = Field( spike_times: Optional[UnitsSpikeTimes] = Field(
None, description="""Spike times for each unit."""
)
spike_times_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""", description="""Index into the spike_times dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -600,25 +690,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field( waveform_mean: Optional[UnitsWaveformMean] = Field(
None, description="""Electrode group that each spike unit came from.""" None, description="""Spike waveform mean for each spike unit."""
)
waveform_sd: Optional[UnitsWaveformSd] = Field(
None, description="""Spike waveform standard deviation for each spike unit."""
) )
waveform_mean: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform mean for each spike unit.""")
waveform_sd: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform standard deviation for each spike unit.""")
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -629,9 +706,6 @@ class Units(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class UnitsSpikeTimes(VectorData): class UnitsSpikeTimes(VectorData):
@ -654,14 +728,62 @@ class UnitsSpikeTimes(VectorData):
description: str = Field(..., description="""Description of what these vectors represent.""") description: str = Field(..., description="""Description of what these vectors represent.""")
class UnitsWaveformMean(VectorData):
"""
Spike waveform mean for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_mean"] = Field(
"waveform_mean",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_mean", "ifabsent": "string(waveform_mean)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
class UnitsWaveformSd(VectorData):
"""
Spike waveform standard deviation for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_sd"] = Field(
"waveform_sd",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_sd", "ifabsent": "string(waveform_sd)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
AbstractFeatureSeries.model_rebuild() AbstractFeatureSeries.model_rebuild()
AbstractFeatureSeriesData.model_rebuild() AbstractFeatureSeriesData.model_rebuild()
AnnotationSeries.model_rebuild() AnnotationSeries.model_rebuild()
AnnotationSeriesData.model_rebuild()
IntervalSeries.model_rebuild() IntervalSeries.model_rebuild()
IntervalSeriesData.model_rebuild()
DecompositionSeries.model_rebuild() DecompositionSeries.model_rebuild()
DecompositionSeriesData.model_rebuild() DecompositionSeriesData.model_rebuild()
DecompositionSeriesBands.model_rebuild() DecompositionSeriesBands.model_rebuild()
Units.model_rebuild() Units.model_rebuild()
UnitsSpikeTimes.model_rebuild() UnitsSpikeTimes.model_rebuild()
UnitsWaveformMean.model_rebuild()
UnitsWaveformSd.model_rebuild()

View file

@ -158,10 +158,8 @@ class OptogeneticSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], float] = Field( data: OptogeneticSeriesData = Field(
..., ..., description="""Applied power for optogenetic stimulus, in watts."""
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
site: Union[OptogeneticStimulusSite, str] = Field( site: Union[OptogeneticStimulusSite, str] = Field(
..., ...,
@ -209,6 +207,37 @@ class OptogeneticSeries(TimeSeries):
) )
class OptogeneticSeriesData(ConfiguredBaseModel):
"""
Applied power for optogenetic stimulus, in watts.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ogen"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["watts"] = Field(
"watts",
description="""Unit of measurement for data, which is fixed to 'watts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "watts", "ifabsent": "string(watts)"}},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class OptogeneticStimulusSite(NWBContainer): class OptogeneticStimulusSite(NWBContainer):
""" """
A site of optogenetic stimulation. A site of optogenetic stimulation.
@ -239,4 +268,5 @@ class OptogeneticStimulusSite(NWBContainer):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
OptogeneticSeries.model_rebuild() OptogeneticSeries.model_rebuild()
OptogeneticSeriesData.model_rebuild()
OptogeneticStimulusSite.model_rebuild() OptogeneticStimulusSite.model_rebuild()

View file

@ -28,7 +28,7 @@ from ...core.v2_2_0.core_nwb_base import (
TimeSeriesSync, TimeSeriesSync,
) )
from ...core.v2_2_0.core_nwb_device import Device from ...core.v2_2_0.core_nwb_device import Device
from ...core.v2_2_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile from ...core.v2_2_0.core_nwb_image import ImageSeries, ImageSeriesData, ImageSeriesExternalFile
from ...hdmf_common.v1_1_0.hdmf_common_table import DynamicTable, DynamicTableRegion from ...hdmf_common.v1_1_0.hdmf_common_table import DynamicTable, DynamicTableRegion
@ -209,12 +209,9 @@ class TwoPhotonSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -225,8 +222,9 @@ class TwoPhotonSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -275,9 +273,7 @@ class RoiResponseSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: RoiResponseSeriesData = Field(..., description="""Signals from ROIs.""")
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times, * num_rois"], float]
] = Field(..., description="""Signals from ROIs.""")
rois: Named[DynamicTableRegion] = Field( rois: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""", description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
@ -327,6 +323,39 @@ class RoiResponseSeries(TimeSeries):
) )
class RoiResponseSeriesData(ConfiguredBaseModel):
"""
Signals from ROIs.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_rois"], float | int],
]
] = Field(None)
class DfOverF(NWBDataInterface): class DfOverF(NWBDataInterface):
""" """
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). 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).
@ -336,10 +365,10 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field("DfOverF", json_schema_extra={"linkml_meta": {"ifabsent": "string(DfOverF)"}})
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class Fluorescence(NWBDataInterface): class Fluorescence(NWBDataInterface):
@ -351,10 +380,12 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field(
"Fluorescence", json_schema_extra={"linkml_meta": {"ifabsent": "string(Fluorescence)"}}
)
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class ImageSegmentation(NWBDataInterface): class ImageSegmentation(NWBDataInterface):
@ -366,10 +397,13 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[DynamicTable]] = Field( name: str = Field(
"ImageSegmentation",
json_schema_extra={"linkml_meta": {"ifabsent": "string(ImageSegmentation)"}},
)
value: Optional[Dict[str, DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
) )
name: str = Field(...)
class ImagingPlane(NWBContainer): class ImagingPlane(NWBContainer):
@ -538,16 +572,20 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[NWBDataInterface]] = Field( name: str = Field(
"MotionCorrection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(MotionCorrection)"}},
)
value: Optional[Dict[str, NWBDataInterface]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
TwoPhotonSeries.model_rebuild() TwoPhotonSeries.model_rebuild()
RoiResponseSeries.model_rebuild() RoiResponseSeries.model_rebuild()
RoiResponseSeriesData.model_rebuild()
DfOverF.model_rebuild() DfOverF.model_rebuild()
Fluorescence.model_rebuild() Fluorescence.model_rebuild()
ImageSegmentation.model_rebuild() ImageSegmentation.model_rebuild()

View file

@ -235,7 +235,7 @@ class RetinotopyImage(GrayscaleImage):
) )
field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""") field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""")
format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""") format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""")
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -374,7 +374,7 @@ class ImagingRetinotopyFocalDepthImage(RetinotopyImage):
) )
field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""") field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""")
format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""") format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""")
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}

View file

@ -38,6 +38,7 @@ from ...core.v2_2_0.core_nwb_ecephys import (
ClusterWaveforms, ClusterWaveforms,
Clustering, Clustering,
ElectricalSeries, ElectricalSeries,
ElectricalSeriesData,
ElectrodeGroup, ElectrodeGroup,
ElectrodeGroupPosition, ElectrodeGroupPosition,
EventDetection, EventDetection,
@ -46,6 +47,7 @@ from ...core.v2_2_0.core_nwb_ecephys import (
FilteredEphys, FilteredEphys,
LFP, LFP,
SpikeEventSeries, SpikeEventSeries,
SpikeEventSeriesData,
) )
from ...core.v2_2_0.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries from ...core.v2_2_0.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries
from ...core.v2_2_0.core_nwb_file import ( from ...core.v2_2_0.core_nwb_file import (
@ -85,8 +87,10 @@ from ...core.v2_2_0.core_nwb_image import (
GrayscaleImage, GrayscaleImage,
ImageMaskSeries, ImageMaskSeries,
ImageSeries, ImageSeries,
ImageSeriesData,
ImageSeriesExternalFile, ImageSeriesExternalFile,
IndexSeries, IndexSeries,
IndexSeriesData,
OpticalSeries, OpticalSeries,
RGBAImage, RGBAImage,
RGBImage, RGBImage,
@ -95,14 +99,22 @@ from ...core.v2_2_0.core_nwb_misc import (
AbstractFeatureSeries, AbstractFeatureSeries,
AbstractFeatureSeriesData, AbstractFeatureSeriesData,
AnnotationSeries, AnnotationSeries,
AnnotationSeriesData,
DecompositionSeries, DecompositionSeries,
DecompositionSeriesBands, DecompositionSeriesBands,
DecompositionSeriesData, DecompositionSeriesData,
IntervalSeries, IntervalSeries,
IntervalSeriesData,
Units, Units,
UnitsSpikeTimes, UnitsSpikeTimes,
UnitsWaveformMean,
UnitsWaveformSd,
)
from ...core.v2_2_0.core_nwb_ogen import (
OptogeneticSeries,
OptogeneticSeriesData,
OptogeneticStimulusSite,
) )
from ...core.v2_2_0.core_nwb_ogen import OptogeneticSeries, OptogeneticStimulusSite
from ...core.v2_2_0.core_nwb_ophys import ( from ...core.v2_2_0.core_nwb_ophys import (
DfOverF, DfOverF,
Fluorescence, Fluorescence,
@ -114,6 +126,7 @@ from ...core.v2_2_0.core_nwb_ophys import (
MotionCorrection, MotionCorrection,
OpticalChannel, OpticalChannel,
RoiResponseSeries, RoiResponseSeries,
RoiResponseSeriesData,
TwoPhotonSeries, TwoPhotonSeries,
) )
from ...core.v2_2_0.core_nwb_retinotopy import ( from ...core.v2_2_0.core_nwb_retinotopy import (

View file

@ -170,9 +170,9 @@ class Image(NWBData):
description: Optional[str] = Field(None, description="""Description of the image.""") description: Optional[str] = Field(None, description="""Description of the image.""")
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* x, * y"], float], NDArray[Shape["* x, * y"], float | int],
NDArray[Shape["* x, * y, 3 r_g_b"], float], NDArray[Shape["* x, * y, 3 r_g_b"], float | int],
NDArray[Shape["* x, * y, 4 r_g_b_a"], float], NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -333,13 +333,16 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True} {"from_schema": "core.nwb.base", "tree_root": True}
) )
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( name: str = Field(...)
description: str = Field(
..., description="""Description of this collection of processed data."""
)
value: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
name: str = Field(...)
class Images(NWBDataInterface): class Images(NWBDataInterface):
@ -353,7 +356,7 @@ class Images(NWBDataInterface):
name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}}) name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}})
description: str = Field(..., description="""Description of this collection of images.""") description: str = Field(..., description="""Description of this collection of images.""")
image: List[Image] = Field(..., description="""Images stored in this collection.""") image: List[str] = Field(..., description="""Images stored in this collection.""")
# Model rebuild # Model rebuild

View file

@ -213,6 +213,16 @@ class SpatialSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"meters", "meters",
description="""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'.""", description="""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'.""",
@ -220,8 +230,8 @@ class SpatialSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -235,10 +245,13 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[IntervalSeries]] = Field( name: str = Field(
"BehavioralEpochs",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEpochs)"}},
)
value: Optional[Dict[str, IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
) )
name: str = Field(...)
class BehavioralEvents(NWBDataInterface): class BehavioralEvents(NWBDataInterface):
@ -250,10 +263,13 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralEvents",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEvents)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class BehavioralTimeSeries(NWBDataInterface): class BehavioralTimeSeries(NWBDataInterface):
@ -265,10 +281,13 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralTimeSeries",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralTimeSeries)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class PupilTracking(NWBDataInterface): class PupilTracking(NWBDataInterface):
@ -280,10 +299,12 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"PupilTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(PupilTracking)"}}
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class EyeTracking(NWBDataInterface): class EyeTracking(NWBDataInterface):
@ -295,10 +316,12 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"EyeTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(EyeTracking)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class CompassDirection(NWBDataInterface): class CompassDirection(NWBDataInterface):
@ -310,10 +333,13 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"CompassDirection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(CompassDirection)"}},
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class Position(NWBDataInterface): class Position(NWBDataInterface):
@ -325,10 +351,12 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"Position", json_schema_extra={"linkml_meta": {"ifabsent": "string(Position)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -190,11 +190,12 @@ class ElectricalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
NDArray[Shape["* num_times"], float], None,
NDArray[Shape["* num_times, * num_channels"], float], description="""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.""",
NDArray[Shape["* num_times, * num_channels, * num_samples"], float], json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
] = Field(..., description="""Recorded voltage data.""") )
data: ElectricalSeriesData = Field(..., description="""Recorded voltage data.""")
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -207,11 +208,6 @@ class ElectricalSeries(TimeSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -249,6 +245,41 @@ class ElectricalSeries(TimeSeries):
) )
class ElectricalSeriesData(ConfiguredBaseModel):
"""
Recorded voltage data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""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).""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_channels"], float | int],
NDArray[Shape["* num_times, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class SpikeEventSeries(ElectricalSeries): class SpikeEventSeries(ElectricalSeries):
""" """
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). 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).
@ -259,15 +290,17 @@ class SpikeEventSeries(ElectricalSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: SpikeEventSeriesData = Field(..., description="""Spike waveforms.""")
NDArray[Shape["* num_events, * num_samples"], float],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float],
] = Field(..., description="""Spike waveforms.""")
timestamps: NDArray[Shape["* num_times"], float] = Field( timestamps: NDArray[Shape["* num_times"], float] = Field(
..., ...,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -280,11 +313,6 @@ class SpikeEventSeries(ElectricalSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -317,6 +345,40 @@ class SpikeEventSeries(ElectricalSeries):
) )
class SpikeEventSeriesData(ConfiguredBaseModel):
"""
Spike waveforms.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""Unit of measurement for waveforms, which is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_events, * num_samples"], float | int],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class FeatureExtraction(NWBDataInterface): class FeatureExtraction(NWBDataInterface):
""" """
Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source. Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source.
@ -415,10 +477,12 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[SpikeEventSeries]] = Field( name: str = Field(
"EventWaveform", json_schema_extra={"linkml_meta": {"ifabsent": "string(EventWaveform)"}}
)
value: Optional[Dict[str, SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
) )
name: str = Field(...)
class FilteredEphys(NWBDataInterface): class FilteredEphys(NWBDataInterface):
@ -430,10 +494,12 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field(
"FilteredEphys", json_schema_extra={"linkml_meta": {"ifabsent": "string(FilteredEphys)"}}
)
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class LFP(NWBDataInterface): class LFP(NWBDataInterface):
@ -445,10 +511,10 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field("LFP", json_schema_extra={"linkml_meta": {"ifabsent": "string(LFP)"}})
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class ElectrodeGroup(NWBContainer): class ElectrodeGroup(NWBContainer):
@ -591,7 +657,9 @@ class Clustering(NWBDataInterface):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
ElectricalSeries.model_rebuild() ElectricalSeries.model_rebuild()
ElectricalSeriesData.model_rebuild()
SpikeEventSeries.model_rebuild() SpikeEventSeries.model_rebuild()
SpikeEventSeriesData.model_rebuild()
FeatureExtraction.model_rebuild() FeatureExtraction.model_rebuild()
EventDetection.model_rebuild() EventDetection.model_rebuild()
EventWaveform.model_rebuild() EventWaveform.model_rebuild()

View file

@ -247,9 +247,6 @@ class TimeIntervals(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class TimeIntervalsTimeseries(VectorData): class TimeIntervalsTimeseries(VectorData):

View file

@ -211,28 +211,28 @@ class NWBFile(NWBContainer):
..., ...,
description="""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).""", description="""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).""",
) )
acquisition: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( acquisition: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
analysis: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( analysis: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
scratch: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( scratch: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
processing: Optional[List[ProcessingModule]] = Field( processing: Optional[Dict[str, ProcessingModule]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}},
@ -250,6 +250,9 @@ class NWBFile(NWBContainer):
description="""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.""", description="""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.""",
) )
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""") units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
specifications: Optional[dict] = Field(
None, description="""Nested dictionary of schema specifications"""
)
class NWBFileStimulus(ConfiguredBaseModel): class NWBFileStimulus(ConfiguredBaseModel):
@ -265,12 +268,12 @@ class NWBFileStimulus(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"} "linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"}
}, },
) )
presentation: Optional[List[TimeSeries]] = Field( presentation: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""Stimuli presented during the experiment.""", description="""Stimuli presented during the experiment.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
) )
templates: Optional[List[TimeSeries]] = Field( templates: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
@ -348,11 +351,11 @@ class NWBFileGeneral(ConfiguredBaseModel):
None, None,
description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""", description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""",
) )
nwb_container: Optional[List[NWBContainer]] = Field( nwb_container: Optional[Dict[str, NWBContainer]] = Field(
None, None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""", description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
) )
devices: Optional[List[Device]] = Field( devices: Optional[Dict[str, Device]] = Field(
None, None,
description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""", description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}},
@ -367,12 +370,12 @@ class NWBFileGeneral(ConfiguredBaseModel):
intracellular_ephys: Optional[GeneralIntracellularEphys] = Field( intracellular_ephys: Optional[GeneralIntracellularEphys] = Field(
None, description="""Metadata related to intracellular electrophysiology.""" None, description="""Metadata related to intracellular electrophysiology."""
) )
optogenetics: Optional[List[OptogeneticStimulusSite]] = Field( optogenetics: Optional[Dict[str, OptogeneticStimulusSite]] = Field(
None, None,
description="""Metadata describing optogenetic stimuluation.""", description="""Metadata describing optogenetic stimuluation.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}},
) )
optophysiology: Optional[List[ImagingPlane]] = Field( optophysiology: Optional[Dict[str, ImagingPlane]] = Field(
None, None,
description="""Metadata related to optophysiology.""", description="""Metadata related to optophysiology.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}},
@ -450,12 +453,12 @@ class GeneralExtracellularEphys(ConfiguredBaseModel):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
electrodes: Optional[ExtracellularEphysElectrodes] = Field( electrodes: Optional[ExtracellularEphysElectrodes] = Field(
None, description="""A table of all electrodes (i.e. channels) used for recording.""" None, description="""A table of all electrodes (i.e. channels) used for recording."""
) )
value: Optional[Dict[str, ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
class ExtracellularEphysElectrodes(DynamicTable): class ExtracellularEphysElectrodes(DynamicTable):
@ -525,8 +528,14 @@ class ExtracellularEphysElectrodes(DynamicTable):
} }
}, },
) )
group: List[ElectrodeGroup] = Field( group: VectorData[NDArray[Any, ElectrodeGroup]] = Field(
..., description="""Reference to the ElectrodeGroup this electrode is a part of.""" ...,
description="""Reference to the ElectrodeGroup this electrode is a part of.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
) )
group_name: VectorData[NDArray[Any, str]] = Field( group_name: VectorData[NDArray[Any, str]] = Field(
..., ...,
@ -583,9 +592,6 @@ class ExtracellularEphysElectrodes(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class GeneralIntracellularEphys(ConfiguredBaseModel): class GeneralIntracellularEphys(ConfiguredBaseModel):
@ -608,12 +614,12 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
None, None,
description="""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.""", description="""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.""",
) )
intracellular_electrode: Optional[List[IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
sweep_table: Optional[SweepTable] = Field( sweep_table: Optional[SweepTable] = Field(
None, description="""The table which groups different PatchClampSeries together.""" None, description="""The table which groups different PatchClampSeries together."""
) )
value: Optional[Dict[str, IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
class NWBFileIntervals(ConfiguredBaseModel): class NWBFileIntervals(ConfiguredBaseModel):
@ -639,7 +645,7 @@ class NWBFileIntervals(ConfiguredBaseModel):
invalid_times: Optional[TimeIntervals] = Field( invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis.""" None, description="""Time intervals that should be removed from analysis."""
) )
time_intervals: Optional[List[TimeIntervals]] = Field( value: Optional[Dict[str, TimeIntervals]] = Field(
None, None,
description="""Optional additional table(s) for describing other experimental time intervals.""", description="""Optional additional table(s) for describing other experimental time intervals.""",
) )

View file

@ -262,11 +262,21 @@ class PatchClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
..., ...,
description="""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'.""", description="""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'.""",
) )
value: Optional[NDArray[Shape["* num_times"], float]] = Field( value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}} None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
) )
@ -281,12 +291,12 @@ class CurrentClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""") bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""")
bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""") bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""")
capacitance_compensation: Optional[float] = Field( capacitance_compensation: Optional[float] = Field(
None, description="""Capacitance compensation, in farads.""" None, description="""Capacitance compensation, in farads."""
) )
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
stimulus_description: str = Field( stimulus_description: str = Field(
..., description="""Protocol/stimulus name for this patch-clamp dataset.""" ..., description="""Protocol/stimulus name for this patch-clamp dataset."""
) )
@ -354,12 +364,24 @@ class CurrentClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IZeroClampSeries(CurrentClampSeries): class IZeroClampSeries(CurrentClampSeries):
@ -512,6 +534,16 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field( unit: Literal["amperes"] = Field(
"amperes", "amperes",
description="""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'.""", description="""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'.""",
@ -519,7 +551,9 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"} "linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
}, },
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeries(PatchClampSeries): class VoltageClampSeries(PatchClampSeries):
@ -532,13 +566,13 @@ class VoltageClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field( capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field(
None, description="""Fast capacitance, in farads.""" None, description="""Fast capacitance, in farads."""
) )
capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field( capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field(
None, description="""Slow capacitance, in farads.""" None, description="""Slow capacitance, in farads."""
) )
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field( resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field(
None, description="""Resistance compensation bandwidth, in hertz.""" None, description="""Resistance compensation bandwidth, in hertz."""
) )
@ -610,27 +644,6 @@ class VoltageClampSeries(PatchClampSeries):
) )
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Any = Field(...)
class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel): class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel):
""" """
Fast capacitance, in farads. Fast capacitance, in farads.
@ -683,6 +696,39 @@ class VoltageClampSeriesCapacitanceSlow(ConfiguredBaseModel):
value: float = Field(...) value: float = Field(...)
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel): class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel):
""" """
Resistance compensation bandwidth, in hertz. Resistance compensation bandwidth, in hertz.
@ -887,12 +933,24 @@ class VoltageClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntracellularElectrode(NWBContainer): class IntracellularElectrode(NWBContainer):
@ -942,18 +1000,15 @@ class SweepTable(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
sweep_number: VectorData[NDArray[Any, int]] = Field( series: VectorData[NDArray[Any, PatchClampSeries]] = Field(
..., ...,
description="""Sweep number of the PatchClampSeries in that row.""", description="""The PatchClampSeries with the sweep number in that row.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1} "array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
} }
}, },
) )
series: List[PatchClampSeries] = Field(
..., description="""The PatchClampSeries with the sweep number in that row."""
)
series_index: Named[VectorIndex] = Field( series_index: Named[VectorIndex] = Field(
..., ...,
description="""Index for series.""", description="""Index for series.""",
@ -966,6 +1021,15 @@ class SweepTable(DynamicTable):
} }
}, },
) )
sweep_number: VectorData[NDArray[Any, int]] = Field(
...,
description="""Sweep number of the PatchClampSeries in that row.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -976,9 +1040,6 @@ class SweepTable(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild
@ -991,9 +1052,9 @@ IZeroClampSeries.model_rebuild()
CurrentClampStimulusSeries.model_rebuild() CurrentClampStimulusSeries.model_rebuild()
CurrentClampStimulusSeriesData.model_rebuild() CurrentClampStimulusSeriesData.model_rebuild()
VoltageClampSeries.model_rebuild() VoltageClampSeries.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesCapacitanceFast.model_rebuild() VoltageClampSeriesCapacitanceFast.model_rebuild()
VoltageClampSeriesCapacitanceSlow.model_rebuild() VoltageClampSeriesCapacitanceSlow.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesResistanceCompBandwidth.model_rebuild() VoltageClampSeriesResistanceCompBandwidth.model_rebuild()
VoltageClampSeriesResistanceCompCorrection.model_rebuild() VoltageClampSeriesResistanceCompCorrection.model_rebuild()
VoltageClampSeriesResistanceCompPrediction.model_rebuild() VoltageClampSeriesResistanceCompPrediction.model_rebuild()

View file

@ -152,7 +152,7 @@ class GrayscaleImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -174,7 +174,7 @@ class RGBImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -204,7 +204,7 @@ class RGBAImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -234,12 +234,9 @@ class ImageSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -250,8 +247,9 @@ class ImageSeries(TimeSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -290,6 +288,39 @@ class ImageSeries(TimeSeries):
) )
class ImageSeriesData(ConfiguredBaseModel):
"""
Binary data representing images across frames.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, * z"], float | int],
]
] = Field(None)
class ImageSeriesExternalFile(ConfiguredBaseModel): class ImageSeriesExternalFile(ConfiguredBaseModel):
""" """
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. 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.
@ -331,12 +362,9 @@ class ImageMaskSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -347,8 +375,9 @@ class ImageMaskSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -409,12 +438,9 @@ class OpticalSeries(ImageSeries):
None, None,
description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""", description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""",
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -425,8 +451,9 @@ class OpticalSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -475,10 +502,8 @@ class IndexSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IndexSeriesData = Field(
..., ..., description="""Index of the frame in the referenced ImageSeries."""
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
indexed_timeseries: Union[ImageSeries, str] = Field( indexed_timeseries: Union[ImageSeries, str] = Field(
..., ...,
@ -526,13 +551,45 @@ class IndexSeries(TimeSeries):
) )
class IndexSeriesData(ConfiguredBaseModel):
"""
Index of the frame in the referenced ImageSeries.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
GrayscaleImage.model_rebuild() GrayscaleImage.model_rebuild()
RGBImage.model_rebuild() RGBImage.model_rebuild()
RGBAImage.model_rebuild() RGBAImage.model_rebuild()
ImageSeries.model_rebuild() ImageSeries.model_rebuild()
ImageSeriesData.model_rebuild()
ImageSeriesExternalFile.model_rebuild() ImageSeriesExternalFile.model_rebuild()
ImageMaskSeries.model_rebuild() ImageMaskSeries.model_rebuild()
OpticalSeries.model_rebuild() OpticalSeries.model_rebuild()
IndexSeries.model_rebuild() IndexSeries.model_rebuild()
IndexSeriesData.model_rebuild()

View file

@ -251,6 +251,16 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"see ", "see ",
description="""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'\".""", description="""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'\".""",
@ -258,8 +268,8 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -274,10 +284,8 @@ class AnnotationSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], str] = Field( data: AnnotationSeriesData = Field(
..., ..., description="""Annotations made during an experiment."""
description="""Annotations made during an experiment.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -316,6 +324,39 @@ class AnnotationSeries(TimeSeries):
) )
class AnnotationSeriesData(ConfiguredBaseModel):
"""
Annotations made during an experiment.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntervalSeries(TimeSeries): class IntervalSeries(TimeSeries):
""" """
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. 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.
@ -326,10 +367,8 @@ class IntervalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IntervalSeriesData = Field(
..., ..., description="""Use values >0 if interval started, <0 if interval ended."""
description="""Use values >0 if interval started, <0 if interval ended.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -368,6 +407,39 @@ class IntervalSeries(TimeSeries):
) )
class IntervalSeriesData(ConfiguredBaseModel):
"""
Use values >0 if interval started, <0 if interval ended.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class DecompositionSeries(TimeSeries): class DecompositionSeries(TimeSeries):
""" """
Spectral analysis of a time series, e.g. of an LFP or a speech signal. Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -443,24 +515,36 @@ class DecompositionSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
"no unit", "no unit",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}}, json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}},
) )
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field( value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float | int]] = (
None, Field(
json_schema_extra={ None,
"linkml_meta": { json_schema_extra={
"array": { "linkml_meta": {
"dimensions": [ "array": {
{"alias": "num_times"}, "dimensions": [
{"alias": "num_channels"}, {"alias": "num_times"},
{"alias": "num_bands"}, {"alias": "num_channels"},
] {"alias": "num_bands"},
]
}
} }
} },
}, )
) )
@ -518,9 +602,6 @@ class DecompositionSeriesBands(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class Units(DynamicTable): class Units(DynamicTable):
@ -533,9 +614,18 @@ class Units(DynamicTable):
) )
name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}}) name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}})
spike_times_index: Optional[Named[VectorIndex]] = Field( electrode_group: Optional[VectorData[NDArray[Any, ElectrodeGroup]]] = Field(
None, None,
description="""Index into the spike_times dataset.""", description="""Electrode group that each spike unit came from.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
electrodes: Optional[Named[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -545,12 +635,9 @@ class Units(DynamicTable):
} }
}, },
) )
spike_times: Optional[UnitsSpikeTimes] = Field( electrodes_index: Optional[Named[VectorIndex]] = Field(
None, description="""Spike times for each unit."""
)
obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into the obs_intervals dataset.""", description="""Index into electrodes.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -576,9 +663,9 @@ class Units(DynamicTable):
}, },
) )
) )
electrodes_index: Optional[Named[VectorIndex]] = Field( obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into electrodes.""", description="""Index into the obs_intervals dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -588,9 +675,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrodes: Optional[Named[DynamicTableRegion]] = Field( spike_times: Optional[UnitsSpikeTimes] = Field(
None, description="""Spike times for each unit."""
)
spike_times_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""", description="""Index into the spike_times dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -600,25 +690,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field( waveform_mean: Optional[UnitsWaveformMean] = Field(
None, description="""Electrode group that each spike unit came from.""" None, description="""Spike waveform mean for each spike unit."""
)
waveform_sd: Optional[UnitsWaveformSd] = Field(
None, description="""Spike waveform standard deviation for each spike unit."""
) )
waveform_mean: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform mean for each spike unit.""")
waveform_sd: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform standard deviation for each spike unit.""")
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -629,9 +706,6 @@ class Units(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class UnitsSpikeTimes(VectorData): class UnitsSpikeTimes(VectorData):
@ -654,14 +728,62 @@ class UnitsSpikeTimes(VectorData):
description: str = Field(..., description="""Description of what these vectors represent.""") description: str = Field(..., description="""Description of what these vectors represent.""")
class UnitsWaveformMean(VectorData):
"""
Spike waveform mean for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_mean"] = Field(
"waveform_mean",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_mean", "ifabsent": "string(waveform_mean)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
class UnitsWaveformSd(VectorData):
"""
Spike waveform standard deviation for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_sd"] = Field(
"waveform_sd",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_sd", "ifabsent": "string(waveform_sd)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
AbstractFeatureSeries.model_rebuild() AbstractFeatureSeries.model_rebuild()
AbstractFeatureSeriesData.model_rebuild() AbstractFeatureSeriesData.model_rebuild()
AnnotationSeries.model_rebuild() AnnotationSeries.model_rebuild()
AnnotationSeriesData.model_rebuild()
IntervalSeries.model_rebuild() IntervalSeries.model_rebuild()
IntervalSeriesData.model_rebuild()
DecompositionSeries.model_rebuild() DecompositionSeries.model_rebuild()
DecompositionSeriesData.model_rebuild() DecompositionSeriesData.model_rebuild()
DecompositionSeriesBands.model_rebuild() DecompositionSeriesBands.model_rebuild()
Units.model_rebuild() Units.model_rebuild()
UnitsSpikeTimes.model_rebuild() UnitsSpikeTimes.model_rebuild()
UnitsWaveformMean.model_rebuild()
UnitsWaveformSd.model_rebuild()

View file

@ -158,10 +158,8 @@ class OptogeneticSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], float] = Field( data: OptogeneticSeriesData = Field(
..., ..., description="""Applied power for optogenetic stimulus, in watts."""
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
site: Union[OptogeneticStimulusSite, str] = Field( site: Union[OptogeneticStimulusSite, str] = Field(
..., ...,
@ -209,6 +207,37 @@ class OptogeneticSeries(TimeSeries):
) )
class OptogeneticSeriesData(ConfiguredBaseModel):
"""
Applied power for optogenetic stimulus, in watts.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ogen"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["watts"] = Field(
"watts",
description="""Unit of measurement for data, which is fixed to 'watts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "watts", "ifabsent": "string(watts)"}},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class OptogeneticStimulusSite(NWBContainer): class OptogeneticStimulusSite(NWBContainer):
""" """
A site of optogenetic stimulation. A site of optogenetic stimulation.
@ -239,4 +268,5 @@ class OptogeneticStimulusSite(NWBContainer):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
OptogeneticSeries.model_rebuild() OptogeneticSeries.model_rebuild()
OptogeneticSeriesData.model_rebuild()
OptogeneticStimulusSite.model_rebuild() OptogeneticStimulusSite.model_rebuild()

View file

@ -28,7 +28,7 @@ from ...core.v2_2_1.core_nwb_base import (
TimeSeriesSync, TimeSeriesSync,
) )
from ...core.v2_2_1.core_nwb_device import Device from ...core.v2_2_1.core_nwb_device import Device
from ...core.v2_2_1.core_nwb_image import ImageSeries, ImageSeriesExternalFile from ...core.v2_2_1.core_nwb_image import ImageSeries, ImageSeriesData, ImageSeriesExternalFile
from ...hdmf_common.v1_1_2.hdmf_common_table import DynamicTable, DynamicTableRegion from ...hdmf_common.v1_1_2.hdmf_common_table import DynamicTable, DynamicTableRegion
@ -209,12 +209,9 @@ class TwoPhotonSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -225,8 +222,9 @@ class TwoPhotonSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -275,9 +273,7 @@ class RoiResponseSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: RoiResponseSeriesData = Field(..., description="""Signals from ROIs.""")
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times, * num_rois"], float]
] = Field(..., description="""Signals from ROIs.""")
rois: Named[DynamicTableRegion] = Field( rois: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""", description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
@ -327,6 +323,39 @@ class RoiResponseSeries(TimeSeries):
) )
class RoiResponseSeriesData(ConfiguredBaseModel):
"""
Signals from ROIs.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_rois"], float | int],
]
] = Field(None)
class DfOverF(NWBDataInterface): class DfOverF(NWBDataInterface):
""" """
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). 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).
@ -336,10 +365,10 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field("DfOverF", json_schema_extra={"linkml_meta": {"ifabsent": "string(DfOverF)"}})
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class Fluorescence(NWBDataInterface): class Fluorescence(NWBDataInterface):
@ -351,10 +380,12 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field(
"Fluorescence", json_schema_extra={"linkml_meta": {"ifabsent": "string(Fluorescence)"}}
)
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class ImageSegmentation(NWBDataInterface): class ImageSegmentation(NWBDataInterface):
@ -366,10 +397,13 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[DynamicTable]] = Field( name: str = Field(
"ImageSegmentation",
json_schema_extra={"linkml_meta": {"ifabsent": "string(ImageSegmentation)"}},
)
value: Optional[Dict[str, DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
) )
name: str = Field(...)
class ImagingPlane(NWBContainer): class ImagingPlane(NWBContainer):
@ -538,16 +572,20 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[NWBDataInterface]] = Field( name: str = Field(
"MotionCorrection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(MotionCorrection)"}},
)
value: Optional[Dict[str, NWBDataInterface]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
TwoPhotonSeries.model_rebuild() TwoPhotonSeries.model_rebuild()
RoiResponseSeries.model_rebuild() RoiResponseSeries.model_rebuild()
RoiResponseSeriesData.model_rebuild()
DfOverF.model_rebuild() DfOverF.model_rebuild()
Fluorescence.model_rebuild() Fluorescence.model_rebuild()
ImageSegmentation.model_rebuild() ImageSegmentation.model_rebuild()

View file

@ -235,7 +235,7 @@ class RetinotopyImage(GrayscaleImage):
) )
field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""") field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""")
format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""") format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""")
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -374,7 +374,7 @@ class ImagingRetinotopyFocalDepthImage(RetinotopyImage):
) )
field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""") field_of_view: List[float] = Field(..., description="""Size of viewing area, in meters.""")
format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""") format: str = Field(..., description="""Format of image. Right now only 'raw' is supported.""")
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}

View file

@ -38,6 +38,7 @@ from ...core.v2_2_1.core_nwb_ecephys import (
ClusterWaveforms, ClusterWaveforms,
Clustering, Clustering,
ElectricalSeries, ElectricalSeries,
ElectricalSeriesData,
ElectrodeGroup, ElectrodeGroup,
ElectrodeGroupPosition, ElectrodeGroupPosition,
EventDetection, EventDetection,
@ -46,6 +47,7 @@ from ...core.v2_2_1.core_nwb_ecephys import (
FilteredEphys, FilteredEphys,
LFP, LFP,
SpikeEventSeries, SpikeEventSeries,
SpikeEventSeriesData,
) )
from ...core.v2_2_1.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries from ...core.v2_2_1.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries
from ...core.v2_2_1.core_nwb_file import ( from ...core.v2_2_1.core_nwb_file import (
@ -85,8 +87,10 @@ from ...core.v2_2_1.core_nwb_image import (
GrayscaleImage, GrayscaleImage,
ImageMaskSeries, ImageMaskSeries,
ImageSeries, ImageSeries,
ImageSeriesData,
ImageSeriesExternalFile, ImageSeriesExternalFile,
IndexSeries, IndexSeries,
IndexSeriesData,
OpticalSeries, OpticalSeries,
RGBAImage, RGBAImage,
RGBImage, RGBImage,
@ -95,14 +99,22 @@ from ...core.v2_2_1.core_nwb_misc import (
AbstractFeatureSeries, AbstractFeatureSeries,
AbstractFeatureSeriesData, AbstractFeatureSeriesData,
AnnotationSeries, AnnotationSeries,
AnnotationSeriesData,
DecompositionSeries, DecompositionSeries,
DecompositionSeriesBands, DecompositionSeriesBands,
DecompositionSeriesData, DecompositionSeriesData,
IntervalSeries, IntervalSeries,
IntervalSeriesData,
Units, Units,
UnitsSpikeTimes, UnitsSpikeTimes,
UnitsWaveformMean,
UnitsWaveformSd,
)
from ...core.v2_2_1.core_nwb_ogen import (
OptogeneticSeries,
OptogeneticSeriesData,
OptogeneticStimulusSite,
) )
from ...core.v2_2_1.core_nwb_ogen import OptogeneticSeries, OptogeneticStimulusSite
from ...core.v2_2_1.core_nwb_ophys import ( from ...core.v2_2_1.core_nwb_ophys import (
DfOverF, DfOverF,
Fluorescence, Fluorescence,
@ -114,6 +126,7 @@ from ...core.v2_2_1.core_nwb_ophys import (
MotionCorrection, MotionCorrection,
OpticalChannel, OpticalChannel,
RoiResponseSeries, RoiResponseSeries,
RoiResponseSeriesData,
TwoPhotonSeries, TwoPhotonSeries,
) )
from ...core.v2_2_1.core_nwb_retinotopy import ( from ...core.v2_2_1.core_nwb_retinotopy import (

View file

@ -170,9 +170,9 @@ class Image(NWBData):
description: Optional[str] = Field(None, description="""Description of the image.""") description: Optional[str] = Field(None, description="""Description of the image.""")
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* x, * y"], float], NDArray[Shape["* x, * y"], float | int],
NDArray[Shape["* x, * y, 3 r_g_b"], float], NDArray[Shape["* x, * y, 3 r_g_b"], float | int],
NDArray[Shape["* x, * y, 4 r_g_b_a"], float], NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -333,13 +333,16 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True} {"from_schema": "core.nwb.base", "tree_root": True}
) )
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( name: str = Field(...)
description: str = Field(
..., description="""Description of this collection of processed data."""
)
value: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
name: str = Field(...)
class Images(NWBDataInterface): class Images(NWBDataInterface):
@ -353,7 +356,7 @@ class Images(NWBDataInterface):
name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}}) name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}})
description: str = Field(..., description="""Description of this collection of images.""") description: str = Field(..., description="""Description of this collection of images.""")
image: List[Image] = Field(..., description="""Images stored in this collection.""") image: List[str] = Field(..., description="""Images stored in this collection.""")
# Model rebuild # Model rebuild

View file

@ -213,6 +213,16 @@ class SpatialSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"meters", "meters",
description="""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'.""", description="""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'.""",
@ -220,8 +230,8 @@ class SpatialSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -235,10 +245,13 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[IntervalSeries]] = Field( name: str = Field(
"BehavioralEpochs",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEpochs)"}},
)
value: Optional[Dict[str, IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
) )
name: str = Field(...)
class BehavioralEvents(NWBDataInterface): class BehavioralEvents(NWBDataInterface):
@ -250,10 +263,13 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralEvents",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEvents)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class BehavioralTimeSeries(NWBDataInterface): class BehavioralTimeSeries(NWBDataInterface):
@ -265,10 +281,13 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralTimeSeries",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralTimeSeries)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class PupilTracking(NWBDataInterface): class PupilTracking(NWBDataInterface):
@ -280,10 +299,12 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"PupilTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(PupilTracking)"}}
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class EyeTracking(NWBDataInterface): class EyeTracking(NWBDataInterface):
@ -295,10 +316,12 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"EyeTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(EyeTracking)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class CompassDirection(NWBDataInterface): class CompassDirection(NWBDataInterface):
@ -310,10 +333,13 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"CompassDirection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(CompassDirection)"}},
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class Position(NWBDataInterface): class Position(NWBDataInterface):
@ -325,10 +351,12 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"Position", json_schema_extra={"linkml_meta": {"ifabsent": "string(Position)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -190,11 +190,12 @@ class ElectricalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
NDArray[Shape["* num_times"], float], None,
NDArray[Shape["* num_times, * num_channels"], float], description="""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.""",
NDArray[Shape["* num_times, * num_channels, * num_samples"], float], json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
] = Field(..., description="""Recorded voltage data.""") )
data: ElectricalSeriesData = Field(..., description="""Recorded voltage data.""")
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -207,11 +208,6 @@ class ElectricalSeries(TimeSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -249,6 +245,41 @@ class ElectricalSeries(TimeSeries):
) )
class ElectricalSeriesData(ConfiguredBaseModel):
"""
Recorded voltage data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""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).""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_channels"], float | int],
NDArray[Shape["* num_times, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class SpikeEventSeries(ElectricalSeries): class SpikeEventSeries(ElectricalSeries):
""" """
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). 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).
@ -259,15 +290,17 @@ class SpikeEventSeries(ElectricalSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: SpikeEventSeriesData = Field(..., description="""Spike waveforms.""")
NDArray[Shape["* num_events, * num_samples"], float],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float],
] = Field(..., description="""Spike waveforms.""")
timestamps: NDArray[Shape["* num_times"], float] = Field( timestamps: NDArray[Shape["* num_times"], float] = Field(
..., ...,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -280,11 +313,6 @@ class SpikeEventSeries(ElectricalSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -317,6 +345,40 @@ class SpikeEventSeries(ElectricalSeries):
) )
class SpikeEventSeriesData(ConfiguredBaseModel):
"""
Spike waveforms.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""Unit of measurement for waveforms, which is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_events, * num_samples"], float | int],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class FeatureExtraction(NWBDataInterface): class FeatureExtraction(NWBDataInterface):
""" """
Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source. Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source.
@ -415,10 +477,12 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[SpikeEventSeries]] = Field( name: str = Field(
"EventWaveform", json_schema_extra={"linkml_meta": {"ifabsent": "string(EventWaveform)"}}
)
value: Optional[Dict[str, SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
) )
name: str = Field(...)
class FilteredEphys(NWBDataInterface): class FilteredEphys(NWBDataInterface):
@ -430,10 +494,12 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field(
"FilteredEphys", json_schema_extra={"linkml_meta": {"ifabsent": "string(FilteredEphys)"}}
)
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class LFP(NWBDataInterface): class LFP(NWBDataInterface):
@ -445,10 +511,10 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field("LFP", json_schema_extra={"linkml_meta": {"ifabsent": "string(LFP)"}})
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class ElectrodeGroup(NWBContainer): class ElectrodeGroup(NWBContainer):
@ -591,7 +657,9 @@ class Clustering(NWBDataInterface):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
ElectricalSeries.model_rebuild() ElectricalSeries.model_rebuild()
ElectricalSeriesData.model_rebuild()
SpikeEventSeries.model_rebuild() SpikeEventSeries.model_rebuild()
SpikeEventSeriesData.model_rebuild()
FeatureExtraction.model_rebuild() FeatureExtraction.model_rebuild()
EventDetection.model_rebuild() EventDetection.model_rebuild()
EventWaveform.model_rebuild() EventWaveform.model_rebuild()

View file

@ -247,9 +247,6 @@ class TimeIntervals(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class TimeIntervalsTimeseries(VectorData): class TimeIntervalsTimeseries(VectorData):

View file

@ -211,28 +211,28 @@ class NWBFile(NWBContainer):
..., ...,
description="""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).""", description="""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).""",
) )
acquisition: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( acquisition: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
analysis: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( analysis: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
scratch: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( scratch: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
processing: Optional[List[ProcessingModule]] = Field( processing: Optional[Dict[str, ProcessingModule]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}},
@ -250,6 +250,9 @@ class NWBFile(NWBContainer):
description="""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.""", description="""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.""",
) )
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""") units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
specifications: Optional[dict] = Field(
None, description="""Nested dictionary of schema specifications"""
)
class NWBFileStimulus(ConfiguredBaseModel): class NWBFileStimulus(ConfiguredBaseModel):
@ -265,12 +268,12 @@ class NWBFileStimulus(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"} "linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"}
}, },
) )
presentation: Optional[List[TimeSeries]] = Field( presentation: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""Stimuli presented during the experiment.""", description="""Stimuli presented during the experiment.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
) )
templates: Optional[List[TimeSeries]] = Field( templates: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
@ -348,11 +351,11 @@ class NWBFileGeneral(ConfiguredBaseModel):
None, None,
description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""", description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""",
) )
nwb_container: Optional[List[NWBContainer]] = Field( nwb_container: Optional[Dict[str, NWBContainer]] = Field(
None, None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""", description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
) )
devices: Optional[List[Device]] = Field( devices: Optional[Dict[str, Device]] = Field(
None, None,
description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""", description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}},
@ -367,12 +370,12 @@ class NWBFileGeneral(ConfiguredBaseModel):
intracellular_ephys: Optional[GeneralIntracellularEphys] = Field( intracellular_ephys: Optional[GeneralIntracellularEphys] = Field(
None, description="""Metadata related to intracellular electrophysiology.""" None, description="""Metadata related to intracellular electrophysiology."""
) )
optogenetics: Optional[List[OptogeneticStimulusSite]] = Field( optogenetics: Optional[Dict[str, OptogeneticStimulusSite]] = Field(
None, None,
description="""Metadata describing optogenetic stimuluation.""", description="""Metadata describing optogenetic stimuluation.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}},
) )
optophysiology: Optional[List[ImagingPlane]] = Field( optophysiology: Optional[Dict[str, ImagingPlane]] = Field(
None, None,
description="""Metadata related to optophysiology.""", description="""Metadata related to optophysiology.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}},
@ -450,12 +453,12 @@ class GeneralExtracellularEphys(ConfiguredBaseModel):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
electrodes: Optional[ExtracellularEphysElectrodes] = Field( electrodes: Optional[ExtracellularEphysElectrodes] = Field(
None, description="""A table of all electrodes (i.e. channels) used for recording.""" None, description="""A table of all electrodes (i.e. channels) used for recording."""
) )
value: Optional[Dict[str, ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
class ExtracellularEphysElectrodes(DynamicTable): class ExtracellularEphysElectrodes(DynamicTable):
@ -525,8 +528,14 @@ class ExtracellularEphysElectrodes(DynamicTable):
} }
}, },
) )
group: List[ElectrodeGroup] = Field( group: VectorData[NDArray[Any, ElectrodeGroup]] = Field(
..., description="""Reference to the ElectrodeGroup this electrode is a part of.""" ...,
description="""Reference to the ElectrodeGroup this electrode is a part of.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
) )
group_name: VectorData[NDArray[Any, str]] = Field( group_name: VectorData[NDArray[Any, str]] = Field(
..., ...,
@ -583,9 +592,6 @@ class ExtracellularEphysElectrodes(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class GeneralIntracellularEphys(ConfiguredBaseModel): class GeneralIntracellularEphys(ConfiguredBaseModel):
@ -608,12 +614,12 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
None, None,
description="""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.""", description="""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.""",
) )
intracellular_electrode: Optional[List[IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
sweep_table: Optional[SweepTable] = Field( sweep_table: Optional[SweepTable] = Field(
None, description="""The table which groups different PatchClampSeries together.""" None, description="""The table which groups different PatchClampSeries together."""
) )
value: Optional[Dict[str, IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
class NWBFileIntervals(ConfiguredBaseModel): class NWBFileIntervals(ConfiguredBaseModel):
@ -639,7 +645,7 @@ class NWBFileIntervals(ConfiguredBaseModel):
invalid_times: Optional[TimeIntervals] = Field( invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis.""" None, description="""Time intervals that should be removed from analysis."""
) )
time_intervals: Optional[List[TimeIntervals]] = Field( value: Optional[Dict[str, TimeIntervals]] = Field(
None, None,
description="""Optional additional table(s) for describing other experimental time intervals.""", description="""Optional additional table(s) for describing other experimental time intervals.""",
) )

View file

@ -262,11 +262,21 @@ class PatchClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
..., ...,
description="""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'.""", description="""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'.""",
) )
value: Optional[NDArray[Shape["* num_times"], float]] = Field( value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}} None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
) )
@ -281,12 +291,12 @@ class CurrentClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""") bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""")
bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""") bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""")
capacitance_compensation: Optional[float] = Field( capacitance_compensation: Optional[float] = Field(
None, description="""Capacitance compensation, in farads.""" None, description="""Capacitance compensation, in farads."""
) )
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
stimulus_description: str = Field( stimulus_description: str = Field(
..., description="""Protocol/stimulus name for this patch-clamp dataset.""" ..., description="""Protocol/stimulus name for this patch-clamp dataset."""
) )
@ -354,12 +364,24 @@ class CurrentClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IZeroClampSeries(CurrentClampSeries): class IZeroClampSeries(CurrentClampSeries):
@ -512,6 +534,16 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field( unit: Literal["amperes"] = Field(
"amperes", "amperes",
description="""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'.""", description="""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'.""",
@ -519,7 +551,9 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"} "linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
}, },
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeries(PatchClampSeries): class VoltageClampSeries(PatchClampSeries):
@ -532,13 +566,13 @@ class VoltageClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field( capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field(
None, description="""Fast capacitance, in farads.""" None, description="""Fast capacitance, in farads."""
) )
capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field( capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field(
None, description="""Slow capacitance, in farads.""" None, description="""Slow capacitance, in farads."""
) )
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field( resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field(
None, description="""Resistance compensation bandwidth, in hertz.""" None, description="""Resistance compensation bandwidth, in hertz."""
) )
@ -610,27 +644,6 @@ class VoltageClampSeries(PatchClampSeries):
) )
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Any = Field(...)
class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel): class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel):
""" """
Fast capacitance, in farads. Fast capacitance, in farads.
@ -683,6 +696,39 @@ class VoltageClampSeriesCapacitanceSlow(ConfiguredBaseModel):
value: float = Field(...) value: float = Field(...)
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel): class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel):
""" """
Resistance compensation bandwidth, in hertz. Resistance compensation bandwidth, in hertz.
@ -887,12 +933,24 @@ class VoltageClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntracellularElectrode(NWBContainer): class IntracellularElectrode(NWBContainer):
@ -942,18 +1000,15 @@ class SweepTable(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
sweep_number: VectorData[NDArray[Any, int]] = Field( series: VectorData[NDArray[Any, PatchClampSeries]] = Field(
..., ...,
description="""Sweep number of the PatchClampSeries in that row.""", description="""The PatchClampSeries with the sweep number in that row.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1} "array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
} }
}, },
) )
series: List[PatchClampSeries] = Field(
..., description="""The PatchClampSeries with the sweep number in that row."""
)
series_index: Named[VectorIndex] = Field( series_index: Named[VectorIndex] = Field(
..., ...,
description="""Index for series.""", description="""Index for series.""",
@ -966,6 +1021,15 @@ class SweepTable(DynamicTable):
} }
}, },
) )
sweep_number: VectorData[NDArray[Any, int]] = Field(
...,
description="""Sweep number of the PatchClampSeries in that row.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -976,9 +1040,6 @@ class SweepTable(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild
@ -991,9 +1052,9 @@ IZeroClampSeries.model_rebuild()
CurrentClampStimulusSeries.model_rebuild() CurrentClampStimulusSeries.model_rebuild()
CurrentClampStimulusSeriesData.model_rebuild() CurrentClampStimulusSeriesData.model_rebuild()
VoltageClampSeries.model_rebuild() VoltageClampSeries.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesCapacitanceFast.model_rebuild() VoltageClampSeriesCapacitanceFast.model_rebuild()
VoltageClampSeriesCapacitanceSlow.model_rebuild() VoltageClampSeriesCapacitanceSlow.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesResistanceCompBandwidth.model_rebuild() VoltageClampSeriesResistanceCompBandwidth.model_rebuild()
VoltageClampSeriesResistanceCompCorrection.model_rebuild() VoltageClampSeriesResistanceCompCorrection.model_rebuild()
VoltageClampSeriesResistanceCompPrediction.model_rebuild() VoltageClampSeriesResistanceCompPrediction.model_rebuild()

View file

@ -152,7 +152,7 @@ class GrayscaleImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -174,7 +174,7 @@ class RGBImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -204,7 +204,7 @@ class RGBAImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -234,12 +234,9 @@ class ImageSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -250,8 +247,9 @@ class ImageSeries(TimeSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -290,6 +288,39 @@ class ImageSeries(TimeSeries):
) )
class ImageSeriesData(ConfiguredBaseModel):
"""
Binary data representing images across frames.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, * z"], float | int],
]
] = Field(None)
class ImageSeriesExternalFile(ConfiguredBaseModel): class ImageSeriesExternalFile(ConfiguredBaseModel):
""" """
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. 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.
@ -331,12 +362,9 @@ class ImageMaskSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -347,8 +375,9 @@ class ImageMaskSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -397,6 +426,9 @@ class OpticalSeries(ImageSeries):
) )
name: str = Field(...) name: str = Field(...)
data: OpticalSeriesData = Field(
..., description="""Images presented to subject, either grayscale or RGB"""
)
distance: Optional[float] = Field( distance: Optional[float] = Field(
None, description="""Distance from camera/monitor to target/eye.""" None, description="""Distance from camera/monitor to target/eye."""
) )
@ -405,10 +437,6 @@ class OpticalSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float] NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
] ]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""") ] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
data: Union[
NDArray[Shape["* frame, * x, * y"], float],
NDArray[Shape["* frame, * x, * y, 3 r_g_b"], float],
] = Field(..., description="""Images presented to subject, either grayscale or RGB""")
orientation: Optional[str] = Field( orientation: Optional[str] = Field(
None, None,
description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""", description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""",
@ -423,8 +451,9 @@ class OpticalSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -463,6 +492,39 @@ class OpticalSeries(ImageSeries):
) )
class OpticalSeriesData(ConfiguredBaseModel):
"""
Images presented to subject, either grayscale or RGB
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, 3 r_g_b"], float | int],
]
] = Field(None)
class IndexSeries(TimeSeries): class IndexSeries(TimeSeries):
""" """
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. 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.
@ -473,10 +535,8 @@ class IndexSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IndexSeriesData = Field(
..., ..., description="""Index of the frame in the referenced ImageSeries."""
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
indexed_timeseries: Union[ImageSeries, str] = Field( indexed_timeseries: Union[ImageSeries, str] = Field(
..., ...,
@ -524,13 +584,46 @@ class IndexSeries(TimeSeries):
) )
class IndexSeriesData(ConfiguredBaseModel):
"""
Index of the frame in the referenced ImageSeries.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
GrayscaleImage.model_rebuild() GrayscaleImage.model_rebuild()
RGBImage.model_rebuild() RGBImage.model_rebuild()
RGBAImage.model_rebuild() RGBAImage.model_rebuild()
ImageSeries.model_rebuild() ImageSeries.model_rebuild()
ImageSeriesData.model_rebuild()
ImageSeriesExternalFile.model_rebuild() ImageSeriesExternalFile.model_rebuild()
ImageMaskSeries.model_rebuild() ImageMaskSeries.model_rebuild()
OpticalSeries.model_rebuild() OpticalSeries.model_rebuild()
OpticalSeriesData.model_rebuild()
IndexSeries.model_rebuild() IndexSeries.model_rebuild()
IndexSeriesData.model_rebuild()

View file

@ -251,6 +251,16 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"see ", "see ",
description="""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'\".""", description="""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'\".""",
@ -258,8 +268,8 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -274,10 +284,8 @@ class AnnotationSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], str] = Field( data: AnnotationSeriesData = Field(
..., ..., description="""Annotations made during an experiment."""
description="""Annotations made during an experiment.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -316,6 +324,39 @@ class AnnotationSeries(TimeSeries):
) )
class AnnotationSeriesData(ConfiguredBaseModel):
"""
Annotations made during an experiment.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntervalSeries(TimeSeries): class IntervalSeries(TimeSeries):
""" """
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. 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.
@ -326,10 +367,8 @@ class IntervalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IntervalSeriesData = Field(
..., ..., description="""Use values >0 if interval started, <0 if interval ended."""
description="""Use values >0 if interval started, <0 if interval ended.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -368,6 +407,39 @@ class IntervalSeries(TimeSeries):
) )
class IntervalSeriesData(ConfiguredBaseModel):
"""
Use values >0 if interval started, <0 if interval ended.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class DecompositionSeries(TimeSeries): class DecompositionSeries(TimeSeries):
""" """
Spectral analysis of a time series, e.g. of an LFP or a speech signal. Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -443,24 +515,36 @@ class DecompositionSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
"no unit", "no unit",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}}, json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}},
) )
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field( value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float | int]] = (
None, Field(
json_schema_extra={ None,
"linkml_meta": { json_schema_extra={
"array": { "linkml_meta": {
"dimensions": [ "array": {
{"alias": "num_times"}, "dimensions": [
{"alias": "num_channels"}, {"alias": "num_times"},
{"alias": "num_bands"}, {"alias": "num_channels"},
] {"alias": "num_bands"},
]
}
} }
} },
}, )
) )
@ -518,9 +602,6 @@ class DecompositionSeriesBands(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class Units(DynamicTable): class Units(DynamicTable):
@ -533,9 +614,18 @@ class Units(DynamicTable):
) )
name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}}) name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}})
spike_times_index: Optional[Named[VectorIndex]] = Field( electrode_group: Optional[VectorData[NDArray[Any, ElectrodeGroup]]] = Field(
None, None,
description="""Index into the spike_times dataset.""", description="""Electrode group that each spike unit came from.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
electrodes: Optional[Named[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -545,12 +635,9 @@ class Units(DynamicTable):
} }
}, },
) )
spike_times: Optional[UnitsSpikeTimes] = Field( electrodes_index: Optional[Named[VectorIndex]] = Field(
None, description="""Spike times for each unit."""
)
obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into the obs_intervals dataset.""", description="""Index into electrodes.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -576,9 +663,9 @@ class Units(DynamicTable):
}, },
) )
) )
electrodes_index: Optional[Named[VectorIndex]] = Field( obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into electrodes.""", description="""Index into the obs_intervals dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -588,9 +675,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrodes: Optional[Named[DynamicTableRegion]] = Field( spike_times: Optional[UnitsSpikeTimes] = Field(
None, description="""Spike times for each unit."""
)
spike_times_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""", description="""Index into the spike_times dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -600,25 +690,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field( waveform_mean: Optional[UnitsWaveformMean] = Field(
None, description="""Electrode group that each spike unit came from.""" None, description="""Spike waveform mean for each spike unit."""
)
waveform_sd: Optional[UnitsWaveformSd] = Field(
None, description="""Spike waveform standard deviation for each spike unit."""
) )
waveform_mean: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform mean for each spike unit.""")
waveform_sd: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform standard deviation for each spike unit.""")
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -629,9 +706,6 @@ class Units(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class UnitsSpikeTimes(VectorData): class UnitsSpikeTimes(VectorData):
@ -662,14 +736,78 @@ class UnitsSpikeTimes(VectorData):
] = Field(None) ] = Field(None)
class UnitsWaveformMean(VectorData):
"""
Spike waveform mean for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_mean"] = Field(
"waveform_mean",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_mean", "ifabsent": "string(waveform_mean)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
class UnitsWaveformSd(VectorData):
"""
Spike waveform standard deviation for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_sd"] = Field(
"waveform_sd",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_sd", "ifabsent": "string(waveform_sd)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
AbstractFeatureSeries.model_rebuild() AbstractFeatureSeries.model_rebuild()
AbstractFeatureSeriesData.model_rebuild() AbstractFeatureSeriesData.model_rebuild()
AnnotationSeries.model_rebuild() AnnotationSeries.model_rebuild()
AnnotationSeriesData.model_rebuild()
IntervalSeries.model_rebuild() IntervalSeries.model_rebuild()
IntervalSeriesData.model_rebuild()
DecompositionSeries.model_rebuild() DecompositionSeries.model_rebuild()
DecompositionSeriesData.model_rebuild() DecompositionSeriesData.model_rebuild()
DecompositionSeriesBands.model_rebuild() DecompositionSeriesBands.model_rebuild()
Units.model_rebuild() Units.model_rebuild()
UnitsSpikeTimes.model_rebuild() UnitsSpikeTimes.model_rebuild()
UnitsWaveformMean.model_rebuild()
UnitsWaveformSd.model_rebuild()

View file

@ -158,10 +158,8 @@ class OptogeneticSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], float] = Field( data: OptogeneticSeriesData = Field(
..., ..., description="""Applied power for optogenetic stimulus, in watts."""
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
site: Union[OptogeneticStimulusSite, str] = Field( site: Union[OptogeneticStimulusSite, str] = Field(
..., ...,
@ -209,6 +207,37 @@ class OptogeneticSeries(TimeSeries):
) )
class OptogeneticSeriesData(ConfiguredBaseModel):
"""
Applied power for optogenetic stimulus, in watts.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ogen"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["watts"] = Field(
"watts",
description="""Unit of measurement for data, which is fixed to 'watts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "watts", "ifabsent": "string(watts)"}},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class OptogeneticStimulusSite(NWBContainer): class OptogeneticStimulusSite(NWBContainer):
""" """
A site of optogenetic stimulation. A site of optogenetic stimulation.
@ -239,4 +268,5 @@ class OptogeneticStimulusSite(NWBContainer):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
OptogeneticSeries.model_rebuild() OptogeneticSeries.model_rebuild()
OptogeneticSeriesData.model_rebuild()
OptogeneticStimulusSite.model_rebuild() OptogeneticStimulusSite.model_rebuild()

View file

@ -28,7 +28,7 @@ from ...core.v2_2_2.core_nwb_base import (
TimeSeriesSync, TimeSeriesSync,
) )
from ...core.v2_2_2.core_nwb_device import Device from ...core.v2_2_2.core_nwb_device import Device
from ...core.v2_2_2.core_nwb_image import ImageSeries, ImageSeriesExternalFile from ...core.v2_2_2.core_nwb_image import ImageSeries, ImageSeriesData, ImageSeriesExternalFile
from ...hdmf_common.v1_1_3.hdmf_common_table import DynamicTable, DynamicTableRegion from ...hdmf_common.v1_1_3.hdmf_common_table import DynamicTable, DynamicTableRegion
@ -209,12 +209,9 @@ class TwoPhotonSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -225,8 +222,9 @@ class TwoPhotonSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -275,9 +273,7 @@ class RoiResponseSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: RoiResponseSeriesData = Field(..., description="""Signals from ROIs.""")
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times, * num_rois"], float]
] = Field(..., description="""Signals from ROIs.""")
rois: Named[DynamicTableRegion] = Field( rois: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""", description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
@ -327,6 +323,39 @@ class RoiResponseSeries(TimeSeries):
) )
class RoiResponseSeriesData(ConfiguredBaseModel):
"""
Signals from ROIs.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_rois"], float | int],
]
] = Field(None)
class DfOverF(NWBDataInterface): class DfOverF(NWBDataInterface):
""" """
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). 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).
@ -336,10 +365,10 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field("DfOverF", json_schema_extra={"linkml_meta": {"ifabsent": "string(DfOverF)"}})
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class Fluorescence(NWBDataInterface): class Fluorescence(NWBDataInterface):
@ -351,10 +380,12 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field(
"Fluorescence", json_schema_extra={"linkml_meta": {"ifabsent": "string(Fluorescence)"}}
)
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class ImageSegmentation(NWBDataInterface): class ImageSegmentation(NWBDataInterface):
@ -366,10 +397,13 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[DynamicTable]] = Field( name: str = Field(
"ImageSegmentation",
json_schema_extra={"linkml_meta": {"ifabsent": "string(ImageSegmentation)"}},
)
value: Optional[Dict[str, DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
) )
name: str = Field(...)
class ImagingPlane(NWBContainer): class ImagingPlane(NWBContainer):
@ -538,16 +572,20 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[NWBDataInterface]] = Field( name: str = Field(
"MotionCorrection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(MotionCorrection)"}},
)
value: Optional[Dict[str, NWBDataInterface]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
TwoPhotonSeries.model_rebuild() TwoPhotonSeries.model_rebuild()
RoiResponseSeries.model_rebuild() RoiResponseSeries.model_rebuild()
RoiResponseSeriesData.model_rebuild()
DfOverF.model_rebuild() DfOverF.model_rebuild()
Fluorescence.model_rebuild() Fluorescence.model_rebuild()
ImageSegmentation.model_rebuild() ImageSegmentation.model_rebuild()

View file

@ -38,6 +38,7 @@ from ...core.v2_2_2.core_nwb_ecephys import (
ClusterWaveforms, ClusterWaveforms,
Clustering, Clustering,
ElectricalSeries, ElectricalSeries,
ElectricalSeriesData,
ElectrodeGroup, ElectrodeGroup,
ElectrodeGroupPosition, ElectrodeGroupPosition,
EventDetection, EventDetection,
@ -46,6 +47,7 @@ from ...core.v2_2_2.core_nwb_ecephys import (
FilteredEphys, FilteredEphys,
LFP, LFP,
SpikeEventSeries, SpikeEventSeries,
SpikeEventSeriesData,
) )
from ...core.v2_2_2.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries from ...core.v2_2_2.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries
from ...core.v2_2_2.core_nwb_file import ( from ...core.v2_2_2.core_nwb_file import (
@ -85,9 +87,12 @@ from ...core.v2_2_2.core_nwb_image import (
GrayscaleImage, GrayscaleImage,
ImageMaskSeries, ImageMaskSeries,
ImageSeries, ImageSeries,
ImageSeriesData,
ImageSeriesExternalFile, ImageSeriesExternalFile,
IndexSeries, IndexSeries,
IndexSeriesData,
OpticalSeries, OpticalSeries,
OpticalSeriesData,
RGBAImage, RGBAImage,
RGBImage, RGBImage,
) )
@ -95,14 +100,22 @@ from ...core.v2_2_2.core_nwb_misc import (
AbstractFeatureSeries, AbstractFeatureSeries,
AbstractFeatureSeriesData, AbstractFeatureSeriesData,
AnnotationSeries, AnnotationSeries,
AnnotationSeriesData,
DecompositionSeries, DecompositionSeries,
DecompositionSeriesBands, DecompositionSeriesBands,
DecompositionSeriesData, DecompositionSeriesData,
IntervalSeries, IntervalSeries,
IntervalSeriesData,
Units, Units,
UnitsSpikeTimes, UnitsSpikeTimes,
UnitsWaveformMean,
UnitsWaveformSd,
)
from ...core.v2_2_2.core_nwb_ogen import (
OptogeneticSeries,
OptogeneticSeriesData,
OptogeneticStimulusSite,
) )
from ...core.v2_2_2.core_nwb_ogen import OptogeneticSeries, OptogeneticStimulusSite
from ...core.v2_2_2.core_nwb_ophys import ( from ...core.v2_2_2.core_nwb_ophys import (
DfOverF, DfOverF,
Fluorescence, Fluorescence,
@ -114,6 +127,7 @@ from ...core.v2_2_2.core_nwb_ophys import (
MotionCorrection, MotionCorrection,
OpticalChannel, OpticalChannel,
RoiResponseSeries, RoiResponseSeries,
RoiResponseSeriesData,
TwoPhotonSeries, TwoPhotonSeries,
) )
from ...core.v2_2_2.core_nwb_retinotopy import ( from ...core.v2_2_2.core_nwb_retinotopy import (

View file

@ -170,9 +170,9 @@ class Image(NWBData):
description: Optional[str] = Field(None, description="""Description of the image.""") description: Optional[str] = Field(None, description="""Description of the image.""")
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* x, * y"], float], NDArray[Shape["* x, * y"], float | int],
NDArray[Shape["* x, * y, 3 r_g_b"], float], NDArray[Shape["* x, * y, 3 r_g_b"], float | int],
NDArray[Shape["* x, * y, 4 r_g_b_a"], float], NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -333,13 +333,16 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True} {"from_schema": "core.nwb.base", "tree_root": True}
) )
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( name: str = Field(...)
description: str = Field(
..., description="""Description of this collection of processed data."""
)
value: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
name: str = Field(...)
class Images(NWBDataInterface): class Images(NWBDataInterface):
@ -353,7 +356,7 @@ class Images(NWBDataInterface):
name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}}) name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}})
description: str = Field(..., description="""Description of this collection of images.""") description: str = Field(..., description="""Description of this collection of images.""")
image: List[Image] = Field(..., description="""Images stored in this collection.""") image: List[str] = Field(..., description="""Images stored in this collection.""")
# Model rebuild # Model rebuild

View file

@ -213,6 +213,16 @@ class SpatialSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"meters", "meters",
description="""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'.""", description="""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'.""",
@ -220,8 +230,8 @@ class SpatialSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -235,10 +245,13 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[IntervalSeries]] = Field( name: str = Field(
"BehavioralEpochs",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEpochs)"}},
)
value: Optional[Dict[str, IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
) )
name: str = Field(...)
class BehavioralEvents(NWBDataInterface): class BehavioralEvents(NWBDataInterface):
@ -250,10 +263,13 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralEvents",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEvents)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class BehavioralTimeSeries(NWBDataInterface): class BehavioralTimeSeries(NWBDataInterface):
@ -265,10 +281,13 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralTimeSeries",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralTimeSeries)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class PupilTracking(NWBDataInterface): class PupilTracking(NWBDataInterface):
@ -280,10 +299,12 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"PupilTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(PupilTracking)"}}
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class EyeTracking(NWBDataInterface): class EyeTracking(NWBDataInterface):
@ -295,10 +316,12 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"EyeTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(EyeTracking)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class CompassDirection(NWBDataInterface): class CompassDirection(NWBDataInterface):
@ -310,10 +333,13 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"CompassDirection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(CompassDirection)"}},
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class Position(NWBDataInterface): class Position(NWBDataInterface):
@ -325,10 +351,12 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"Position", json_schema_extra={"linkml_meta": {"ifabsent": "string(Position)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -190,11 +190,12 @@ class ElectricalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
NDArray[Shape["* num_times"], float], None,
NDArray[Shape["* num_times, * num_channels"], float], description="""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.""",
NDArray[Shape["* num_times, * num_channels, * num_samples"], float], json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
] = Field(..., description="""Recorded voltage data.""") )
data: ElectricalSeriesData = Field(..., description="""Recorded voltage data.""")
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -207,11 +208,6 @@ class ElectricalSeries(TimeSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -249,6 +245,41 @@ class ElectricalSeries(TimeSeries):
) )
class ElectricalSeriesData(ConfiguredBaseModel):
"""
Recorded voltage data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""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).""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_channels"], float | int],
NDArray[Shape["* num_times, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class SpikeEventSeries(ElectricalSeries): class SpikeEventSeries(ElectricalSeries):
""" """
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). 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).
@ -259,15 +290,17 @@ class SpikeEventSeries(ElectricalSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: SpikeEventSeriesData = Field(..., description="""Spike waveforms.""")
NDArray[Shape["* num_events, * num_samples"], float],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float],
] = Field(..., description="""Spike waveforms.""")
timestamps: NDArray[Shape["* num_times"], float] = Field( timestamps: NDArray[Shape["* num_times"], float] = Field(
..., ...,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -280,11 +313,6 @@ class SpikeEventSeries(ElectricalSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -317,6 +345,40 @@ class SpikeEventSeries(ElectricalSeries):
) )
class SpikeEventSeriesData(ConfiguredBaseModel):
"""
Spike waveforms.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""Unit of measurement for waveforms, which is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_events, * num_samples"], float | int],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class FeatureExtraction(NWBDataInterface): class FeatureExtraction(NWBDataInterface):
""" """
Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source. Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source.
@ -415,10 +477,12 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[SpikeEventSeries]] = Field( name: str = Field(
"EventWaveform", json_schema_extra={"linkml_meta": {"ifabsent": "string(EventWaveform)"}}
)
value: Optional[Dict[str, SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
) )
name: str = Field(...)
class FilteredEphys(NWBDataInterface): class FilteredEphys(NWBDataInterface):
@ -430,10 +494,12 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field(
"FilteredEphys", json_schema_extra={"linkml_meta": {"ifabsent": "string(FilteredEphys)"}}
)
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class LFP(NWBDataInterface): class LFP(NWBDataInterface):
@ -445,10 +511,10 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field("LFP", json_schema_extra={"linkml_meta": {"ifabsent": "string(LFP)"}})
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class ElectrodeGroup(NWBContainer): class ElectrodeGroup(NWBContainer):
@ -591,7 +657,9 @@ class Clustering(NWBDataInterface):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
ElectricalSeries.model_rebuild() ElectricalSeries.model_rebuild()
ElectricalSeriesData.model_rebuild()
SpikeEventSeries.model_rebuild() SpikeEventSeries.model_rebuild()
SpikeEventSeriesData.model_rebuild()
FeatureExtraction.model_rebuild() FeatureExtraction.model_rebuild()
EventDetection.model_rebuild() EventDetection.model_rebuild()
EventWaveform.model_rebuild() EventWaveform.model_rebuild()

View file

@ -247,9 +247,6 @@ class TimeIntervals(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class TimeIntervalsTimeseries(VectorData): class TimeIntervalsTimeseries(VectorData):

View file

@ -225,28 +225,28 @@ class NWBFile(NWBContainer):
..., ...,
description="""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).""", description="""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).""",
) )
acquisition: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( acquisition: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
analysis: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( analysis: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
scratch: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( scratch: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
processing: Optional[List[ProcessingModule]] = Field( processing: Optional[Dict[str, ProcessingModule]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}},
@ -264,6 +264,9 @@ class NWBFile(NWBContainer):
description="""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.""", description="""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.""",
) )
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""") units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
specifications: Optional[dict] = Field(
None, description="""Nested dictionary of schema specifications"""
)
class NWBFileStimulus(ConfiguredBaseModel): class NWBFileStimulus(ConfiguredBaseModel):
@ -279,12 +282,12 @@ class NWBFileStimulus(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"} "linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"}
}, },
) )
presentation: Optional[List[TimeSeries]] = Field( presentation: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""Stimuli presented during the experiment.""", description="""Stimuli presented during the experiment.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
) )
templates: Optional[List[TimeSeries]] = Field( templates: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
@ -362,11 +365,7 @@ class NWBFileGeneral(ConfiguredBaseModel):
None, None,
description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""", description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""",
) )
lab_meta_data: Optional[List[LabMetaData]] = Field( devices: Optional[Dict[str, Device]] = Field(
None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
)
devices: Optional[List[Device]] = Field(
None, None,
description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""", description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}},
@ -381,16 +380,20 @@ class NWBFileGeneral(ConfiguredBaseModel):
intracellular_ephys: Optional[GeneralIntracellularEphys] = Field( intracellular_ephys: Optional[GeneralIntracellularEphys] = Field(
None, description="""Metadata related to intracellular electrophysiology.""" None, description="""Metadata related to intracellular electrophysiology."""
) )
optogenetics: Optional[List[OptogeneticStimulusSite]] = Field( optogenetics: Optional[Dict[str, OptogeneticStimulusSite]] = Field(
None, None,
description="""Metadata describing optogenetic stimuluation.""", description="""Metadata describing optogenetic stimuluation.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}},
) )
optophysiology: Optional[List[ImagingPlane]] = Field( optophysiology: Optional[Dict[str, ImagingPlane]] = Field(
None, None,
description="""Metadata related to optophysiology.""", description="""Metadata related to optophysiology.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}},
) )
value: Optional[Dict[str, LabMetaData]] = Field(
None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
)
class GeneralSourceScript(ConfiguredBaseModel): class GeneralSourceScript(ConfiguredBaseModel):
@ -426,12 +429,12 @@ class GeneralExtracellularEphys(ConfiguredBaseModel):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
electrodes: Optional[ExtracellularEphysElectrodes] = Field( electrodes: Optional[ExtracellularEphysElectrodes] = Field(
None, description="""A table of all electrodes (i.e. channels) used for recording.""" None, description="""A table of all electrodes (i.e. channels) used for recording."""
) )
value: Optional[Dict[str, ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
class ExtracellularEphysElectrodes(DynamicTable): class ExtracellularEphysElectrodes(DynamicTable):
@ -501,8 +504,14 @@ class ExtracellularEphysElectrodes(DynamicTable):
} }
}, },
) )
group: List[ElectrodeGroup] = Field( group: VectorData[NDArray[Any, ElectrodeGroup]] = Field(
..., description="""Reference to the ElectrodeGroup this electrode is a part of.""" ...,
description="""Reference to the ElectrodeGroup this electrode is a part of.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
) )
group_name: VectorData[NDArray[Any, str]] = Field( group_name: VectorData[NDArray[Any, str]] = Field(
..., ...,
@ -559,9 +568,6 @@ class ExtracellularEphysElectrodes(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class GeneralIntracellularEphys(ConfiguredBaseModel): class GeneralIntracellularEphys(ConfiguredBaseModel):
@ -584,12 +590,12 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
None, None,
description="""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.""", description="""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.""",
) )
intracellular_electrode: Optional[List[IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
sweep_table: Optional[SweepTable] = Field( sweep_table: Optional[SweepTable] = Field(
None, description="""The table which groups different PatchClampSeries together.""" None, description="""The table which groups different PatchClampSeries together."""
) )
value: Optional[Dict[str, IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
class NWBFileIntervals(ConfiguredBaseModel): class NWBFileIntervals(ConfiguredBaseModel):
@ -615,7 +621,7 @@ class NWBFileIntervals(ConfiguredBaseModel):
invalid_times: Optional[TimeIntervals] = Field( invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis.""" None, description="""Time intervals that should be removed from analysis."""
) )
time_intervals: Optional[List[TimeIntervals]] = Field( value: Optional[Dict[str, TimeIntervals]] = Field(
None, None,
description="""Optional additional table(s) for describing other experimental time intervals.""", description="""Optional additional table(s) for describing other experimental time intervals.""",
) )

View file

@ -262,11 +262,21 @@ class PatchClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
..., ...,
description="""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'.""", description="""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'.""",
) )
value: Optional[NDArray[Shape["* num_times"], float]] = Field( value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}} None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
) )
@ -281,12 +291,12 @@ class CurrentClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""") bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""")
bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""") bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""")
capacitance_compensation: Optional[float] = Field( capacitance_compensation: Optional[float] = Field(
None, description="""Capacitance compensation, in farads.""" None, description="""Capacitance compensation, in farads."""
) )
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
stimulus_description: str = Field( stimulus_description: str = Field(
..., description="""Protocol/stimulus name for this patch-clamp dataset.""" ..., description="""Protocol/stimulus name for this patch-clamp dataset."""
) )
@ -354,12 +364,24 @@ class CurrentClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IZeroClampSeries(CurrentClampSeries): class IZeroClampSeries(CurrentClampSeries):
@ -512,6 +534,16 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field( unit: Literal["amperes"] = Field(
"amperes", "amperes",
description="""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'.""", description="""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'.""",
@ -519,7 +551,9 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"} "linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
}, },
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeries(PatchClampSeries): class VoltageClampSeries(PatchClampSeries):
@ -532,13 +566,13 @@ class VoltageClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field( capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field(
None, description="""Fast capacitance, in farads.""" None, description="""Fast capacitance, in farads."""
) )
capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field( capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field(
None, description="""Slow capacitance, in farads.""" None, description="""Slow capacitance, in farads."""
) )
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field( resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field(
None, description="""Resistance compensation bandwidth, in hertz.""" None, description="""Resistance compensation bandwidth, in hertz."""
) )
@ -610,27 +644,6 @@ class VoltageClampSeries(PatchClampSeries):
) )
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Any = Field(...)
class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel): class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel):
""" """
Fast capacitance, in farads. Fast capacitance, in farads.
@ -683,6 +696,39 @@ class VoltageClampSeriesCapacitanceSlow(ConfiguredBaseModel):
value: float = Field(...) value: float = Field(...)
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel): class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel):
""" """
Resistance compensation bandwidth, in hertz. Resistance compensation bandwidth, in hertz.
@ -887,12 +933,24 @@ class VoltageClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntracellularElectrode(NWBContainer): class IntracellularElectrode(NWBContainer):
@ -942,18 +1000,15 @@ class SweepTable(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
sweep_number: VectorData[NDArray[Any, int]] = Field( series: VectorData[NDArray[Any, PatchClampSeries]] = Field(
..., ...,
description="""Sweep number of the PatchClampSeries in that row.""", description="""The PatchClampSeries with the sweep number in that row.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1} "array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
} }
}, },
) )
series: List[PatchClampSeries] = Field(
..., description="""The PatchClampSeries with the sweep number in that row."""
)
series_index: Named[VectorIndex] = Field( series_index: Named[VectorIndex] = Field(
..., ...,
description="""Index for series.""", description="""Index for series.""",
@ -966,6 +1021,15 @@ class SweepTable(DynamicTable):
} }
}, },
) )
sweep_number: VectorData[NDArray[Any, int]] = Field(
...,
description="""Sweep number of the PatchClampSeries in that row.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -976,9 +1040,6 @@ class SweepTable(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild
@ -991,9 +1052,9 @@ IZeroClampSeries.model_rebuild()
CurrentClampStimulusSeries.model_rebuild() CurrentClampStimulusSeries.model_rebuild()
CurrentClampStimulusSeriesData.model_rebuild() CurrentClampStimulusSeriesData.model_rebuild()
VoltageClampSeries.model_rebuild() VoltageClampSeries.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesCapacitanceFast.model_rebuild() VoltageClampSeriesCapacitanceFast.model_rebuild()
VoltageClampSeriesCapacitanceSlow.model_rebuild() VoltageClampSeriesCapacitanceSlow.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesResistanceCompBandwidth.model_rebuild() VoltageClampSeriesResistanceCompBandwidth.model_rebuild()
VoltageClampSeriesResistanceCompCorrection.model_rebuild() VoltageClampSeriesResistanceCompCorrection.model_rebuild()
VoltageClampSeriesResistanceCompPrediction.model_rebuild() VoltageClampSeriesResistanceCompPrediction.model_rebuild()

View file

@ -152,7 +152,7 @@ class GrayscaleImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -174,7 +174,7 @@ class RGBImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -204,7 +204,7 @@ class RGBAImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -234,12 +234,9 @@ class ImageSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -250,8 +247,9 @@ class ImageSeries(TimeSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -290,6 +288,39 @@ class ImageSeries(TimeSeries):
) )
class ImageSeriesData(ConfiguredBaseModel):
"""
Binary data representing images across frames.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, * z"], float | int],
]
] = Field(None)
class ImageSeriesExternalFile(ConfiguredBaseModel): class ImageSeriesExternalFile(ConfiguredBaseModel):
""" """
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. 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.
@ -331,12 +362,9 @@ class ImageMaskSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -347,8 +375,9 @@ class ImageMaskSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -397,6 +426,9 @@ class OpticalSeries(ImageSeries):
) )
name: str = Field(...) name: str = Field(...)
data: OpticalSeriesData = Field(
..., description="""Images presented to subject, either grayscale or RGB"""
)
distance: Optional[float] = Field( distance: Optional[float] = Field(
None, description="""Distance from camera/monitor to target/eye.""" None, description="""Distance from camera/monitor to target/eye."""
) )
@ -405,10 +437,6 @@ class OpticalSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float] NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
] ]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""") ] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
data: Union[
NDArray[Shape["* frame, * x, * y"], float],
NDArray[Shape["* frame, * x, * y, 3 r_g_b"], float],
] = Field(..., description="""Images presented to subject, either grayscale or RGB""")
orientation: Optional[str] = Field( orientation: Optional[str] = Field(
None, None,
description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""", description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""",
@ -423,8 +451,9 @@ class OpticalSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -463,6 +492,39 @@ class OpticalSeries(ImageSeries):
) )
class OpticalSeriesData(ConfiguredBaseModel):
"""
Images presented to subject, either grayscale or RGB
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, 3 r_g_b"], float | int],
]
] = Field(None)
class IndexSeries(TimeSeries): class IndexSeries(TimeSeries):
""" """
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. 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.
@ -473,10 +535,8 @@ class IndexSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IndexSeriesData = Field(
..., ..., description="""Index of the frame in the referenced ImageSeries."""
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
indexed_timeseries: Union[ImageSeries, str] = Field( indexed_timeseries: Union[ImageSeries, str] = Field(
..., ...,
@ -524,13 +584,46 @@ class IndexSeries(TimeSeries):
) )
class IndexSeriesData(ConfiguredBaseModel):
"""
Index of the frame in the referenced ImageSeries.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
GrayscaleImage.model_rebuild() GrayscaleImage.model_rebuild()
RGBImage.model_rebuild() RGBImage.model_rebuild()
RGBAImage.model_rebuild() RGBAImage.model_rebuild()
ImageSeries.model_rebuild() ImageSeries.model_rebuild()
ImageSeriesData.model_rebuild()
ImageSeriesExternalFile.model_rebuild() ImageSeriesExternalFile.model_rebuild()
ImageMaskSeries.model_rebuild() ImageMaskSeries.model_rebuild()
OpticalSeries.model_rebuild() OpticalSeries.model_rebuild()
OpticalSeriesData.model_rebuild()
IndexSeries.model_rebuild() IndexSeries.model_rebuild()
IndexSeriesData.model_rebuild()

View file

@ -251,6 +251,16 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"see ", "see ",
description="""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'\".""", description="""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'\".""",
@ -258,8 +268,8 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -274,10 +284,8 @@ class AnnotationSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], str] = Field( data: AnnotationSeriesData = Field(
..., ..., description="""Annotations made during an experiment."""
description="""Annotations made during an experiment.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -316,6 +324,39 @@ class AnnotationSeries(TimeSeries):
) )
class AnnotationSeriesData(ConfiguredBaseModel):
"""
Annotations made during an experiment.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntervalSeries(TimeSeries): class IntervalSeries(TimeSeries):
""" """
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. 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.
@ -326,10 +367,8 @@ class IntervalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IntervalSeriesData = Field(
..., ..., description="""Use values >0 if interval started, <0 if interval ended."""
description="""Use values >0 if interval started, <0 if interval ended.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -368,6 +407,39 @@ class IntervalSeries(TimeSeries):
) )
class IntervalSeriesData(ConfiguredBaseModel):
"""
Use values >0 if interval started, <0 if interval ended.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class DecompositionSeries(TimeSeries): class DecompositionSeries(TimeSeries):
""" """
Spectral analysis of a time series, e.g. of an LFP or a speech signal. Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -443,24 +515,36 @@ class DecompositionSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
"no unit", "no unit",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}}, json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}},
) )
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field( value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float | int]] = (
None, Field(
json_schema_extra={ None,
"linkml_meta": { json_schema_extra={
"array": { "linkml_meta": {
"dimensions": [ "array": {
{"alias": "num_times"}, "dimensions": [
{"alias": "num_channels"}, {"alias": "num_times"},
{"alias": "num_bands"}, {"alias": "num_channels"},
] {"alias": "num_bands"},
]
}
} }
} },
}, )
) )
@ -518,9 +602,6 @@ class DecompositionSeriesBands(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class Units(DynamicTable): class Units(DynamicTable):
@ -533,9 +614,18 @@ class Units(DynamicTable):
) )
name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}}) name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}})
spike_times_index: Optional[Named[VectorIndex]] = Field( electrode_group: Optional[VectorData[NDArray[Any, ElectrodeGroup]]] = Field(
None, None,
description="""Index into the spike_times dataset.""", description="""Electrode group that each spike unit came from.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
electrodes: Optional[Named[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -545,12 +635,9 @@ class Units(DynamicTable):
} }
}, },
) )
spike_times: Optional[UnitsSpikeTimes] = Field( electrodes_index: Optional[Named[VectorIndex]] = Field(
None, description="""Spike times for each unit."""
)
obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into the obs_intervals dataset.""", description="""Index into electrodes.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -576,9 +663,9 @@ class Units(DynamicTable):
}, },
) )
) )
electrodes_index: Optional[Named[VectorIndex]] = Field( obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into electrodes.""", description="""Index into the obs_intervals dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -588,9 +675,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrodes: Optional[Named[DynamicTableRegion]] = Field( spike_times: Optional[UnitsSpikeTimes] = Field(
None, description="""Spike times for each unit."""
)
spike_times_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""", description="""Index into the spike_times dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -600,25 +690,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field( waveform_mean: Optional[UnitsWaveformMean] = Field(
None, description="""Electrode group that each spike unit came from.""" None, description="""Spike waveform mean for each spike unit."""
)
waveform_sd: Optional[UnitsWaveformSd] = Field(
None, description="""Spike waveform standard deviation for each spike unit."""
) )
waveform_mean: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform mean for each spike unit.""")
waveform_sd: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform standard deviation for each spike unit.""")
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -629,9 +706,6 @@ class Units(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class UnitsSpikeTimes(VectorData): class UnitsSpikeTimes(VectorData):
@ -662,14 +736,78 @@ class UnitsSpikeTimes(VectorData):
] = Field(None) ] = Field(None)
class UnitsWaveformMean(VectorData):
"""
Spike waveform mean for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_mean"] = Field(
"waveform_mean",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_mean", "ifabsent": "string(waveform_mean)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
class UnitsWaveformSd(VectorData):
"""
Spike waveform standard deviation for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_sd"] = Field(
"waveform_sd",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_sd", "ifabsent": "string(waveform_sd)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
AbstractFeatureSeries.model_rebuild() AbstractFeatureSeries.model_rebuild()
AbstractFeatureSeriesData.model_rebuild() AbstractFeatureSeriesData.model_rebuild()
AnnotationSeries.model_rebuild() AnnotationSeries.model_rebuild()
AnnotationSeriesData.model_rebuild()
IntervalSeries.model_rebuild() IntervalSeries.model_rebuild()
IntervalSeriesData.model_rebuild()
DecompositionSeries.model_rebuild() DecompositionSeries.model_rebuild()
DecompositionSeriesData.model_rebuild() DecompositionSeriesData.model_rebuild()
DecompositionSeriesBands.model_rebuild() DecompositionSeriesBands.model_rebuild()
Units.model_rebuild() Units.model_rebuild()
UnitsSpikeTimes.model_rebuild() UnitsSpikeTimes.model_rebuild()
UnitsWaveformMean.model_rebuild()
UnitsWaveformSd.model_rebuild()

View file

@ -158,10 +158,8 @@ class OptogeneticSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], float] = Field( data: OptogeneticSeriesData = Field(
..., ..., description="""Applied power for optogenetic stimulus, in watts."""
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
site: Union[OptogeneticStimulusSite, str] = Field( site: Union[OptogeneticStimulusSite, str] = Field(
..., ...,
@ -209,6 +207,37 @@ class OptogeneticSeries(TimeSeries):
) )
class OptogeneticSeriesData(ConfiguredBaseModel):
"""
Applied power for optogenetic stimulus, in watts.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ogen"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["watts"] = Field(
"watts",
description="""Unit of measurement for data, which is fixed to 'watts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "watts", "ifabsent": "string(watts)"}},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class OptogeneticStimulusSite(NWBContainer): class OptogeneticStimulusSite(NWBContainer):
""" """
A site of optogenetic stimulation. A site of optogenetic stimulation.
@ -239,4 +268,5 @@ class OptogeneticStimulusSite(NWBContainer):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
OptogeneticSeries.model_rebuild() OptogeneticSeries.model_rebuild()
OptogeneticSeriesData.model_rebuild()
OptogeneticStimulusSite.model_rebuild() OptogeneticStimulusSite.model_rebuild()

View file

@ -28,7 +28,7 @@ from ...core.v2_2_4.core_nwb_base import (
TimeSeriesSync, TimeSeriesSync,
) )
from ...core.v2_2_4.core_nwb_device import Device from ...core.v2_2_4.core_nwb_device import Device
from ...core.v2_2_4.core_nwb_image import ImageSeries, ImageSeriesExternalFile from ...core.v2_2_4.core_nwb_image import ImageSeries, ImageSeriesData, ImageSeriesExternalFile
from ...hdmf_common.v1_1_3.hdmf_common_table import ( from ...hdmf_common.v1_1_3.hdmf_common_table import (
DynamicTable, DynamicTable,
DynamicTableRegion, DynamicTableRegion,
@ -215,12 +215,9 @@ class TwoPhotonSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -231,8 +228,9 @@ class TwoPhotonSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -281,9 +279,7 @@ class RoiResponseSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: RoiResponseSeriesData = Field(..., description="""Signals from ROIs.""")
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times, * num_rois"], float]
] = Field(..., description="""Signals from ROIs.""")
rois: Named[DynamicTableRegion] = Field( rois: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""", description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
@ -333,6 +329,39 @@ class RoiResponseSeries(TimeSeries):
) )
class RoiResponseSeriesData(ConfiguredBaseModel):
"""
Signals from ROIs.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_rois"], float | int],
]
] = Field(None)
class DfOverF(NWBDataInterface): class DfOverF(NWBDataInterface):
""" """
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). 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).
@ -342,10 +371,10 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field("DfOverF", json_schema_extra={"linkml_meta": {"ifabsent": "string(DfOverF)"}})
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class Fluorescence(NWBDataInterface): class Fluorescence(NWBDataInterface):
@ -357,10 +386,12 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field(
"Fluorescence", json_schema_extra={"linkml_meta": {"ifabsent": "string(Fluorescence)"}}
)
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class ImageSegmentation(NWBDataInterface): class ImageSegmentation(NWBDataInterface):
@ -372,10 +403,13 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[PlaneSegmentation]] = Field( name: str = Field(
"ImageSegmentation",
json_schema_extra={"linkml_meta": {"ifabsent": "string(ImageSegmentation)"}},
)
value: Optional[Dict[str, PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
) )
name: str = Field(...)
class PlaneSegmentation(DynamicTable): class PlaneSegmentation(DynamicTable):
@ -388,10 +422,21 @@ class PlaneSegmentation(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
image_mask: Optional[PlaneSegmentationImageMask] = Field( image_mask: Optional[
VectorData[
Union[
NDArray[Shape["* num_roi, * num_x, * num_y"], Any],
NDArray[Shape["* num_roi, * num_x, * num_y, * num_z"], Any],
]
]
] = Field(
None, None,
description="""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.""", description="""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.""",
) )
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
None,
description="""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""",
)
pixel_mask_index: Optional[Named[VectorIndex]] = Field( pixel_mask_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into pixel_mask.""", description="""Index into pixel_mask.""",
@ -404,9 +449,9 @@ class PlaneSegmentation(DynamicTable):
} }
}, },
) )
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field( voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
None, None,
description="""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""", description="""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""",
) )
voxel_mask_index: Optional[Named[VectorIndex]] = Field( voxel_mask_index: Optional[Named[VectorIndex]] = Field(
None, None,
@ -420,11 +465,7 @@ class PlaneSegmentation(DynamicTable):
} }
}, },
) )
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field( reference_images: Optional[Dict[str, ImageSeries]] = Field(
None,
description="""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""",
)
reference_images: Optional[List[ImageSeries]] = Field(
None, None,
description="""Image stacks that the segmentation masks apply to.""", description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
@ -448,33 +489,6 @@ class PlaneSegmentation(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class PlaneSegmentationImageMask(VectorData):
"""
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.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["image_mask"] = Field(
"image_mask",
json_schema_extra={
"linkml_meta": {"equals_string": "image_mask", "ifabsent": "string(image_mask)"}
},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
class PlaneSegmentationPixelMask(VectorData): class PlaneSegmentationPixelMask(VectorData):
@ -597,7 +611,7 @@ class ImagingPlane(NWBContainer):
None, None,
description="""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).\"""", description="""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).\"""",
) )
optical_channel: List[OpticalChannel] = Field( optical_channel: Dict[str, OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane.""" ..., description="""An optical channel used to record from an imaging plane."""
) )
device: Union[Device, str] = Field( device: Union[Device, str] = Field(
@ -731,10 +745,13 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[CorrectedImageStack]] = Field( name: str = Field(
"MotionCorrection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(MotionCorrection)"}},
)
value: Optional[Dict[str, CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
) )
name: str = Field(...)
class CorrectedImageStack(NWBDataInterface): class CorrectedImageStack(NWBDataInterface):
@ -769,11 +786,11 @@ class CorrectedImageStack(NWBDataInterface):
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
TwoPhotonSeries.model_rebuild() TwoPhotonSeries.model_rebuild()
RoiResponseSeries.model_rebuild() RoiResponseSeries.model_rebuild()
RoiResponseSeriesData.model_rebuild()
DfOverF.model_rebuild() DfOverF.model_rebuild()
Fluorescence.model_rebuild() Fluorescence.model_rebuild()
ImageSegmentation.model_rebuild() ImageSegmentation.model_rebuild()
PlaneSegmentation.model_rebuild() PlaneSegmentation.model_rebuild()
PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild() PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild() PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild() ImagingPlane.model_rebuild()

View file

@ -38,6 +38,7 @@ from ...core.v2_2_4.core_nwb_ecephys import (
ClusterWaveforms, ClusterWaveforms,
Clustering, Clustering,
ElectricalSeries, ElectricalSeries,
ElectricalSeriesData,
ElectrodeGroup, ElectrodeGroup,
ElectrodeGroupPosition, ElectrodeGroupPosition,
EventDetection, EventDetection,
@ -46,6 +47,7 @@ from ...core.v2_2_4.core_nwb_ecephys import (
FilteredEphys, FilteredEphys,
LFP, LFP,
SpikeEventSeries, SpikeEventSeries,
SpikeEventSeriesData,
) )
from ...core.v2_2_4.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries from ...core.v2_2_4.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries
from ...core.v2_2_4.core_nwb_file import ( from ...core.v2_2_4.core_nwb_file import (
@ -87,9 +89,12 @@ from ...core.v2_2_4.core_nwb_image import (
GrayscaleImage, GrayscaleImage,
ImageMaskSeries, ImageMaskSeries,
ImageSeries, ImageSeries,
ImageSeriesData,
ImageSeriesExternalFile, ImageSeriesExternalFile,
IndexSeries, IndexSeries,
IndexSeriesData,
OpticalSeries, OpticalSeries,
OpticalSeriesData,
RGBAImage, RGBAImage,
RGBImage, RGBImage,
) )
@ -97,14 +102,22 @@ from ...core.v2_2_4.core_nwb_misc import (
AbstractFeatureSeries, AbstractFeatureSeries,
AbstractFeatureSeriesData, AbstractFeatureSeriesData,
AnnotationSeries, AnnotationSeries,
AnnotationSeriesData,
DecompositionSeries, DecompositionSeries,
DecompositionSeriesBands, DecompositionSeriesBands,
DecompositionSeriesData, DecompositionSeriesData,
IntervalSeries, IntervalSeries,
IntervalSeriesData,
Units, Units,
UnitsSpikeTimes, UnitsSpikeTimes,
UnitsWaveformMean,
UnitsWaveformSd,
)
from ...core.v2_2_4.core_nwb_ogen import (
OptogeneticSeries,
OptogeneticSeriesData,
OptogeneticStimulusSite,
) )
from ...core.v2_2_4.core_nwb_ogen import OptogeneticSeries, OptogeneticStimulusSite
from ...core.v2_2_4.core_nwb_ophys import ( from ...core.v2_2_4.core_nwb_ophys import (
CorrectedImageStack, CorrectedImageStack,
DfOverF, DfOverF,
@ -117,10 +130,10 @@ from ...core.v2_2_4.core_nwb_ophys import (
MotionCorrection, MotionCorrection,
OpticalChannel, OpticalChannel,
PlaneSegmentation, PlaneSegmentation,
PlaneSegmentationImageMask,
PlaneSegmentationPixelMask, PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask, PlaneSegmentationVoxelMask,
RoiResponseSeries, RoiResponseSeries,
RoiResponseSeriesData,
TwoPhotonSeries, TwoPhotonSeries,
) )
from ...core.v2_2_4.core_nwb_retinotopy import ( from ...core.v2_2_4.core_nwb_retinotopy import (

View file

@ -170,9 +170,9 @@ class Image(NWBData):
description: Optional[str] = Field(None, description="""Description of the image.""") description: Optional[str] = Field(None, description="""Description of the image.""")
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* x, * y"], float], NDArray[Shape["* x, * y"], float | int],
NDArray[Shape["* x, * y, 3 r_g_b"], float], NDArray[Shape["* x, * y, 3 r_g_b"], float | int],
NDArray[Shape["* x, * y, 4 r_g_b_a"], float], NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -333,13 +333,16 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True} {"from_schema": "core.nwb.base", "tree_root": True}
) )
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( name: str = Field(...)
description: str = Field(
..., description="""Description of this collection of processed data."""
)
value: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
name: str = Field(...)
class Images(NWBDataInterface): class Images(NWBDataInterface):
@ -353,7 +356,7 @@ class Images(NWBDataInterface):
name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}}) name: str = Field("Images", json_schema_extra={"linkml_meta": {"ifabsent": "string(Images)"}})
description: str = Field(..., description="""Description of this collection of images.""") description: str = Field(..., description="""Description of this collection of images.""")
image: List[Image] = Field(..., description="""Images stored in this collection.""") image: List[str] = Field(..., description="""Images stored in this collection.""")
# Model rebuild # Model rebuild

View file

@ -213,6 +213,16 @@ class SpatialSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"meters", "meters",
description="""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'.""", description="""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'.""",
@ -220,8 +230,8 @@ class SpatialSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -235,10 +245,13 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[IntervalSeries]] = Field( name: str = Field(
"BehavioralEpochs",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEpochs)"}},
)
value: Optional[Dict[str, IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
) )
name: str = Field(...)
class BehavioralEvents(NWBDataInterface): class BehavioralEvents(NWBDataInterface):
@ -250,10 +263,13 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralEvents",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralEvents)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class BehavioralTimeSeries(NWBDataInterface): class BehavioralTimeSeries(NWBDataInterface):
@ -265,10 +281,13 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"BehavioralTimeSeries",
json_schema_extra={"linkml_meta": {"ifabsent": "string(BehavioralTimeSeries)"}},
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class PupilTracking(NWBDataInterface): class PupilTracking(NWBDataInterface):
@ -280,10 +299,12 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[TimeSeries]] = Field( name: str = Field(
"PupilTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(PupilTracking)"}}
)
value: Optional[Dict[str, TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
) )
name: str = Field(...)
class EyeTracking(NWBDataInterface): class EyeTracking(NWBDataInterface):
@ -295,10 +316,12 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"EyeTracking", json_schema_extra={"linkml_meta": {"ifabsent": "string(EyeTracking)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class CompassDirection(NWBDataInterface): class CompassDirection(NWBDataInterface):
@ -310,10 +333,13 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"CompassDirection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(CompassDirection)"}},
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
class Position(NWBDataInterface): class Position(NWBDataInterface):
@ -325,10 +351,12 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True} {"from_schema": "core.nwb.behavior", "tree_root": True}
) )
value: Optional[List[SpatialSeries]] = Field( name: str = Field(
"Position", json_schema_extra={"linkml_meta": {"ifabsent": "string(Position)"}}
)
value: Optional[Dict[str, SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -190,11 +190,12 @@ class ElectricalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
NDArray[Shape["* num_times"], float], None,
NDArray[Shape["* num_times, * num_channels"], float], description="""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.""",
NDArray[Shape["* num_times, * num_channels, * num_samples"], float], json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
] = Field(..., description="""Recorded voltage data.""") )
data: ElectricalSeriesData = Field(..., description="""Recorded voltage data.""")
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -207,11 +208,6 @@ class ElectricalSeries(TimeSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -249,6 +245,41 @@ class ElectricalSeries(TimeSeries):
) )
class ElectricalSeriesData(ConfiguredBaseModel):
"""
Recorded voltage data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""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).""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_channels"], float | int],
NDArray[Shape["* num_times, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class SpikeEventSeries(ElectricalSeries): class SpikeEventSeries(ElectricalSeries):
""" """
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). 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).
@ -259,15 +290,17 @@ class SpikeEventSeries(ElectricalSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: SpikeEventSeriesData = Field(..., description="""Spike waveforms.""")
NDArray[Shape["* num_events, * num_samples"], float],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float],
] = Field(..., description="""Spike waveforms.""")
timestamps: NDArray[Shape["* num_times"], float] = Field( timestamps: NDArray[Shape["* num_times"], float] = Field(
..., ...,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
electrodes: Named[DynamicTableRegion] = Field( electrodes: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""", description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
@ -280,11 +313,6 @@ class SpikeEventSeries(ElectricalSeries):
} }
}, },
) )
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
None,
description="""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.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_channels"}]}}},
)
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
description="""Description of the time series.""", description="""Description of the time series.""",
@ -317,6 +345,40 @@ class SpikeEventSeries(ElectricalSeries):
) )
class SpikeEventSeriesData(ConfiguredBaseModel):
"""
Spike waveforms.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ecephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field(
"volts",
description="""Unit of measurement for waveforms, which is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
value: Optional[
Union[
NDArray[Shape["* num_events, * num_samples"], float | int],
NDArray[Shape["* num_events, * num_channels, * num_samples"], float | int],
]
] = Field(None)
class FeatureExtraction(NWBDataInterface): class FeatureExtraction(NWBDataInterface):
""" """
Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source. Features, such as PC1 and PC2, that are extracted from signals stored in a SpikeEventSeries or other source.
@ -415,10 +477,12 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[SpikeEventSeries]] = Field( name: str = Field(
"EventWaveform", json_schema_extra={"linkml_meta": {"ifabsent": "string(EventWaveform)"}}
)
value: Optional[Dict[str, SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
) )
name: str = Field(...)
class FilteredEphys(NWBDataInterface): class FilteredEphys(NWBDataInterface):
@ -430,10 +494,12 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field(
"FilteredEphys", json_schema_extra={"linkml_meta": {"ifabsent": "string(FilteredEphys)"}}
)
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class LFP(NWBDataInterface): class LFP(NWBDataInterface):
@ -445,10 +511,10 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True} {"from_schema": "core.nwb.ecephys", "tree_root": True}
) )
value: Optional[List[ElectricalSeries]] = Field( name: str = Field("LFP", json_schema_extra={"linkml_meta": {"ifabsent": "string(LFP)"}})
value: Optional[Dict[str, ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
) )
name: str = Field(...)
class ElectrodeGroup(NWBContainer): class ElectrodeGroup(NWBContainer):
@ -591,7 +657,9 @@ class Clustering(NWBDataInterface):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
ElectricalSeries.model_rebuild() ElectricalSeries.model_rebuild()
ElectricalSeriesData.model_rebuild()
SpikeEventSeries.model_rebuild() SpikeEventSeries.model_rebuild()
SpikeEventSeriesData.model_rebuild()
FeatureExtraction.model_rebuild() FeatureExtraction.model_rebuild()
EventDetection.model_rebuild() EventDetection.model_rebuild()
EventWaveform.model_rebuild() EventWaveform.model_rebuild()

View file

@ -247,9 +247,6 @@ class TimeIntervals(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class TimeIntervalsTimeseries(VectorData): class TimeIntervalsTimeseries(VectorData):

View file

@ -225,28 +225,28 @@ class NWBFile(NWBContainer):
..., ...,
description="""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).""", description="""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).""",
) )
acquisition: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field( acquisition: Optional[Dict[str, Union[DynamicTable, NWBDataInterface]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
}, },
) )
analysis: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( analysis: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
scratch: Optional[List[Union[DynamicTable, NWBContainer]]] = Field( scratch: Optional[Dict[str, Union[DynamicTable, NWBContainer]]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]} "linkml_meta": {"any_of": [{"range": "NWBContainer"}, {"range": "DynamicTable"}]}
}, },
) )
processing: Optional[List[ProcessingModule]] = Field( processing: Optional[Dict[str, ProcessingModule]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ProcessingModule"}]}},
@ -264,6 +264,9 @@ class NWBFile(NWBContainer):
description="""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.""", description="""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.""",
) )
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""") units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
specifications: Optional[dict] = Field(
None, description="""Nested dictionary of schema specifications"""
)
class NWBFileStimulus(ConfiguredBaseModel): class NWBFileStimulus(ConfiguredBaseModel):
@ -279,12 +282,12 @@ class NWBFileStimulus(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"} "linkml_meta": {"equals_string": "stimulus", "ifabsent": "string(stimulus)"}
}, },
) )
presentation: Optional[List[TimeSeries]] = Field( presentation: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""Stimuli presented during the experiment.""", description="""Stimuli presented during the experiment.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
) )
templates: Optional[List[TimeSeries]] = Field( templates: Optional[Dict[str, TimeSeries]] = Field(
None, None,
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}},
@ -362,11 +365,7 @@ class NWBFileGeneral(ConfiguredBaseModel):
None, None,
description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""", description="""Information about virus(es) used in experiments, including virus ID, source, date made, injection location, volume, etc.""",
) )
lab_meta_data: Optional[List[LabMetaData]] = Field( devices: Optional[Dict[str, Device]] = Field(
None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
)
devices: Optional[List[Device]] = Field(
None, None,
description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""", description="""Description of hardware devices used during experiment, e.g., monitors, ADC boards, microscopes, etc.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Device"}]}},
@ -381,16 +380,20 @@ class NWBFileGeneral(ConfiguredBaseModel):
intracellular_ephys: Optional[GeneralIntracellularEphys] = Field( intracellular_ephys: Optional[GeneralIntracellularEphys] = Field(
None, description="""Metadata related to intracellular electrophysiology.""" None, description="""Metadata related to intracellular electrophysiology."""
) )
optogenetics: Optional[List[OptogeneticStimulusSite]] = Field( optogenetics: Optional[Dict[str, OptogeneticStimulusSite]] = Field(
None, None,
description="""Metadata describing optogenetic stimuluation.""", description="""Metadata describing optogenetic stimuluation.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OptogeneticStimulusSite"}]}},
) )
optophysiology: Optional[List[ImagingPlane]] = Field( optophysiology: Optional[Dict[str, ImagingPlane]] = Field(
None, None,
description="""Metadata related to optophysiology.""", description="""Metadata related to optophysiology.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImagingPlane"}]}},
) )
value: Optional[Dict[str, LabMetaData]] = Field(
None,
description="""Place-holder than can be extended so that lab-specific meta-data can be placed in /general.""",
)
class GeneralSourceScript(ConfiguredBaseModel): class GeneralSourceScript(ConfiguredBaseModel):
@ -426,12 +429,12 @@ class GeneralExtracellularEphys(ConfiguredBaseModel):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
electrodes: Optional[ExtracellularEphysElectrodes] = Field( electrodes: Optional[ExtracellularEphysElectrodes] = Field(
None, description="""A table of all electrodes (i.e. channels) used for recording.""" None, description="""A table of all electrodes (i.e. channels) used for recording."""
) )
value: Optional[Dict[str, ElectrodeGroup]] = Field(
None, description="""Physical group of electrodes."""
)
class ExtracellularEphysElectrodes(DynamicTable): class ExtracellularEphysElectrodes(DynamicTable):
@ -501,8 +504,14 @@ class ExtracellularEphysElectrodes(DynamicTable):
} }
}, },
) )
group: List[ElectrodeGroup] = Field( group: VectorData[NDArray[Any, ElectrodeGroup]] = Field(
..., description="""Reference to the ElectrodeGroup this electrode is a part of.""" ...,
description="""Reference to the ElectrodeGroup this electrode is a part of.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
) )
group_name: VectorData[NDArray[Any, str]] = Field( group_name: VectorData[NDArray[Any, str]] = Field(
..., ...,
@ -559,9 +568,6 @@ class ExtracellularEphysElectrodes(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class GeneralIntracellularEphys(ConfiguredBaseModel): class GeneralIntracellularEphys(ConfiguredBaseModel):
@ -584,12 +590,12 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
None, None,
description="""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.""", description="""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.""",
) )
intracellular_electrode: Optional[List[IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
sweep_table: Optional[SweepTable] = Field( sweep_table: Optional[SweepTable] = Field(
None, description="""The table which groups different PatchClampSeries together.""" None, description="""The table which groups different PatchClampSeries together."""
) )
value: Optional[Dict[str, IntracellularElectrode]] = Field(
None, description="""An intracellular electrode."""
)
class NWBFileIntervals(ConfiguredBaseModel): class NWBFileIntervals(ConfiguredBaseModel):
@ -615,7 +621,7 @@ class NWBFileIntervals(ConfiguredBaseModel):
invalid_times: Optional[TimeIntervals] = Field( invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis.""" None, description="""Time intervals that should be removed from analysis."""
) )
time_intervals: Optional[List[TimeIntervals]] = Field( value: Optional[Dict[str, TimeIntervals]] = Field(
None, None,
description="""Optional additional table(s) for describing other experimental time intervals.""", description="""Optional additional table(s) for describing other experimental time intervals.""",
) )

View file

@ -262,11 +262,21 @@ class PatchClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
..., ...,
description="""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'.""", description="""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'.""",
) )
value: Optional[NDArray[Shape["* num_times"], float]] = Field( value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}} None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
) )
@ -281,12 +291,12 @@ class CurrentClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""") bias_current: Optional[float] = Field(None, description="""Bias current, in amps.""")
bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""") bridge_balance: Optional[float] = Field(None, description="""Bridge balance, in ohms.""")
capacitance_compensation: Optional[float] = Field( capacitance_compensation: Optional[float] = Field(
None, description="""Capacitance compensation, in farads.""" None, description="""Capacitance compensation, in farads."""
) )
data: CurrentClampSeriesData = Field(..., description="""Recorded voltage.""")
stimulus_description: str = Field( stimulus_description: str = Field(
..., description="""Protocol/stimulus name for this patch-clamp dataset.""" ..., description="""Protocol/stimulus name for this patch-clamp dataset."""
) )
@ -354,12 +364,24 @@ class CurrentClampSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IZeroClampSeries(CurrentClampSeries): class IZeroClampSeries(CurrentClampSeries):
@ -512,6 +534,16 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field( unit: Literal["amperes"] = Field(
"amperes", "amperes",
description="""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'.""", description="""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'.""",
@ -519,7 +551,9 @@ class CurrentClampStimulusSeriesData(ConfiguredBaseModel):
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"} "linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
}, },
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeries(PatchClampSeries): class VoltageClampSeries(PatchClampSeries):
@ -532,13 +566,13 @@ class VoltageClampSeries(PatchClampSeries):
) )
name: str = Field(...) name: str = Field(...)
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field( capacitance_fast: Optional[VoltageClampSeriesCapacitanceFast] = Field(
None, description="""Fast capacitance, in farads.""" None, description="""Fast capacitance, in farads."""
) )
capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field( capacitance_slow: Optional[VoltageClampSeriesCapacitanceSlow] = Field(
None, description="""Slow capacitance, in farads.""" None, description="""Slow capacitance, in farads."""
) )
data: VoltageClampSeriesData = Field(..., description="""Recorded current.""")
resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field( resistance_comp_bandwidth: Optional[VoltageClampSeriesResistanceCompBandwidth] = Field(
None, description="""Resistance compensation bandwidth, in hertz.""" None, description="""Resistance compensation bandwidth, in hertz."""
) )
@ -610,27 +644,6 @@ class VoltageClampSeries(PatchClampSeries):
) )
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Any = Field(...)
class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel): class VoltageClampSeriesCapacitanceFast(ConfiguredBaseModel):
""" """
Fast capacitance, in farads. Fast capacitance, in farads.
@ -683,6 +696,39 @@ class VoltageClampSeriesCapacitanceSlow(ConfiguredBaseModel):
value: float = Field(...) value: float = Field(...)
class VoltageClampSeriesData(ConfiguredBaseModel):
"""
Recorded current.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.icephys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["amperes"] = Field(
"amperes",
description="""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'.""",
json_schema_extra={
"linkml_meta": {"equals_string": "amperes", "ifabsent": "string(amperes)"}
},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel): class VoltageClampSeriesResistanceCompBandwidth(ConfiguredBaseModel):
""" """
Resistance compensation bandwidth, in hertz. Resistance compensation bandwidth, in hertz.
@ -887,12 +933,24 @@ class VoltageClampStimulusSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["volts"] = Field( unit: Literal["volts"] = Field(
"volts", "volts",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}}, json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
) )
value: Any = Field(...) value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntracellularElectrode(NWBContainer): class IntracellularElectrode(NWBContainer):
@ -942,18 +1000,15 @@ class SweepTable(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
sweep_number: VectorData[NDArray[Any, int]] = Field( series: VectorData[NDArray[Any, PatchClampSeries]] = Field(
..., ...,
description="""Sweep number of the PatchClampSeries in that row.""", description="""The PatchClampSeries with the sweep number in that row.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1} "array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
} }
}, },
) )
series: List[PatchClampSeries] = Field(
..., description="""The PatchClampSeries with the sweep number in that row."""
)
series_index: Named[VectorIndex] = Field( series_index: Named[VectorIndex] = Field(
..., ...,
description="""Index for series.""", description="""Index for series.""",
@ -966,6 +1021,15 @@ class SweepTable(DynamicTable):
} }
}, },
) )
sweep_number: VectorData[NDArray[Any, int]] = Field(
...,
description="""Sweep number of the PatchClampSeries in that row.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -976,9 +1040,6 @@ class SweepTable(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild
@ -991,9 +1052,9 @@ IZeroClampSeries.model_rebuild()
CurrentClampStimulusSeries.model_rebuild() CurrentClampStimulusSeries.model_rebuild()
CurrentClampStimulusSeriesData.model_rebuild() CurrentClampStimulusSeriesData.model_rebuild()
VoltageClampSeries.model_rebuild() VoltageClampSeries.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesCapacitanceFast.model_rebuild() VoltageClampSeriesCapacitanceFast.model_rebuild()
VoltageClampSeriesCapacitanceSlow.model_rebuild() VoltageClampSeriesCapacitanceSlow.model_rebuild()
VoltageClampSeriesData.model_rebuild()
VoltageClampSeriesResistanceCompBandwidth.model_rebuild() VoltageClampSeriesResistanceCompBandwidth.model_rebuild()
VoltageClampSeriesResistanceCompCorrection.model_rebuild() VoltageClampSeriesResistanceCompCorrection.model_rebuild()
VoltageClampSeriesResistanceCompPrediction.model_rebuild() VoltageClampSeriesResistanceCompPrediction.model_rebuild()

View file

@ -152,7 +152,7 @@ class GrayscaleImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y"], float]] = Field( value: Optional[NDArray[Shape["* x, * y"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "x"}, {"alias": "y"}]}}
@ -174,7 +174,7 @@ class RGBImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 3 r_g_b"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -204,7 +204,7 @@ class RGBAImage(Image):
) )
name: str = Field(...) name: str = Field(...)
value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float]] = Field( value: Optional[NDArray[Shape["* x, * y, 4 r_g_b_a"], float | int]] = Field(
None, None,
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
@ -234,12 +234,9 @@ class ImageSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -250,8 +247,9 @@ class ImageSeries(TimeSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -290,6 +288,39 @@ class ImageSeries(TimeSeries):
) )
class ImageSeriesData(ConfiguredBaseModel):
"""
Binary data representing images across frames.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, * z"], float | int],
]
] = Field(None)
class ImageSeriesExternalFile(ConfiguredBaseModel): class ImageSeriesExternalFile(ConfiguredBaseModel):
""" """
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. 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.
@ -331,12 +362,9 @@ class ImageMaskSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -347,8 +375,9 @@ class ImageMaskSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -397,6 +426,9 @@ class OpticalSeries(ImageSeries):
) )
name: str = Field(...) name: str = Field(...)
data: OpticalSeriesData = Field(
..., description="""Images presented to subject, either grayscale or RGB"""
)
distance: Optional[float] = Field( distance: Optional[float] = Field(
None, description="""Distance from camera/monitor to target/eye.""" None, description="""Distance from camera/monitor to target/eye."""
) )
@ -405,10 +437,6 @@ class OpticalSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float] NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
] ]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""") ] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
data: Union[
NDArray[Shape["* frame, * x, * y"], float],
NDArray[Shape["* frame, * x, * y, 3 r_g_b"], float],
] = Field(..., description="""Images presented to subject, either grayscale or RGB""")
orientation: Optional[str] = Field( orientation: Optional[str] = Field(
None, None,
description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""", description="""Description of image relative to some reference frame (e.g., which way is up). Must also specify frame of reference.""",
@ -423,8 +451,9 @@ class OpticalSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -463,6 +492,39 @@ class OpticalSeries(ImageSeries):
) )
class OpticalSeriesData(ConfiguredBaseModel):
"""
Images presented to subject, either grayscale or RGB
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float | int],
NDArray[Shape["* frame, * x, * y, 3 r_g_b"], float | int],
]
] = Field(None)
class IndexSeries(TimeSeries): class IndexSeries(TimeSeries):
""" """
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. 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.
@ -473,10 +535,8 @@ class IndexSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IndexSeriesData = Field(
..., ..., description="""Index of the frame in the referenced ImageSeries."""
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
indexed_timeseries: Union[ImageSeries, str] = Field( indexed_timeseries: Union[ImageSeries, str] = Field(
..., ...,
@ -524,13 +584,46 @@ class IndexSeries(TimeSeries):
) )
class IndexSeriesData(ConfiguredBaseModel):
"""
Index of the frame in the referenced ImageSeries.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.image"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
GrayscaleImage.model_rebuild() GrayscaleImage.model_rebuild()
RGBImage.model_rebuild() RGBImage.model_rebuild()
RGBAImage.model_rebuild() RGBAImage.model_rebuild()
ImageSeries.model_rebuild() ImageSeries.model_rebuild()
ImageSeriesData.model_rebuild()
ImageSeriesExternalFile.model_rebuild() ImageSeriesExternalFile.model_rebuild()
ImageMaskSeries.model_rebuild() ImageMaskSeries.model_rebuild()
OpticalSeries.model_rebuild() OpticalSeries.model_rebuild()
OpticalSeriesData.model_rebuild()
IndexSeries.model_rebuild() IndexSeries.model_rebuild()
IndexSeriesData.model_rebuild()

View file

@ -251,6 +251,16 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Optional[str] = Field( unit: Optional[str] = Field(
"see ", "see ",
description="""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'\".""", description="""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'\".""",
@ -258,8 +268,8 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
) )
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_features"], float], NDArray[Shape["* num_times, * num_features"], float | int],
] ]
] = Field(None) ] = Field(None)
@ -274,10 +284,8 @@ class AnnotationSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], str] = Field( data: AnnotationSeriesData = Field(
..., ..., description="""Annotations made during an experiment."""
description="""Annotations made during an experiment.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -316,6 +324,39 @@ class AnnotationSeries(TimeSeries):
) )
class AnnotationSeriesData(ConfiguredBaseModel):
"""
Annotations made during an experiment.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class IntervalSeries(TimeSeries): class IntervalSeries(TimeSeries):
""" """
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. 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.
@ -326,10 +367,8 @@ class IntervalSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], int] = Field( data: IntervalSeriesData = Field(
..., ..., description="""Use values >0 if interval started, <0 if interval ended."""
description="""Use values >0 if interval started, <0 if interval ended.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -368,6 +407,39 @@ class IntervalSeries(TimeSeries):
) )
class IntervalSeriesData(ConfiguredBaseModel):
"""
Use values >0 if interval started, <0 if interval ended.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: float = Field(
-1.0,
description="""Smallest meaningful difference between values in data. Annotations have no units, so the value is fixed to -1.0.""",
le=-1,
ge=-1,
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["n/a"] = Field(
"n/a",
description="""Base unit of measurement for working with the data. Annotations have no units, so the value is fixed to 'n/a'.""",
json_schema_extra={"linkml_meta": {"equals_string": "n/a", "ifabsent": "string(n/a)"}},
)
value: Optional[NDArray[Shape["* num_times"], int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class DecompositionSeries(TimeSeries): class DecompositionSeries(TimeSeries):
""" """
Spectral analysis of a time series, e.g. of an LFP or a speech signal. Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -443,24 +515,36 @@ class DecompositionSeriesData(ConfiguredBaseModel):
"data", "data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}}, json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field( unit: str = Field(
"no unit", "no unit",
description="""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'.""", description="""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'.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}}, json_schema_extra={"linkml_meta": {"ifabsent": "string(no unit)"}},
) )
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field( value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float | int]] = (
None, Field(
json_schema_extra={ None,
"linkml_meta": { json_schema_extra={
"array": { "linkml_meta": {
"dimensions": [ "array": {
{"alias": "num_times"}, "dimensions": [
{"alias": "num_channels"}, {"alias": "num_times"},
{"alias": "num_bands"}, {"alias": "num_channels"},
] {"alias": "num_bands"},
]
}
} }
} },
}, )
) )
@ -518,9 +602,6 @@ class DecompositionSeriesBands(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class Units(DynamicTable): class Units(DynamicTable):
@ -533,9 +614,18 @@ class Units(DynamicTable):
) )
name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}}) name: str = Field("Units", json_schema_extra={"linkml_meta": {"ifabsent": "string(Units)"}})
spike_times_index: Optional[Named[VectorIndex]] = Field( electrode_group: Optional[VectorData[NDArray[Any, ElectrodeGroup]]] = Field(
None, None,
description="""Index into the spike_times dataset.""", description="""Electrode group that each spike unit came from.""",
json_schema_extra={
"linkml_meta": {
"array": {"maximum_number_dimensions": False, "minimum_number_dimensions": 1}
}
},
)
electrodes: Optional[Named[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -545,12 +635,9 @@ class Units(DynamicTable):
} }
}, },
) )
spike_times: Optional[UnitsSpikeTimes] = Field( electrodes_index: Optional[Named[VectorIndex]] = Field(
None, description="""Spike times for each unit."""
)
obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into the obs_intervals dataset.""", description="""Index into electrodes.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -576,9 +663,9 @@ class Units(DynamicTable):
}, },
) )
) )
electrodes_index: Optional[Named[VectorIndex]] = Field( obs_intervals_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into electrodes.""", description="""Index into the obs_intervals dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -588,9 +675,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrodes: Optional[Named[DynamicTableRegion]] = Field( spike_times: Optional[UnitsSpikeTimes] = Field(
None, description="""Spike times for each unit."""
)
spike_times_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""", description="""Index into the spike_times dataset.""",
json_schema_extra={ json_schema_extra={
"linkml_meta": { "linkml_meta": {
"annotations": { "annotations": {
@ -600,25 +690,12 @@ class Units(DynamicTable):
} }
}, },
) )
electrode_group: Optional[List[ElectrodeGroup]] = Field( waveform_mean: Optional[UnitsWaveformMean] = Field(
None, description="""Electrode group that each spike unit came from.""" None, description="""Spike waveform mean for each spike unit."""
)
waveform_sd: Optional[UnitsWaveformSd] = Field(
None, description="""Spike waveform standard deviation for each spike unit."""
) )
waveform_mean: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform mean for each spike unit.""")
waveform_sd: Optional[
VectorData[
Union[
NDArray[Shape["* num_units, * num_samples"], float],
NDArray[Shape["* num_units, * num_samples, * num_electrodes"], float],
]
]
] = Field(None, description="""Spike waveform standard deviation for each spike unit.""")
colnames: List[str] = Field( colnames: List[str] = Field(
..., ...,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""", description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -629,9 +706,6 @@ class Units(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class UnitsSpikeTimes(VectorData): class UnitsSpikeTimes(VectorData):
@ -662,14 +736,78 @@ class UnitsSpikeTimes(VectorData):
] = Field(None) ] = Field(None)
class UnitsWaveformMean(VectorData):
"""
Spike waveform mean for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_mean"] = Field(
"waveform_mean",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_mean", "ifabsent": "string(waveform_mean)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
class UnitsWaveformSd(VectorData):
"""
Spike waveform standard deviation for each spike unit.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.misc"})
name: Literal["waveform_sd"] = Field(
"waveform_sd",
json_schema_extra={
"linkml_meta": {"equals_string": "waveform_sd", "ifabsent": "string(waveform_sd)"}
},
)
sampling_rate: Optional[float] = Field(None, description="""Sampling rate, in hertz.""")
unit: Optional[Literal["volts"]] = Field(
"volts",
description="""Unit of measurement. This value is fixed to 'volts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "volts", "ifabsent": "string(volts)"}},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
AbstractFeatureSeries.model_rebuild() AbstractFeatureSeries.model_rebuild()
AbstractFeatureSeriesData.model_rebuild() AbstractFeatureSeriesData.model_rebuild()
AnnotationSeries.model_rebuild() AnnotationSeries.model_rebuild()
AnnotationSeriesData.model_rebuild()
IntervalSeries.model_rebuild() IntervalSeries.model_rebuild()
IntervalSeriesData.model_rebuild()
DecompositionSeries.model_rebuild() DecompositionSeries.model_rebuild()
DecompositionSeriesData.model_rebuild() DecompositionSeriesData.model_rebuild()
DecompositionSeriesBands.model_rebuild() DecompositionSeriesBands.model_rebuild()
Units.model_rebuild() Units.model_rebuild()
UnitsSpikeTimes.model_rebuild() UnitsSpikeTimes.model_rebuild()
UnitsWaveformMean.model_rebuild()
UnitsWaveformSd.model_rebuild()

View file

@ -158,10 +158,8 @@ class OptogeneticSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: NDArray[Shape["* num_times"], float] = Field( data: OptogeneticSeriesData = Field(
..., ..., description="""Applied power for optogenetic stimulus, in watts."""
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
) )
site: Union[OptogeneticStimulusSite, str] = Field( site: Union[OptogeneticStimulusSite, str] = Field(
..., ...,
@ -209,6 +207,37 @@ class OptogeneticSeries(TimeSeries):
) )
class OptogeneticSeriesData(ConfiguredBaseModel):
"""
Applied power for optogenetic stimulus, in watts.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ogen"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: Literal["watts"] = Field(
"watts",
description="""Unit of measurement for data, which is fixed to 'watts'.""",
json_schema_extra={"linkml_meta": {"equals_string": "watts", "ifabsent": "string(watts)"}},
)
value: Optional[NDArray[Shape["* num_times"], float | int]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
class OptogeneticStimulusSite(NWBContainer): class OptogeneticStimulusSite(NWBContainer):
""" """
A site of optogenetic stimulation. A site of optogenetic stimulation.
@ -239,4 +268,5 @@ class OptogeneticStimulusSite(NWBContainer):
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
OptogeneticSeries.model_rebuild() OptogeneticSeries.model_rebuild()
OptogeneticSeriesData.model_rebuild()
OptogeneticStimulusSite.model_rebuild() OptogeneticStimulusSite.model_rebuild()

View file

@ -28,7 +28,7 @@ from ...core.v2_2_5.core_nwb_base import (
TimeSeriesSync, TimeSeriesSync,
) )
from ...core.v2_2_5.core_nwb_device import Device from ...core.v2_2_5.core_nwb_device import Device
from ...core.v2_2_5.core_nwb_image import ImageSeries, ImageSeriesExternalFile from ...core.v2_2_5.core_nwb_image import ImageSeries, ImageSeriesData, ImageSeriesExternalFile
from ...hdmf_common.v1_1_3.hdmf_common_table import ( from ...hdmf_common.v1_1_3.hdmf_common_table import (
DynamicTable, DynamicTable,
DynamicTableRegion, DynamicTableRegion,
@ -217,12 +217,9 @@ class TwoPhotonSeries(ImageSeries):
} }
}, },
) )
data: Optional[ data: Optional[ImageSeriesData] = Field(
Union[ None, description="""Binary data representing images across frames."""
NDArray[Shape["* frame, * x, * y"], float], )
NDArray[Shape["* frame, * x, * y, * z"], float],
]
] = Field(None, description="""Binary data representing images across frames.""")
dimension: Optional[NDArray[Shape["* rank"], int]] = Field( dimension: Optional[NDArray[Shape["* rank"], int]] = Field(
None, None,
description="""Number of pixels on x, y, (and z) axes.""", description="""Number of pixels on x, y, (and z) axes.""",
@ -233,8 +230,9 @@ class TwoPhotonSeries(ImageSeries):
description="""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.""", description="""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.""",
) )
format: Optional[str] = Field( format: Optional[str] = Field(
None, "raw",
description="""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.""", description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "string(raw)"}},
) )
description: Optional[str] = Field( description: Optional[str] = Field(
"no description", "no description",
@ -283,9 +281,7 @@ class RoiResponseSeries(TimeSeries):
) )
name: str = Field(...) name: str = Field(...)
data: Union[ data: RoiResponseSeriesData = Field(..., description="""Signals from ROIs.""")
NDArray[Shape["* num_times"], float], NDArray[Shape["* num_times, * num_rois"], float]
] = Field(..., description="""Signals from ROIs.""")
rois: Named[DynamicTableRegion] = Field( rois: Named[DynamicTableRegion] = Field(
..., ...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""", description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
@ -335,6 +331,39 @@ class RoiResponseSeries(TimeSeries):
) )
class RoiResponseSeriesData(ConfiguredBaseModel):
"""
Signals from ROIs.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
)
conversion: Optional[float] = Field(
1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(1.0)"}},
)
resolution: Optional[float] = Field(
-1.0,
description="""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.""",
json_schema_extra={"linkml_meta": {"ifabsent": "float(-1.0)"}},
)
unit: str = Field(
...,
description="""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'.""",
)
value: Optional[
Union[
NDArray[Shape["* num_times"], float | int],
NDArray[Shape["* num_times, * num_rois"], float | int],
]
] = Field(None)
class DfOverF(NWBDataInterface): class DfOverF(NWBDataInterface):
""" """
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). 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).
@ -344,10 +373,10 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field("DfOverF", json_schema_extra={"linkml_meta": {"ifabsent": "string(DfOverF)"}})
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class Fluorescence(NWBDataInterface): class Fluorescence(NWBDataInterface):
@ -359,10 +388,12 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[RoiResponseSeries]] = Field( name: str = Field(
"Fluorescence", json_schema_extra={"linkml_meta": {"ifabsent": "string(Fluorescence)"}}
)
value: Optional[Dict[str, RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
) )
name: str = Field(...)
class ImageSegmentation(NWBDataInterface): class ImageSegmentation(NWBDataInterface):
@ -374,10 +405,13 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[PlaneSegmentation]] = Field( name: str = Field(
"ImageSegmentation",
json_schema_extra={"linkml_meta": {"ifabsent": "string(ImageSegmentation)"}},
)
value: Optional[Dict[str, PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
) )
name: str = Field(...)
class PlaneSegmentation(DynamicTable): class PlaneSegmentation(DynamicTable):
@ -390,10 +424,21 @@ class PlaneSegmentation(DynamicTable):
) )
name: str = Field(...) name: str = Field(...)
image_mask: Optional[PlaneSegmentationImageMask] = Field( image_mask: Optional[
VectorData[
Union[
NDArray[Shape["* num_roi, * num_x, * num_y"], Any],
NDArray[Shape["* num_roi, * num_x, * num_y, * num_z"], Any],
]
]
] = Field(
None, None,
description="""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.""", description="""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.""",
) )
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
None,
description="""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""",
)
pixel_mask_index: Optional[Named[VectorIndex]] = Field( pixel_mask_index: Optional[Named[VectorIndex]] = Field(
None, None,
description="""Index into pixel_mask.""", description="""Index into pixel_mask.""",
@ -406,9 +451,9 @@ class PlaneSegmentation(DynamicTable):
} }
}, },
) )
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field( voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
None, None,
description="""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""", description="""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""",
) )
voxel_mask_index: Optional[Named[VectorIndex]] = Field( voxel_mask_index: Optional[Named[VectorIndex]] = Field(
None, None,
@ -422,11 +467,7 @@ class PlaneSegmentation(DynamicTable):
} }
}, },
) )
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field( reference_images: Optional[Dict[str, ImageSeries]] = Field(
None,
description="""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""",
)
reference_images: Optional[List[ImageSeries]] = Field(
None, None,
description="""Image stacks that the segmentation masks apply to.""", description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}}, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
@ -450,33 +491,6 @@ class PlaneSegmentation(DynamicTable):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
class PlaneSegmentationImageMask(VectorData):
"""
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.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["image_mask"] = Field(
"image_mask",
json_schema_extra={
"linkml_meta": {"equals_string": "image_mask", "ifabsent": "string(image_mask)"}
},
)
description: str = Field(..., description="""Description of what these vectors represent.""")
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
NDArray[Shape["* dim0, * dim1, * dim2"], Any],
NDArray[Shape["* dim0, * dim1, * dim2, * dim3"], Any],
]
] = Field(None)
class PlaneSegmentationPixelMask(VectorData): class PlaneSegmentationPixelMask(VectorData):
@ -599,7 +613,7 @@ class ImagingPlane(NWBContainer):
None, None,
description="""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).\"""", description="""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).\"""",
) )
optical_channel: List[OpticalChannel] = Field( optical_channel: Dict[str, OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane.""" ..., description="""An optical channel used to record from an imaging plane."""
) )
device: Union[Device, str] = Field( device: Union[Device, str] = Field(
@ -713,10 +727,13 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True} {"from_schema": "core.nwb.ophys", "tree_root": True}
) )
value: Optional[List[CorrectedImageStack]] = Field( name: str = Field(
"MotionCorrection",
json_schema_extra={"linkml_meta": {"ifabsent": "string(MotionCorrection)"}},
)
value: Optional[Dict[str, CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
) )
name: str = Field(...)
class CorrectedImageStack(NWBDataInterface): class CorrectedImageStack(NWBDataInterface):
@ -751,11 +768,11 @@ class CorrectedImageStack(NWBDataInterface):
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
TwoPhotonSeries.model_rebuild() TwoPhotonSeries.model_rebuild()
RoiResponseSeries.model_rebuild() RoiResponseSeries.model_rebuild()
RoiResponseSeriesData.model_rebuild()
DfOverF.model_rebuild() DfOverF.model_rebuild()
Fluorescence.model_rebuild() Fluorescence.model_rebuild()
ImageSegmentation.model_rebuild() ImageSegmentation.model_rebuild()
PlaneSegmentation.model_rebuild() PlaneSegmentation.model_rebuild()
PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild() PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild() PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild() ImagingPlane.model_rebuild()

View file

@ -38,6 +38,7 @@ from ...core.v2_2_5.core_nwb_ecephys import (
ClusterWaveforms, ClusterWaveforms,
Clustering, Clustering,
ElectricalSeries, ElectricalSeries,
ElectricalSeriesData,
ElectrodeGroup, ElectrodeGroup,
ElectrodeGroupPosition, ElectrodeGroupPosition,
EventDetection, EventDetection,
@ -46,6 +47,7 @@ from ...core.v2_2_5.core_nwb_ecephys import (
FilteredEphys, FilteredEphys,
LFP, LFP,
SpikeEventSeries, SpikeEventSeries,
SpikeEventSeriesData,
) )
from ...core.v2_2_5.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries from ...core.v2_2_5.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries
from ...core.v2_2_5.core_nwb_file import ( from ...core.v2_2_5.core_nwb_file import (
@ -87,9 +89,12 @@ from ...core.v2_2_5.core_nwb_image import (
GrayscaleImage, GrayscaleImage,
ImageMaskSeries, ImageMaskSeries,
ImageSeries, ImageSeries,
ImageSeriesData,
ImageSeriesExternalFile, ImageSeriesExternalFile,
IndexSeries, IndexSeries,
IndexSeriesData,
OpticalSeries, OpticalSeries,
OpticalSeriesData,
RGBAImage, RGBAImage,
RGBImage, RGBImage,
) )
@ -97,14 +102,22 @@ from ...core.v2_2_5.core_nwb_misc import (
AbstractFeatureSeries, AbstractFeatureSeries,
AbstractFeatureSeriesData, AbstractFeatureSeriesData,
AnnotationSeries, AnnotationSeries,
AnnotationSeriesData,
DecompositionSeries, DecompositionSeries,
DecompositionSeriesBands, DecompositionSeriesBands,
DecompositionSeriesData, DecompositionSeriesData,
IntervalSeries, IntervalSeries,
IntervalSeriesData,
Units, Units,
UnitsSpikeTimes, UnitsSpikeTimes,
UnitsWaveformMean,
UnitsWaveformSd,
)
from ...core.v2_2_5.core_nwb_ogen import (
OptogeneticSeries,
OptogeneticSeriesData,
OptogeneticStimulusSite,
) )
from ...core.v2_2_5.core_nwb_ogen import OptogeneticSeries, OptogeneticStimulusSite
from ...core.v2_2_5.core_nwb_ophys import ( from ...core.v2_2_5.core_nwb_ophys import (
CorrectedImageStack, CorrectedImageStack,
DfOverF, DfOverF,
@ -117,10 +130,10 @@ from ...core.v2_2_5.core_nwb_ophys import (
MotionCorrection, MotionCorrection,
OpticalChannel, OpticalChannel,
PlaneSegmentation, PlaneSegmentation,
PlaneSegmentationImageMask,
PlaneSegmentationPixelMask, PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask, PlaneSegmentationVoxelMask,
RoiResponseSeries, RoiResponseSeries,
RoiResponseSeriesData,
TwoPhotonSeries, TwoPhotonSeries,
) )
from ...core.v2_2_5.core_nwb_retinotopy import ( from ...core.v2_2_5.core_nwb_retinotopy import (

View file

@ -989,12 +989,12 @@ class DynamicTableRegion(DynamicTableRegionMixin, VectorData):
) )
name: str = Field(...) name: str = Field(...)
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
description: str = Field( description: str = Field(
..., description="""Description of what this table region points to.""" ..., description="""Description of what this table region points to."""
) )
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
class Container(ConfiguredBaseModel): class Container(ConfiguredBaseModel):
@ -1029,9 +1029,6 @@ class DynamicTable(DynamicTableMixin):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild

View file

@ -989,12 +989,12 @@ class DynamicTableRegion(DynamicTableRegionMixin, VectorData):
) )
name: str = Field(...) name: str = Field(...)
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
description: str = Field( description: str = Field(
..., description="""Description of what this table region points to.""" ..., description="""Description of what this table region points to."""
) )
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
class Container(ConfiguredBaseModel): class Container(ConfiguredBaseModel):
@ -1029,9 +1029,6 @@ class DynamicTable(DynamicTableMixin):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild

View file

@ -993,12 +993,12 @@ class DynamicTableRegion(DynamicTableRegionMixin, VectorData):
) )
name: str = Field(...) name: str = Field(...)
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
description: str = Field( description: str = Field(
..., description="""Description of what this table region points to.""" ..., description="""Description of what this table region points to."""
) )
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* dim0"], Any], NDArray[Shape["* dim0"], Any],
@ -1041,9 +1041,6 @@ class DynamicTable(DynamicTableMixin):
description="""Array of unique identifiers for the rows of this dynamic table.""", description="""Array of unique identifiers for the rows of this dynamic table.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}}, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}]}}},
) )
vector_index: Optional[List[VectorIndex]] = Field(
None, description="""Indices for the vector columns of this dynamic table."""
)
# Model rebuild # Model rebuild

View file

@ -974,12 +974,12 @@ class DynamicTableRegion(DynamicTableRegionMixin, VectorData):
) )
name: str = Field(...) name: str = Field(...)
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
description: str = Field( description: str = Field(
..., description="""Description of what this table region points to.""" ..., description="""Description of what this table region points to."""
) )
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* dim0"], Any], NDArray[Shape["* dim0"], Any],

View file

@ -171,10 +171,10 @@ class SimpleMultiContainer(Container):
{"from_schema": "hdmf-common.base", "tree_root": True} {"from_schema": "hdmf-common.base", "tree_root": True}
) )
value: Optional[List[Container]] = Field( name: str = Field(...)
value: Optional[Dict[str, Container]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Container"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Container"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -974,12 +974,12 @@ class DynamicTableRegion(DynamicTableRegionMixin, VectorData):
) )
name: str = Field(...) name: str = Field(...)
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
description: str = Field( description: str = Field(
..., description="""Description of what this table region points to.""" ..., description="""Description of what this table region points to."""
) )
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* dim0"], Any], NDArray[Shape["* dim0"], Any],

View file

@ -171,10 +171,10 @@ class SimpleMultiContainer(Container):
{"from_schema": "hdmf-common.base", "tree_root": True} {"from_schema": "hdmf-common.base", "tree_root": True}
) )
value: Optional[List[Container]] = Field( name: str = Field(...)
value: Optional[Dict[str, Container]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Container"}]}} None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "Container"}]}}
) )
name: str = Field(...)
# Model rebuild # Model rebuild

View file

@ -169,23 +169,15 @@ class CSRMatrix(Container):
"linkml_meta": {"array": {"dimensions": [{"alias": "number_of_rows_in_the_matrix_1"}]}} "linkml_meta": {"array": {"dimensions": [{"alias": "number_of_rows_in_the_matrix_1"}]}}
}, },
) )
data: CSRMatrixData = Field(..., description="""The non-zero values in the matrix.""") data: NDArray[Shape["* number_of_non_zero_values"], Any] = Field(
...,
description="""The non-zero values in the matrix.""",
class CSRMatrixData(ConfiguredBaseModel): json_schema_extra={
""" "linkml_meta": {"array": {"dimensions": [{"alias": "number_of_non_zero_values"}]}}
The non-zero values in the matrix. },
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "hdmf-common.sparse"})
name: Literal["data"] = Field(
"data",
json_schema_extra={"linkml_meta": {"equals_string": "data", "ifabsent": "string(data)"}},
) )
# Model rebuild # Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model # see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
CSRMatrix.model_rebuild() CSRMatrix.model_rebuild()
CSRMatrixData.model_rebuild()

View file

@ -974,12 +974,12 @@ class DynamicTableRegion(DynamicTableRegionMixin, VectorData):
) )
name: str = Field(...) name: str = Field(...)
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
description: str = Field( description: str = Field(
..., description="""Description of what this table region points to.""" ..., description="""Description of what this table region points to."""
) )
table: DynamicTable = Field(
..., description="""Reference to the DynamicTable object that this region applies to."""
)
value: Optional[ value: Optional[
Union[ Union[
NDArray[Shape["* dim0"], Any], NDArray[Shape["* dim0"], Any],

View file

@ -18,7 +18,7 @@ from ...hdmf_common.v1_3_0.hdmf_common_resources import (
ExternalResourcesObjects, ExternalResourcesObjects,
ExternalResourcesResources, ExternalResourcesResources,
) )
from ...hdmf_common.v1_3_0.hdmf_common_sparse import CSRMatrix, CSRMatrixData from ...hdmf_common.v1_3_0.hdmf_common_sparse import CSRMatrix
from ...hdmf_common.v1_3_0.hdmf_common_table import ( from ...hdmf_common.v1_3_0.hdmf_common_table import (
DynamicTable, DynamicTable,
DynamicTableRegion, DynamicTableRegion,

View file

@ -11,7 +11,7 @@ import numpy as np
from numpydantic import NDArray, Shape from numpydantic import NDArray, Shape
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator, model_validator from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator, model_validator
from ...hdmf_common.v1_4_0.hdmf_common_table import VectorData from ...hdmf_common.v1_5_0.hdmf_common_table import VectorData
metamodel_version = "None" metamodel_version = "None"
@ -136,7 +136,7 @@ linkml_meta = LinkMLMeta(
}, },
"default_prefix": "hdmf-experimental.experimental/", "default_prefix": "hdmf-experimental.experimental/",
"id": "hdmf-experimental.experimental", "id": "hdmf-experimental.experimental",
"imports": ["../../hdmf_common/v1_4_0/namespace", "hdmf-experimental.nwb.language"], "imports": ["../../hdmf_common/v1_5_0/namespace", "hdmf-experimental.nwb.language"],
"name": "hdmf-experimental.experimental", "name": "hdmf-experimental.experimental",
} }
) )

View file

@ -11,7 +11,7 @@ import numpy as np
from numpydantic import NDArray, Shape from numpydantic import NDArray, Shape
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator, model_validator from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator, model_validator
from ...hdmf_common.v1_4_0.hdmf_common_base import Container, Data from ...hdmf_common.v1_5_0.hdmf_common_base import Container, Data
metamodel_version = "None" metamodel_version = "None"
@ -136,7 +136,7 @@ linkml_meta = LinkMLMeta(
}, },
"default_prefix": "hdmf-experimental.resources/", "default_prefix": "hdmf-experimental.resources/",
"id": "hdmf-experimental.resources", "id": "hdmf-experimental.resources",
"imports": ["../../hdmf_common/v1_4_0/namespace", "hdmf-experimental.nwb.language"], "imports": ["../../hdmf_common/v1_5_0/namespace", "hdmf-experimental.nwb.language"],
"name": "hdmf-experimental.resources", "name": "hdmf-experimental.resources",
} }
) )

View file

@ -10,9 +10,10 @@ from typing import Any, ClassVar, Dict, List, Literal, Optional, Union
import numpy as np import numpy as np
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator, model_validator from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator, model_validator
from ...hdmf_common.v1_4_0.hdmf_common_base import Container, Data, SimpleMultiContainer from ...hdmf_common.v1_5_0.hdmf_common_base import Container, Data, SimpleMultiContainer
from ...hdmf_common.v1_4_0.hdmf_common_sparse import CSRMatrix from ...hdmf_common.v1_5_0.hdmf_common_sparse import CSRMatrix
from ...hdmf_common.v1_4_0.hdmf_common_table import ( from ...hdmf_common.v1_5_0.hdmf_common_table import (
AlignedDynamicTable,
DynamicTable, DynamicTable,
DynamicTableRegion, DynamicTableRegion,
ElementIdentifiers, ElementIdentifiers,

View file

@ -20,6 +20,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -32,6 +33,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
resolution: resolution:
@ -73,6 +75,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -84,6 +87,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -94,6 +98,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -118,15 +123,14 @@ classes:
external file. external file.
range: TimeSeries__data range: TimeSeries__data
required: true required: true
multivalued: false inlined: true
starting_time: starting_time:
name: starting_time name: starting_time
description: Timestamp of the first sample in seconds. When timestamps are description: Timestamp of the first sample in seconds. When timestamps are
uniformly spaced, the timestamp of the first sample can be specified and uniformly spaced, the timestamp of the first sample can be specified and
all subsequent ones calculated from the sampling rate attribute. all subsequent ones calculated from the sampling rate attribute.
range: TimeSeries__starting_time range: TimeSeries__starting_time
required: false inlined: true
multivalued: false
timestamps: timestamps:
name: timestamps name: timestamps
description: Timestamps for samples stored in data, in seconds, relative to description: Timestamps for samples stored in data, in seconds, relative to
@ -168,8 +172,8 @@ classes:
external to the NWB file, in files storing raw data. Once timestamp data external to the NWB file, in files storing raw data. Once timestamp data
is calculated, the contents of 'sync' are mostly for archival purposes. is calculated, the contents of 'sync' are mostly for archival purposes.
range: TimeSeries__sync range: TimeSeries__sync
required: false inlined: true
multivalued: false inlined_as_list: true
tree_root: true tree_root: true
TimeSeries__data: TimeSeries__data:
name: TimeSeries__data name: TimeSeries__data
@ -180,6 +184,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
@ -244,6 +249,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(starting_time) ifabsent: string(starting_time)
identifier: true
range: string range: string
required: true required: true
equals_string: starting_time equals_string: starting_time
@ -275,6 +281,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(sync) ifabsent: string(sync)
identifier: true
range: string range: string
required: true required: true
equals_string: sync equals_string: sync
@ -283,13 +290,24 @@ classes:
description: A collection of processed data. description: A collection of processed data.
is_a: NWBContainer is_a: NWBContainer
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true identifier: true
inlined_as_list: false range: string
any_of: required: true
- range: NWBDataInterface description:
- range: DynamicTable name: description
description: Description of this collection of processed data.
range: text
required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: NWBDataInterface
- range: DynamicTable
tree_root: true tree_root: true
Images: Images:
name: Images name: Images
@ -299,6 +317,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(Images) ifabsent: string(Images)
identifier: true
range: string range: string
required: true required: true
description: description:

View file

@ -29,6 +29,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -37,13 +38,11 @@ classes:
reference frame. reference frame.
range: SpatialSeries__data range: SpatialSeries__data
required: true required: true
multivalued: false inlined: true
reference_frame: reference_frame:
name: reference_frame name: reference_frame
description: Description defining what exactly 'straight-ahead' means. description: Description defining what exactly 'straight-ahead' means.
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
SpatialSeries__data: SpatialSeries__data:
name: SpatialSeries__data name: SpatialSeries__data
@ -53,9 +52,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. The default description: Base unit of measurement for working with the data. The default
@ -91,12 +114,19 @@ classes:
events. BehavioralTimeSeries is for continuous data. events. BehavioralTimeSeries is for continuous data.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralEpochs)
inlined_as_list: false identifier: true
any_of: range: string
- range: IntervalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: IntervalSeries
tree_root: true tree_root: true
BehavioralEvents: BehavioralEvents:
name: BehavioralEvents name: BehavioralEvents
@ -104,12 +134,19 @@ classes:
for more details. for more details.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralEvents)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
BehavioralTimeSeries: BehavioralTimeSeries:
name: BehavioralTimeSeries name: BehavioralTimeSeries
@ -117,36 +154,57 @@ classes:
of <a href="#BehavioralEpochs">BehavioralEpochs</a> for more details. of <a href="#BehavioralEpochs">BehavioralEpochs</a> for more details.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralTimeSeries)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
PupilTracking: PupilTracking:
name: PupilTracking name: PupilTracking
description: Eye-tracking data, representing pupil size. description: Eye-tracking data, representing pupil size.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(PupilTracking)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
EyeTracking: EyeTracking:
name: EyeTracking name: EyeTracking
description: Eye-tracking data, representing direction of gaze. description: Eye-tracking data, representing direction of gaze.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(EyeTracking)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true
CompassDirection: CompassDirection:
name: CompassDirection name: CompassDirection
@ -157,22 +215,36 @@ classes:
be radians or degrees. be radians or degrees.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(CompassDirection)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true
Position: Position:
name: Position name: Position
description: Position data, whether along the x, x/y or x/y/z axis. description: Position data, whether along the x, x/y or x/y/z axis.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(Position)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true

View file

@ -21,6 +21,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:

View file

@ -25,41 +25,9 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data:
name: data
description: Recorded voltage data.
range: numeric
required: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_channels
- array:
dimensions:
- alias: num_times
- alias: num_channels
- alias: num_samples
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: DynamicTableRegion pointer to the electrodes that this time series
was generated from.
range: DynamicTableRegion
required: true
multivalued: false
channel_conversion: channel_conversion:
name: channel_conversion name: channel_conversion
description: Channel-specific conversion factor. Multiply the data in the description: Channel-specific conversion factor. Multiply the data in the
@ -77,7 +45,87 @@ classes:
range: float32 range: float32
required: false required: false
multivalued: false multivalued: false
data:
name: data
description: Recorded voltage data.
range: ElectricalSeries__data
required: true
inlined: true
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: DynamicTableRegion pointer to the electrodes that this time series
was generated from.
range: DynamicTableRegion
required: true
inlined: true
tree_root: true tree_root: true
ElectricalSeries__data:
name: ElectricalSeries__data
description: Recorded voltage data.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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).
ifabsent: string(volts)
range: text
required: true
equals_string: volts
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_channels
- array:
dimensions:
- alias: num_times
- alias: num_channels
- alias: num_samples
SpikeEventSeries: SpikeEventSeries:
name: SpikeEventSeries name: SpikeEventSeries
description: 'Stores snapshots/snippets of recorded spike events (i.e., threshold description: 'Stores snapshots/snippets of recorded spike events (i.e., threshold
@ -92,24 +140,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Spike waveforms. description: Spike waveforms.
range: numeric range: SpikeEventSeries__data
required: true required: true
multivalued: false inlined: true
any_of:
- array:
dimensions:
- alias: num_events
- alias: num_samples
- array:
dimensions:
- alias: num_events
- alias: num_channels
- alias: num_samples
timestamps: timestamps:
name: timestamps name: timestamps
description: Timestamps for samples stored in data, in seconds, relative to description: Timestamps for samples stored in data, in seconds, relative to
@ -123,6 +162,60 @@ classes:
required: true required: true
multivalued: false multivalued: false
tree_root: true tree_root: true
SpikeEventSeries__data:
name: SpikeEventSeries__data
description: Spike waveforms.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: Unit of measurement for waveforms, which is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: true
equals_string: volts
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_events
- alias: num_samples
- array:
dimensions:
- alias: num_events
- alias: num_channels
- alias: num_samples
FeatureExtraction: FeatureExtraction:
name: FeatureExtraction name: FeatureExtraction
description: Features, such as PC1 and PC2, that are extracted from signals stored description: Features, such as PC1 and PC2, that are extracted from signals stored
@ -132,6 +225,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(FeatureExtraction) ifabsent: string(FeatureExtraction)
identifier: true
range: string range: string
required: true required: true
description: description:
@ -177,7 +271,7 @@ classes:
was generated from. was generated from.
range: DynamicTableRegion range: DynamicTableRegion
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
EventDetection: EventDetection:
name: EventDetection name: EventDetection
@ -187,6 +281,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(EventDetection) ifabsent: string(EventDetection)
identifier: true
range: string range: string
required: true required: true
detection_method: detection_method:
@ -195,7 +290,6 @@ classes:
or dV/dT threshold, as well as relevant values. or dV/dT threshold, as well as relevant values.
range: text range: text
required: true required: true
multivalued: false
source_idx: source_idx:
name: source_idx name: source_idx
description: Indices (zero-based) into source ElectricalSeries::data array description: Indices (zero-based) into source ElectricalSeries::data array
@ -224,7 +318,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ElectricalSeries - range: ElectricalSeries
- range: string - range: string
@ -236,12 +330,19 @@ classes:
during experiment acquisition. during experiment acquisition.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(EventWaveform)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpikeEventSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpikeEventSeries
tree_root: true tree_root: true
FilteredEphys: FilteredEphys:
name: FilteredEphys name: FilteredEphys
@ -258,12 +359,19 @@ classes:
the ElectricalSeries. the ElectricalSeries.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(FilteredEphys)
inlined_as_list: false identifier: true
any_of: range: string
- range: ElectricalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: ElectricalSeries
tree_root: true tree_root: true
LFP: LFP:
name: LFP name: LFP
@ -272,12 +380,19 @@ classes:
properties should be noted in the ElectricalSeries description or comments field. properties should be noted in the ElectricalSeries description or comments field.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(LFP)
inlined_as_list: false identifier: true
any_of: range: string
- range: ElectricalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: ElectricalSeries
tree_root: true tree_root: true
ElectrodeGroup: ElectrodeGroup:
name: ElectrodeGroup name: ElectrodeGroup
@ -286,6 +401,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -304,8 +420,7 @@ classes:
name: position name: position
description: stereotaxic or common framework coordinates description: stereotaxic or common framework coordinates
range: ElectrodeGroup__position range: ElectrodeGroup__position
required: false inlined: true
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -313,7 +428,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -325,6 +440,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(position) ifabsent: string(position)
identifier: true
range: string range: string
required: true required: true
equals_string: position equals_string: position
@ -334,24 +450,18 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
y: y:
name: y name: y
description: y coordinate description: y coordinate
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
z: z:
name: z name: z
description: z coordinate description: z coordinate
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
ClusterWaveforms: ClusterWaveforms:
name: ClusterWaveforms name: ClusterWaveforms
description: DEPRECATED The mean waveform shape, including standard deviation, description: DEPRECATED The mean waveform shape, including standard deviation,
@ -365,6 +475,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(ClusterWaveforms) ifabsent: string(ClusterWaveforms)
identifier: true
range: string range: string
required: true required: true
waveform_filtering: waveform_filtering:
@ -372,7 +483,6 @@ classes:
description: Filtering applied to data before generating mean/sd description: Filtering applied to data before generating mean/sd
range: text range: text
required: true required: true
multivalued: false
waveform_mean: waveform_mean:
name: waveform_mean name: waveform_mean
description: The mean waveform for each cluster, using the same indices for description: The mean waveform for each cluster, using the same indices for
@ -404,7 +514,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Clustering - range: Clustering
- range: string - range: string
@ -418,6 +528,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(Clustering) ifabsent: string(Clustering)
identifier: true
range: string range: string
required: true required: true
description: description:
@ -426,7 +537,6 @@ classes:
clusters curated using Klusters, etc) clusters curated using Klusters, etc)
range: text range: text
required: true required: true
multivalued: false
num: num:
name: num name: num
description: Cluster number of each event description: Cluster number of each event

View file

@ -22,6 +22,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
start_time: start_time:
@ -62,14 +63,12 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Index for tags. description: Index for tags.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false
timeseries: timeseries:
name: timeseries name: timeseries
description: An index into a TimeSeries object. description: An index into a TimeSeries object.
range: TimeIntervals__timeseries range: TimeIntervals__timeseries
required: false inlined: true
multivalued: false
timeseries_index: timeseries_index:
name: timeseries_index name: timeseries_index
annotations: annotations:
@ -81,8 +80,7 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Index for timeseries. description: Index for timeseries.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false
tree_root: true tree_root: true
TimeIntervals__timeseries: TimeIntervals__timeseries:
name: TimeIntervals__timeseries name: TimeIntervals__timeseries
@ -92,6 +90,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(timeseries) ifabsent: string(timeseries)
identifier: true
range: string range: string
required: true required: true
equals_string: timeseries equals_string: timeseries
@ -103,8 +102,6 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: int32 range: int32
required: false
multivalued: false
count: count:
name: count name: count
description: Number of data samples available in this time series, during description: Number of data samples available in this time series, during
@ -112,13 +109,10 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: int32 range: int32
required: false
multivalued: false
timeseries: timeseries:
name: timeseries name: timeseries
description: the TimeSeries that this index applies to. description: the TimeSeries that this index applies to.
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: TimeSeries range: TimeSeries
required: false inlined: true
multivalued: false

View file

@ -30,6 +30,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(root) ifabsent: string(root)
identifier: true
range: string range: string
required: true required: true
equals_string: root equals_string: root
@ -64,13 +65,11 @@ classes:
other files. other files.
range: text range: text
required: true required: true
multivalued: false
session_description: session_description:
name: session_description name: session_description
description: A description of the experimental session and data in the file. description: A description of the experimental session and data in the file.
range: text range: text
required: true required: true
multivalued: false
session_start_time: session_start_time:
name: session_start_time name: session_start_time
description: 'Date and time of the experiment/session start. The date is stored description: 'Date and time of the experiment/session start. The date is stored
@ -79,7 +78,6 @@ classes:
offset. Date accuracy is up to milliseconds.' offset. Date accuracy is up to milliseconds.'
range: isodatetime range: isodatetime
required: true required: true
multivalued: false
timestamps_reference_time: timestamps_reference_time:
name: timestamps_reference_time name: timestamps_reference_time
description: 'Date and time corresponding to time zero of all timestamps. description: 'Date and time corresponding to time zero of all timestamps.
@ -89,7 +87,6 @@ classes:
times stored in the file use this time as reference (i.e., time zero).' times stored in the file use this time as reference (i.e., time zero).'
range: isodatetime range: isodatetime
required: true required: true
multivalued: false
acquisition: acquisition:
name: acquisition name: acquisition
description: Data streams recorded from the system, including ephys, ophys, description: Data streams recorded from the system, including ephys, ophys,
@ -168,7 +165,8 @@ classes:
can exist in the present file or can be linked to a remote library file. can exist in the present file or can be linked to a remote library file.
range: NWBFile__stimulus range: NWBFile__stimulus
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
general: general:
name: general name: general
description: Experimental metadata, including protocol, notes and description description: Experimental metadata, including protocol, notes and description
@ -188,7 +186,8 @@ classes:
should not be created unless there is data to store within them. should not be created unless there is data to store within them.
range: NWBFile__general range: NWBFile__general
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
intervals: intervals:
name: intervals name: intervals
description: Experimental intervals, whether that be logically distinct sub-experiments description: Experimental intervals, whether that be logically distinct sub-experiments
@ -196,14 +195,18 @@ classes:
an experiment, or epochs (see epochs subgroup) deriving from analysis of an experiment, or epochs (see epochs subgroup) deriving from analysis of
data. data.
range: NWBFile__intervals range: NWBFile__intervals
required: false inlined: true
multivalued: false inlined_as_list: true
units: units:
name: units name: units
description: Data about sorted spike units. description: Data about sorted spike units.
range: Units range: Units
required: false inlined: true
multivalued: false inlined_as_list: false
specifications:
name: specifications
description: Nested dictionary of schema specifications
range: dict
tree_root: true tree_root: true
NWBFile__stimulus: NWBFile__stimulus:
name: NWBFile__stimulus name: NWBFile__stimulus
@ -223,6 +226,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(stimulus) ifabsent: string(stimulus)
identifier: true
range: string range: string
required: true required: true
equals_string: stimulus equals_string: stimulus
@ -265,6 +269,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(general) ifabsent: string(general)
identifier: true
range: string range: string
required: true required: true
equals_string: general equals_string: general
@ -272,14 +277,10 @@ classes:
name: data_collection name: data_collection
description: Notes about data collection and analysis. description: Notes about data collection and analysis.
range: text range: text
required: false
multivalued: false
experiment_description: experiment_description:
name: experiment_description name: experiment_description
description: General description of the experiment. description: General description of the experiment.
range: text range: text
required: false
multivalued: false
experimenter: experimenter:
name: experimenter name: experimenter
description: Name of person(s) who performed the experiment. Can also specify description: Name of person(s) who performed the experiment. Can also specify
@ -294,8 +295,6 @@ classes:
name: institution name: institution
description: Institution(s) where experiment was performed. description: Institution(s) where experiment was performed.
range: text range: text
required: false
multivalued: false
keywords: keywords:
name: keywords name: keywords
description: Terms to search over. description: Terms to search over.
@ -309,28 +308,20 @@ classes:
name: lab name: lab
description: Laboratory where experiment was performed. description: Laboratory where experiment was performed.
range: text range: text
required: false
multivalued: false
notes: notes:
name: notes name: notes
description: Notes about the experiment. description: Notes about the experiment.
range: text range: text
required: false
multivalued: false
pharmacology: pharmacology:
name: pharmacology name: pharmacology
description: Description of drugs used, including how and when they were administered. description: Description of drugs used, including how and when they were administered.
Anesthesia(s), painkiller(s), etc., plus dosage, concentration, etc. Anesthesia(s), painkiller(s), etc., plus dosage, concentration, etc.
range: text range: text
required: false
multivalued: false
protocol: protocol:
name: protocol name: protocol
description: Experimental protocol, if applicable. e.g., include IACUC protocol description: Experimental protocol, if applicable. e.g., include IACUC protocol
number. number.
range: text range: text
required: false
multivalued: false
related_publications: related_publications:
name: related_publications name: related_publications
description: Publication information. PMID, DOI, URL, etc. description: Publication information. PMID, DOI, URL, etc.
@ -344,49 +335,39 @@ classes:
name: session_id name: session_id
description: Lab-specific ID for the session. description: Lab-specific ID for the session.
range: text range: text
required: false
multivalued: false
slices: slices:
name: slices name: slices
description: Description of slices, including information about preparation description: Description of slices, including information about preparation
thickness, orientation, temperature, and bath solution. thickness, orientation, temperature, and bath solution.
range: text range: text
required: false
multivalued: false
source_script: source_script:
name: source_script name: source_script
description: Script file or link to public source code used to create this description: Script file or link to public source code used to create this
NWB file. NWB file.
range: general__source_script range: general__source_script
required: false inlined: true
multivalued: false
stimulus: stimulus:
name: stimulus name: stimulus
description: Notes about stimuli, such as how and where they were presented. description: Notes about stimuli, such as how and where they were presented.
range: text range: text
required: false
multivalued: false
surgery: surgery:
name: surgery name: surgery
description: Narrative description about surgery/surgeries, including date(s) description: Narrative description about surgery/surgeries, including date(s)
and who performed surgery. and who performed surgery.
range: text range: text
required: false
multivalued: false
virus: virus:
name: virus name: virus
description: Information about virus(es) used in experiments, including virus description: Information about virus(es) used in experiments, including virus
ID, source, date made, injection location, volume, etc. ID, source, date made, injection location, volume, etc.
range: text range: text
required: false
multivalued: false
nwb_container: nwb_container:
name: nwb_container name: nwb_container
description: Place-holder than can be extended so that lab-specific meta-data description: Place-holder than can be extended so that lab-specific meta-data
can be placed in /general. can be placed in /general.
range: NWBContainer range: NWBContainer
required: false
multivalued: true multivalued: true
inlined: true
inlined_as_list: false
devices: devices:
name: devices name: devices
description: Description of hardware devices used during experiment, e.g., description: Description of hardware devices used during experiment, e.g.,
@ -401,20 +382,20 @@ classes:
description: Information about the animal or person from which the data was description: Information about the animal or person from which the data was
measured. measured.
range: Subject range: Subject
required: false inlined: true
multivalued: false inlined_as_list: true
extracellular_ephys: extracellular_ephys:
name: extracellular_ephys name: extracellular_ephys
description: Metadata related to extracellular electrophysiology. description: Metadata related to extracellular electrophysiology.
range: general__extracellular_ephys range: general__extracellular_ephys
required: false inlined: true
multivalued: false inlined_as_list: true
intracellular_ephys: intracellular_ephys:
name: intracellular_ephys name: intracellular_ephys
description: Metadata related to intracellular electrophysiology. description: Metadata related to intracellular electrophysiology.
range: general__intracellular_ephys range: general__intracellular_ephys
required: false inlined: true
multivalued: false inlined_as_list: true
optogenetics: optogenetics:
name: optogenetics name: optogenetics
description: Metadata describing optogenetic stimuluation. description: Metadata describing optogenetic stimuluation.
@ -439,6 +420,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(source_script) ifabsent: string(source_script)
identifier: true
range: string range: string
required: true required: true
equals_string: source_script equals_string: source_script
@ -459,6 +441,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(subject) ifabsent: string(subject)
identifier: true
range: string range: string
required: true required: true
equals_string: subject equals_string: subject
@ -466,52 +449,36 @@ classes:
name: age name: age
description: Age of subject. Can be supplied instead of 'date_of_birth'. description: Age of subject. Can be supplied instead of 'date_of_birth'.
range: text range: text
required: false
multivalued: false
date_of_birth: date_of_birth:
name: date_of_birth name: date_of_birth
description: Date of birth of subject. Can be supplied instead of 'age'. description: Date of birth of subject. Can be supplied instead of 'age'.
range: isodatetime range: isodatetime
required: false
multivalued: false
description: description:
name: description name: description
description: Description of subject and where subject came from (e.g., breeder, description: Description of subject and where subject came from (e.g., breeder,
if animal). if animal).
range: text range: text
required: false
multivalued: false
genotype: genotype:
name: genotype name: genotype
description: Genetic strain. If absent, assume Wild Type (WT). description: Genetic strain. If absent, assume Wild Type (WT).
range: text range: text
required: false
multivalued: false
sex: sex:
name: sex name: sex
description: Gender of subject. description: Gender of subject.
range: text range: text
required: false
multivalued: false
species: species:
name: species name: species
description: Species of subject. description: Species of subject.
range: text range: text
required: false
multivalued: false
subject_id: subject_id:
name: subject_id name: subject_id
description: ID of animal/person used/participating in experiment (lab convention). description: ID of animal/person used/participating in experiment (lab convention).
range: text range: text
required: false
multivalued: false
weight: weight:
name: weight name: weight
description: Weight at time of experiment, at time of surgery and at other description: Weight at time of experiment, at time of surgery and at other
important times. important times.
range: text range: text
required: false
multivalued: false
general__extracellular_ephys: general__extracellular_ephys:
name: general__extracellular_ephys name: general__extracellular_ephys
description: Metadata related to extracellular electrophysiology. description: Metadata related to extracellular electrophysiology.
@ -519,21 +486,23 @@ classes:
name: name:
name: name name: name
ifabsent: string(extracellular_ephys) ifabsent: string(extracellular_ephys)
identifier: true
range: string range: string
required: true required: true
equals_string: extracellular_ephys equals_string: extracellular_ephys
electrode_group:
name: electrode_group
description: Physical group of electrodes.
range: ElectrodeGroup
required: false
multivalued: true
electrodes: electrodes:
name: electrodes name: electrodes
description: A table of all electrodes (i.e. channels) used for recording. description: A table of all electrodes (i.e. channels) used for recording.
range: extracellular_ephys__electrodes range: extracellular_ephys__electrodes
required: false inlined: true
multivalued: false inlined_as_list: true
value:
name: value
description: Physical group of electrodes.
range: ElectrodeGroup
multivalued: true
inlined: true
inlined_as_list: false
extracellular_ephys__electrodes: extracellular_ephys__electrodes:
name: extracellular_ephys__electrodes name: extracellular_ephys__electrodes
description: A table of all electrodes (i.e. channels) used for recording. description: A table of all electrodes (i.e. channels) used for recording.
@ -542,6 +511,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(electrodes) ifabsent: string(electrodes)
identifier: true
range: string range: string
required: true required: true
equals_string: electrodes equals_string: electrodes
@ -604,9 +574,13 @@ classes:
group: group:
name: group name: group
description: Reference to the ElectrodeGroup this electrode is a part of. description: Reference to the ElectrodeGroup this electrode is a part of.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: ElectrodeGroup range: ElectrodeGroup
required: true required: true
multivalued: true multivalued: false
inlined: true
group_name: group_name:
name: group_name name: group_name
description: Name of the ElectrodeGroup this electrode is a part of. description: Name of the ElectrodeGroup this electrode is a part of.
@ -659,6 +633,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(intracellular_ephys) ifabsent: string(intracellular_ephys)
identifier: true
range: string range: string
required: true required: true
equals_string: intracellular_ephys equals_string: intracellular_ephys
@ -668,20 +643,19 @@ classes:
frequency fall-off, etc. If this changes between TimeSeries, filter description frequency fall-off, etc. If this changes between TimeSeries, filter description
should be stored as a text attribute for each TimeSeries. should be stored as a text attribute for each TimeSeries.
range: text range: text
required: false
multivalued: false
intracellular_electrode:
name: intracellular_electrode
description: An intracellular electrode.
range: IntracellularElectrode
required: false
multivalued: true
sweep_table: sweep_table:
name: sweep_table name: sweep_table
description: The table which groups different PatchClampSeries together. description: The table which groups different PatchClampSeries together.
range: SweepTable range: SweepTable
required: false inlined: true
multivalued: false inlined_as_list: false
value:
name: value
description: An intracellular electrode.
range: IntracellularElectrode
multivalued: true
inlined: true
inlined_as_list: false
NWBFile__intervals: NWBFile__intervals:
name: NWBFile__intervals name: NWBFile__intervals
description: Experimental intervals, whether that be logically distinct sub-experiments description: Experimental intervals, whether that be logically distinct sub-experiments
@ -691,6 +665,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(intervals) ifabsent: string(intervals)
identifier: true
range: string range: string
required: true required: true
equals_string: intervals equals_string: intervals
@ -699,24 +674,25 @@ classes:
description: Divisions in time marking experimental stages or sub-divisions description: Divisions in time marking experimental stages or sub-divisions
of a single recording session. of a single recording session.
range: TimeIntervals range: TimeIntervals
required: false inlined: true
multivalued: false inlined_as_list: false
trials: trials:
name: trials name: trials
description: Repeated experimental events that have a logical grouping. description: Repeated experimental events that have a logical grouping.
range: TimeIntervals range: TimeIntervals
required: false inlined: true
multivalued: false inlined_as_list: false
invalid_times: invalid_times:
name: invalid_times name: invalid_times
description: Time intervals that should be removed from analysis. description: Time intervals that should be removed from analysis.
range: TimeIntervals range: TimeIntervals
required: false inlined: true
multivalued: false inlined_as_list: false
time_intervals: value:
name: time_intervals name: value
description: Optional additional table(s) for describing other experimental description: Optional additional table(s) for describing other experimental
time intervals. time intervals.
range: TimeIntervals range: TimeIntervals
required: false
multivalued: true multivalued: true
inlined: true
inlined_as_list: false

View file

@ -23,6 +23,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
stimulus_description: stimulus_description:
@ -40,14 +41,12 @@ classes:
description: Recorded voltage or current. description: Recorded voltage or current.
range: PatchClampSeries__data range: PatchClampSeries__data
required: true required: true
multivalued: false inlined: true
gain: gain:
name: gain name: gain
description: Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt description: Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt
(c-clamp). (c-clamp).
range: float32 range: float32
required: false
multivalued: false
electrode: electrode:
name: electrode name: electrode
annotations: annotations:
@ -55,7 +54,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: IntracellularElectrode - range: IntracellularElectrode
- range: string - range: string
@ -67,9 +66,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. Actual stored description: Base unit of measurement for working with the data. Actual stored
@ -92,32 +115,27 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
bias_current:
name: bias_current
description: Bias current, in amps.
range: float32
bridge_balance:
name: bridge_balance
description: Bridge balance, in ohms.
range: float32
capacitance_compensation:
name: capacitance_compensation
description: Capacitance compensation, in farads.
range: float32
data: data:
name: data name: data
description: Recorded voltage. description: Recorded voltage.
range: CurrentClampSeries__data range: CurrentClampSeries__data
required: true required: true
multivalued: false inlined: true
bias_current:
name: bias_current
description: Bias current, in amps.
range: float32
required: false
multivalued: false
bridge_balance:
name: bridge_balance
description: Bridge balance, in ohms.
range: float32
required: false
multivalued: false
capacitance_compensation:
name: capacitance_compensation
description: Capacitance compensation, in farads.
range: float32
required: false
multivalued: false
tree_root: true tree_root: true
CurrentClampSeries__data: CurrentClampSeries__data:
name: CurrentClampSeries__data name: CurrentClampSeries__data
@ -126,9 +144,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. which is description: Base unit of measurement for working with the data. which is
@ -140,8 +182,10 @@ classes:
equals_string: volts equals_string: volts
value: value:
name: value name: value
range: AnyType array:
required: true dimensions:
- alias: num_times
range: numeric
IZeroClampSeries: IZeroClampSeries:
name: IZeroClampSeries name: IZeroClampSeries
description: Voltage data from an intracellular recording when all current and description: Voltage data from an intracellular recording when all current and
@ -152,6 +196,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
bias_current: bias_current:
@ -159,19 +204,16 @@ classes:
description: Bias current, in amps, fixed to 0.0. description: Bias current, in amps, fixed to 0.0.
range: float32 range: float32
required: true required: true
multivalued: false
bridge_balance: bridge_balance:
name: bridge_balance name: bridge_balance
description: Bridge balance, in ohms, fixed to 0.0. description: Bridge balance, in ohms, fixed to 0.0.
range: float32 range: float32
required: true required: true
multivalued: false
capacitance_compensation: capacitance_compensation:
name: capacitance_compensation name: capacitance_compensation
description: Capacitance compensation, in farads, fixed to 0.0. description: Capacitance compensation, in farads, fixed to 0.0.
range: float32 range: float32
required: true required: true
multivalued: false
tree_root: true tree_root: true
CurrentClampStimulusSeries: CurrentClampStimulusSeries:
name: CurrentClampStimulusSeries name: CurrentClampStimulusSeries
@ -180,6 +222,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -187,7 +230,7 @@ classes:
description: Stimulus current applied. description: Stimulus current applied.
range: CurrentClampStimulusSeries__data range: CurrentClampStimulusSeries__data
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
CurrentClampStimulusSeries__data: CurrentClampStimulusSeries__data:
name: CurrentClampStimulusSeries__data name: CurrentClampStimulusSeries__data
@ -196,9 +239,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. which is description: Base unit of measurement for working with the data. which is
@ -210,8 +277,10 @@ classes:
equals_string: amperes equals_string: amperes
value: value:
name: value name: value
range: AnyType array:
required: true dimensions:
- alias: num_times
range: numeric
VoltageClampSeries: VoltageClampSeries:
name: VoltageClampSeries name: VoltageClampSeries
description: Current data from an intracellular voltage-clamp recording. A corresponding description: Current data from an intracellular voltage-clamp recording. A corresponding
@ -221,80 +290,51 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
capacitance_fast:
name: capacitance_fast
description: Fast capacitance, in farads.
range: VoltageClampSeries__capacitance_fast
inlined: true
capacitance_slow:
name: capacitance_slow
description: Slow capacitance, in farads.
range: VoltageClampSeries__capacitance_slow
inlined: true
data: data:
name: data name: data
description: Recorded current. description: Recorded current.
range: VoltageClampSeries__data range: VoltageClampSeries__data
required: true required: true
multivalued: false inlined: true
capacitance_fast:
name: capacitance_fast
description: Fast capacitance, in farads.
range: VoltageClampSeries__capacitance_fast
required: false
multivalued: false
capacitance_slow:
name: capacitance_slow
description: Slow capacitance, in farads.
range: VoltageClampSeries__capacitance_slow
required: false
multivalued: false
resistance_comp_bandwidth: resistance_comp_bandwidth:
name: resistance_comp_bandwidth name: resistance_comp_bandwidth
description: Resistance compensation bandwidth, in hertz. description: Resistance compensation bandwidth, in hertz.
range: VoltageClampSeries__resistance_comp_bandwidth range: VoltageClampSeries__resistance_comp_bandwidth
required: false inlined: true
multivalued: false
resistance_comp_correction: resistance_comp_correction:
name: resistance_comp_correction name: resistance_comp_correction
description: Resistance compensation correction, in percent. description: Resistance compensation correction, in percent.
range: VoltageClampSeries__resistance_comp_correction range: VoltageClampSeries__resistance_comp_correction
required: false inlined: true
multivalued: false
resistance_comp_prediction: resistance_comp_prediction:
name: resistance_comp_prediction name: resistance_comp_prediction
description: Resistance compensation prediction, in percent. description: Resistance compensation prediction, in percent.
range: VoltageClampSeries__resistance_comp_prediction range: VoltageClampSeries__resistance_comp_prediction
required: false inlined: true
multivalued: false
whole_cell_capacitance_comp: whole_cell_capacitance_comp:
name: whole_cell_capacitance_comp name: whole_cell_capacitance_comp
description: Whole cell capacitance compensation, in farads. description: Whole cell capacitance compensation, in farads.
range: VoltageClampSeries__whole_cell_capacitance_comp range: VoltageClampSeries__whole_cell_capacitance_comp
required: false inlined: true
multivalued: false
whole_cell_series_resistance_comp: whole_cell_series_resistance_comp:
name: whole_cell_series_resistance_comp name: whole_cell_series_resistance_comp
description: Whole cell series resistance compensation, in ohms. description: Whole cell series resistance compensation, in ohms.
range: VoltageClampSeries__whole_cell_series_resistance_comp range: VoltageClampSeries__whole_cell_series_resistance_comp
required: false inlined: true
multivalued: false
tree_root: true tree_root: true
VoltageClampSeries__data:
name: VoltageClampSeries__data
description: Recorded current.
attributes:
name:
name: name
ifabsent: string(data)
range: string
required: true
equals_string: data
unit:
name: unit
description: 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'.
ifabsent: string(amperes)
range: text
required: true
equals_string: amperes
value:
name: value
range: AnyType
required: true
VoltageClampSeries__capacitance_fast: VoltageClampSeries__capacitance_fast:
name: VoltageClampSeries__capacitance_fast name: VoltageClampSeries__capacitance_fast
description: Fast capacitance, in farads. description: Fast capacitance, in farads.
@ -302,6 +342,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(capacitance_fast) ifabsent: string(capacitance_fast)
identifier: true
range: string range: string
required: true required: true
equals_string: capacitance_fast equals_string: capacitance_fast
@ -323,6 +364,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(capacitance_slow) ifabsent: string(capacitance_slow)
identifier: true
range: string range: string
required: true required: true
equals_string: capacitance_slow equals_string: capacitance_slow
@ -337,6 +379,55 @@ classes:
name: value name: value
range: float32 range: float32
required: true required: true
VoltageClampSeries__data:
name: VoltageClampSeries__data
description: Recorded current.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
ifabsent: string(amperes)
range: text
required: true
equals_string: amperes
value:
name: value
array:
dimensions:
- alias: num_times
range: numeric
VoltageClampSeries__resistance_comp_bandwidth: VoltageClampSeries__resistance_comp_bandwidth:
name: VoltageClampSeries__resistance_comp_bandwidth name: VoltageClampSeries__resistance_comp_bandwidth
description: Resistance compensation bandwidth, in hertz. description: Resistance compensation bandwidth, in hertz.
@ -344,6 +435,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(resistance_comp_bandwidth) ifabsent: string(resistance_comp_bandwidth)
identifier: true
range: string range: string
required: true required: true
equals_string: resistance_comp_bandwidth equals_string: resistance_comp_bandwidth
@ -366,6 +458,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(resistance_comp_correction) ifabsent: string(resistance_comp_correction)
identifier: true
range: string range: string
required: true required: true
equals_string: resistance_comp_correction equals_string: resistance_comp_correction
@ -388,6 +481,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(resistance_comp_prediction) ifabsent: string(resistance_comp_prediction)
identifier: true
range: string range: string
required: true required: true
equals_string: resistance_comp_prediction equals_string: resistance_comp_prediction
@ -410,6 +504,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(whole_cell_capacitance_comp) ifabsent: string(whole_cell_capacitance_comp)
identifier: true
range: string range: string
required: true required: true
equals_string: whole_cell_capacitance_comp equals_string: whole_cell_capacitance_comp
@ -432,6 +527,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(whole_cell_series_resistance_comp) ifabsent: string(whole_cell_series_resistance_comp)
identifier: true
range: string range: string
required: true required: true
equals_string: whole_cell_series_resistance_comp equals_string: whole_cell_series_resistance_comp
@ -454,6 +550,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -461,7 +558,7 @@ classes:
description: Stimulus voltage applied. description: Stimulus voltage applied.
range: VoltageClampStimulusSeries__data range: VoltageClampStimulusSeries__data
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
VoltageClampStimulusSeries__data: VoltageClampStimulusSeries__data:
name: VoltageClampStimulusSeries__data name: VoltageClampStimulusSeries__data
@ -470,9 +567,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. which is description: Base unit of measurement for working with the data. which is
@ -484,8 +605,10 @@ classes:
equals_string: volts equals_string: volts
value: value:
name: value name: value
range: AnyType array:
required: true dimensions:
- alias: num_times
range: numeric
IntracellularElectrode: IntracellularElectrode:
name: IntracellularElectrode name: IntracellularElectrode
description: An intracellular electrode and its metadata. description: An intracellular electrode and its metadata.
@ -493,6 +616,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -500,45 +624,32 @@ classes:
description: Description of electrode (e.g., whole-cell, sharp, etc.). description: Description of electrode (e.g., whole-cell, sharp, etc.).
range: text range: text
required: true required: true
multivalued: false
filtering: filtering:
name: filtering name: filtering
description: Electrode specific filtering. description: Electrode specific filtering.
range: text range: text
required: false
multivalued: false
initial_access_resistance: initial_access_resistance:
name: initial_access_resistance name: initial_access_resistance
description: Initial access resistance. description: Initial access resistance.
range: text range: text
required: false
multivalued: false
location: location:
name: location name: location
description: Location of the electrode. Specify the area, layer, comments description: Location of the electrode. Specify the area, layer, comments
on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use
standard atlas names for anatomical regions when possible. standard atlas names for anatomical regions when possible.
range: text range: text
required: false
multivalued: false
resistance: resistance:
name: resistance name: resistance
description: Electrode resistance, in ohms. description: Electrode resistance, in ohms.
range: text range: text
required: false
multivalued: false
seal: seal:
name: seal name: seal
description: Information about seal used for recording. description: Information about seal used for recording.
range: text range: text
required: false
multivalued: false
slice: slice:
name: slice name: slice
description: Information about slice used for recording. description: Information about slice used for recording.
range: text range: text
required: false
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -546,7 +657,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -558,23 +669,19 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
sweep_number:
name: sweep_number
description: Sweep number of the PatchClampSeries in that row.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: uint32
required: true
multivalued: false
series: series:
name: series name: series
description: The PatchClampSeries with the sweep number in that row. description: The PatchClampSeries with the sweep number in that row.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: PatchClampSeries range: PatchClampSeries
required: true required: true
multivalued: true multivalued: false
inlined: true
series_index: series_index:
name: series_index name: series_index
annotations: annotations:
@ -587,5 +694,14 @@ classes:
description: Index for series. description: Index for series.
range: VectorIndex range: VectorIndex
required: true required: true
inlined: true
sweep_number:
name: sweep_number
description: Sweep number of the PatchClampSeries in that row.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: uint32
required: true
multivalued: false multivalued: false
tree_root: true tree_root: true

View file

@ -20,6 +20,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
value: value:
@ -37,6 +38,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
value: value:
@ -56,6 +58,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
value: value:
@ -80,26 +83,14 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Binary data representing images across frames. description: Binary data representing images across frames.
range: numeric range: ImageSeries__data
required: false inlined: true
multivalued: false
any_of:
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- alias: z
dimension: dimension:
name: dimension name: dimension
description: Number of pixels on x, y, (and z) axes. description: Number of pixels on x, y, (and z) axes.
@ -117,18 +108,72 @@ classes:
used if the image is stored in another NWB file and that file is linked used if the image is stored in another NWB file and that file is linked
to this file. to this file.
range: ImageSeries__external_file range: ImageSeries__external_file
required: false inlined: true
multivalued: false
format: format:
name: format name: format
description: Format of image. If this is 'external', then the attribute 'external_file' description: 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 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 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. this attribute is not present, then the default format='raw' case is assumed.
ifabsent: string(raw)
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
ImageSeries__data:
name: ImageSeries__data
description: Binary data representing images across frames.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
range: text
required: true
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- alias: z
ImageSeries__external_file: ImageSeries__external_file:
name: ImageSeries__external_file name: ImageSeries__external_file
description: Paths to one or more external file(s). The field is only present description: Paths to one or more external file(s). The field is only present
@ -139,6 +184,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(external_file) ifabsent: string(external_file)
identifier: true
range: string range: string
required: true required: true
equals_string: external_file equals_string: external_file
@ -176,6 +222,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
masked_imageseries: masked_imageseries:
@ -185,7 +232,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ImageSeries - range: ImageSeries
- range: string - range: string
@ -201,14 +248,13 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
distance: distance:
name: distance name: distance
description: Distance from camera/monitor to target/eye. description: Distance from camera/monitor to target/eye.
range: float32 range: float32
required: false
multivalued: false
field_of_view: field_of_view:
name: field_of_view name: field_of_view
description: Width, height and depth of image, or imaged area, in meters. description: Width, height and depth of image, or imaged area, in meters.
@ -229,8 +275,6 @@ classes:
description: Description of image relative to some reference frame (e.g., description: Description of image relative to some reference frame (e.g.,
which way is up). Must also specify frame of reference. which way is up). Must also specify frame of reference.
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
IndexSeries: IndexSeries:
name: IndexSeries name: IndexSeries
@ -244,17 +288,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Index of the frame in the referenced ImageSeries. description: Index of the frame in the referenced ImageSeries.
array: range: IndexSeries__data
dimensions:
- alias: num_times
range: int32
required: true required: true
multivalued: false inlined: true
indexed_timeseries: indexed_timeseries:
name: indexed_timeseries name: indexed_timeseries
annotations: annotations:
@ -262,8 +304,55 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ImageSeries - range: ImageSeries
- range: string - range: string
tree_root: true tree_root: true
IndexSeries__data:
name: IndexSeries__data
description: Index of the frame in the referenced ImageSeries.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
range: text
required: true
value:
name: value
array:
dimensions:
- alias: num_times
range: int32

View file

@ -66,6 +66,7 @@ types:
numeric: numeric:
name: numeric name: numeric
typeof: float typeof: float
repr: float | int
text: text:
name: text name: text
typeof: string typeof: string
@ -87,6 +88,9 @@ types:
isodatetime: isodatetime:
name: isodatetime name: isodatetime
typeof: datetime typeof: datetime
dict:
name: dict
repr: dict
classes: classes:
AnyType: AnyType:
name: AnyType name: AnyType

View file

@ -30,6 +30,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -37,7 +38,7 @@ classes:
description: Values of each feature at each time. description: Values of each feature at each time.
range: AbstractFeatureSeries__data range: AbstractFeatureSeries__data
required: true required: true
multivalued: false inlined: true
feature_units: feature_units:
name: feature_units name: feature_units
description: Units of each feature. description: Units of each feature.
@ -64,9 +65,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Since there can be different units for different features, store description: Since there can be different units for different features, store
@ -96,18 +121,63 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Annotations made during an experiment. description: Annotations made during an experiment.
range: AnnotationSeries__data
required: true
inlined: true
tree_root: true
AnnotationSeries__data:
name: AnnotationSeries__data
description: Annotations made during an experiment.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: Smallest meaningful difference between values in data. Annotations
have no units, so the value is fixed to -1.0.
ifabsent: float(-1.0)
range: float32
required: true
equals_number: -1
unit:
name: unit
description: Base unit of measurement for working with the data. Annotations
have no units, so the value is fixed to 'n/a'.
ifabsent: string(n/a)
range: text
required: true
equals_string: n/a
value:
name: value
array: array:
dimensions: dimensions:
- alias: num_times - alias: num_times
range: text range: text
required: true
multivalued: false
tree_root: true
IntervalSeries: IntervalSeries:
name: IntervalSeries name: IntervalSeries
description: Stores intervals of data. The timestamps field stores the beginning description: Stores intervals of data. The timestamps field stores the beginning
@ -121,18 +191,63 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Use values >0 if interval started, <0 if interval ended. description: Use values >0 if interval started, <0 if interval ended.
range: IntervalSeries__data
required: true
inlined: true
tree_root: true
IntervalSeries__data:
name: IntervalSeries__data
description: Use values >0 if interval started, <0 if interval ended.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: Smallest meaningful difference between values in data. Annotations
have no units, so the value is fixed to -1.0.
ifabsent: float(-1.0)
range: float32
required: true
equals_number: -1
unit:
name: unit
description: Base unit of measurement for working with the data. Annotations
have no units, so the value is fixed to 'n/a'.
ifabsent: string(n/a)
range: text
required: true
equals_string: n/a
value:
name: value
array: array:
dimensions: dimensions:
- alias: num_times - alias: num_times
range: int8 range: int8
required: true
multivalued: false
tree_root: true
DecompositionSeries: DecompositionSeries:
name: DecompositionSeries name: DecompositionSeries
description: Spectral analysis of a time series, e.g. of an LFP or a speech signal. description: Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -140,6 +255,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -147,28 +263,27 @@ classes:
description: Data decomposed into frequency bands. description: Data decomposed into frequency bands.
range: DecompositionSeries__data range: DecompositionSeries__data
required: true required: true
multivalued: false inlined: true
metric: metric:
name: metric name: metric
description: The metric used, e.g. phase, amplitude, power. description: The metric used, e.g. phase, amplitude, power.
range: text range: text
required: true required: true
multivalued: false
bands: bands:
name: bands name: bands
description: Table for describing the bands that this series was generated description: Table for describing the bands that this series was generated
from. There should be one row in this table for each band. from. There should be one row in this table for each band.
range: DecompositionSeries__bands range: DecompositionSeries__bands
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
source_timeseries: source_timeseries:
name: source_timeseries name: source_timeseries
annotations: annotations:
source_type: source_type:
tag: source_type tag: source_type
value: link value: link
required: false inlined: true
multivalued: false
any_of: any_of:
- range: TimeSeries - range: TimeSeries
- range: string - range: string
@ -180,9 +295,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. Actual stored description: Base unit of measurement for working with the data. Actual stored
@ -208,6 +347,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(bands) ifabsent: string(bands)
identifier: true
range: string range: string
required: true required: true
equals_string: bands equals_string: bands
@ -259,10 +399,21 @@ classes:
name: name:
name: name name: name
ifabsent: string(Units) ifabsent: string(Units)
identifier: true
range: string range: string
required: true required: true
spike_times_index: electrode_group:
name: spike_times_index name: electrode_group
description: Electrode group that each spike unit came from.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: ElectrodeGroup
required: false
multivalued: false
inlined: true
electrodes:
name: electrodes
annotations: annotations:
named: named:
tag: named tag: named
@ -270,14 +421,30 @@ classes:
source_type: source_type:
tag: source_type tag: source_type
value: neurodata_type_inc value: neurodata_type_inc
description: Index into the spike_times dataset. description: Electrode that each spike unit came from, specified using a DynamicTableRegion.
range: DynamicTableRegion
inlined: true
electrodes_index:
name: electrodes_index
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: Index into electrodes.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false obs_intervals:
spike_times: name: obs_intervals
name: spike_times description: Observation intervals for each unit.
description: Spike times for each unit. array:
range: Units__spike_times dimensions:
- alias: num_intervals
- alias: start_end
exact_cardinality: 2
range: float64
required: false required: false
multivalued: false multivalued: false
obs_intervals_index: obs_intervals_index:
@ -291,21 +458,14 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Index into the obs_intervals dataset. description: Index into the obs_intervals dataset.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false spike_times:
obs_intervals: name: spike_times
name: obs_intervals description: Spike times for each unit.
description: Observation intervals for each unit. range: Units__spike_times
array: inlined: true
dimensions: spike_times_index:
- alias: num_intervals name: spike_times_index
- alias: start_end
exact_cardinality: 2
range: float64
required: false
multivalued: false
electrodes_index:
name: electrodes_index
annotations: annotations:
named: named:
tag: named tag: named
@ -313,61 +473,19 @@ classes:
source_type: source_type:
tag: source_type tag: source_type
value: neurodata_type_inc value: neurodata_type_inc
description: Index into electrodes. description: Index into the spike_times dataset.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: Electrode that each spike unit came from, specified using a DynamicTableRegion.
range: DynamicTableRegion
required: false
multivalued: false
electrode_group:
name: electrode_group
description: Electrode group that each spike unit came from.
range: ElectrodeGroup
required: false
multivalued: true
waveform_mean: waveform_mean:
name: waveform_mean name: waveform_mean
description: Spike waveform mean for each spike unit. description: Spike waveform mean for each spike unit.
range: float32 range: Units__waveform_mean
required: false inlined: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_units
- alias: num_samples
- array:
dimensions:
- alias: num_units
- alias: num_samples
- alias: num_electrodes
waveform_sd: waveform_sd:
name: waveform_sd name: waveform_sd
description: Spike waveform standard deviation for each spike unit. description: Spike waveform standard deviation for each spike unit.
range: float32 range: Units__waveform_sd
required: false inlined: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_units
- alias: num_samples
- array:
dimensions:
- alias: num_units
- alias: num_samples
- alias: num_electrodes
tree_root: true tree_root: true
Units__spike_times: Units__spike_times:
name: Units__spike_times name: Units__spike_times
@ -377,6 +495,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(spike_times) ifabsent: string(spike_times)
identifier: true
range: string range: string
required: true required: true
equals_string: spike_times equals_string: spike_times
@ -389,3 +508,51 @@ classes:
for the spike time to be between samples. for the spike time to be between samples.
range: float64 range: float64
required: false required: false
Units__waveform_mean:
name: Units__waveform_mean
description: Spike waveform mean for each spike unit.
is_a: VectorData
attributes:
name:
name: name
ifabsent: string(waveform_mean)
identifier: true
range: string
required: true
equals_string: waveform_mean
sampling_rate:
name: sampling_rate
description: Sampling rate, in hertz.
range: float32
required: false
unit:
name: unit
description: Unit of measurement. This value is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: false
equals_string: volts
Units__waveform_sd:
name: Units__waveform_sd
description: Spike waveform standard deviation for each spike unit.
is_a: VectorData
attributes:
name:
name: name
ifabsent: string(waveform_sd)
identifier: true
range: string
required: true
equals_string: waveform_sd
sampling_rate:
name: sampling_rate
description: Sampling rate, in hertz.
range: float32
required: false
unit:
name: unit
description: Unit of measurement. This value is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: false
equals_string: volts

View file

@ -21,17 +21,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Applied power for optogenetic stimulus, in watts. description: Applied power for optogenetic stimulus, in watts.
array: range: OptogeneticSeries__data
dimensions:
- alias: num_times
range: numeric
required: true required: true
multivalued: false inlined: true
site: site:
name: site name: site
annotations: annotations:
@ -39,11 +37,58 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: OptogeneticStimulusSite - range: OptogeneticStimulusSite
- range: string - range: string
tree_root: true tree_root: true
OptogeneticSeries__data:
name: OptogeneticSeries__data
description: Applied power for optogenetic stimulus, in watts.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: Unit of measurement for data, which is fixed to 'watts'.
ifabsent: string(watts)
range: text
required: true
equals_string: watts
value:
name: value
array:
dimensions:
- alias: num_times
range: numeric
OptogeneticStimulusSite: OptogeneticStimulusSite:
name: OptogeneticStimulusSite name: OptogeneticStimulusSite
description: A site of optogenetic stimulation. description: A site of optogenetic stimulation.
@ -51,6 +96,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -58,13 +104,11 @@ classes:
description: Description of stimulation site. description: Description of stimulation site.
range: text range: text
required: true required: true
multivalued: false
excitation_lambda: excitation_lambda:
name: excitation_lambda name: excitation_lambda
description: Excitation wavelength, in nm. description: Excitation wavelength, in nm.
range: float32 range: float32
required: true required: true
multivalued: false
location: location:
name: location name: location
description: Location of the stimulation site. Specify the area, layer, comments description: Location of the stimulation site. Specify the area, layer, comments
@ -72,7 +116,6 @@ classes:
standard atlas names for anatomical regions when possible. standard atlas names for anatomical regions when possible.
range: text range: text
required: true required: true
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -80,7 +123,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string

View file

@ -23,6 +23,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
pmt_gain: pmt_gain:
@ -59,7 +60,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ImagingPlane - range: ImagingPlane
- range: string - range: string
@ -72,22 +73,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Signals from ROIs. description: Signals from ROIs.
range: numeric range: RoiResponseSeries__data
required: true required: true
multivalued: false inlined: true
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_rois
rois: rois:
name: rois name: rois
annotations: annotations:
@ -101,8 +95,60 @@ classes:
on the ROIs stored in this timeseries. on the ROIs stored in this timeseries.
range: DynamicTableRegion range: DynamicTableRegion
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
RoiResponseSeries__data:
name: RoiResponseSeries__data
description: Signals from ROIs.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
range: text
required: true
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_rois
DfOverF: DfOverF:
name: DfOverF name: DfOverF
description: dF/F information about a region of interest (ROI). Storage hierarchy description: dF/F information about a region of interest (ROI). Storage hierarchy
@ -110,12 +156,19 @@ classes:
for image planes). for image planes).
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(DfOverF)
inlined_as_list: false identifier: true
any_of: range: string
- range: RoiResponseSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: RoiResponseSeries
tree_root: true tree_root: true
Fluorescence: Fluorescence:
name: Fluorescence name: Fluorescence
@ -124,12 +177,19 @@ classes:
for ROIs and for image planes). for ROIs and for image planes).
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(Fluorescence)
inlined_as_list: false identifier: true
any_of: range: string
- range: RoiResponseSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: RoiResponseSeries
tree_root: true tree_root: true
ImageSegmentation: ImageSegmentation:
name: ImageSegmentation name: ImageSegmentation
@ -142,12 +202,19 @@ classes:
is required and ROI names should remain consistent between them. is required and ROI names should remain consistent between them.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(ImageSegmentation)
inlined_as_list: false identifier: true
any_of: range: string
- range: DynamicTable required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: DynamicTable
tree_root: true tree_root: true
ImagingPlane: ImagingPlane:
name: ImagingPlane name: ImagingPlane
@ -156,32 +223,28 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
name: description name: description
description: Description of the imaging plane. description: Description of the imaging plane.
range: text range: text
required: false
multivalued: false
excitation_lambda: excitation_lambda:
name: excitation_lambda name: excitation_lambda
description: Excitation wavelength, in nm. description: Excitation wavelength, in nm.
range: float32 range: float32
required: true required: true
multivalued: false
imaging_rate: imaging_rate:
name: imaging_rate name: imaging_rate
description: Rate that images are acquired, in Hz. description: Rate that images are acquired, in Hz.
range: float32 range: float32
required: true required: true
multivalued: false
indicator: indicator:
name: indicator name: indicator
description: Calcium indicator. description: Calcium indicator.
range: text range: text
required: true required: true
multivalued: false
location: location:
name: location name: location
description: Location of the imaging plane. Specify the area, layer, comments description: Location of the imaging plane. Specify the area, layer, comments
@ -189,31 +252,27 @@ classes:
standard atlas names for anatomical regions when possible. standard atlas names for anatomical regions when possible.
range: text range: text
required: true required: true
multivalued: false
manifold: manifold:
name: manifold name: manifold
description: DEPRECATED Physical position of each pixel. 'xyz' represents description: DEPRECATED Physical position of each pixel. 'xyz' represents
the position of the pixel relative to the defined coordinate space. Deprecated the position of the pixel relative to the defined coordinate space. Deprecated
in favor of origin_coords and grid_spacing. in favor of origin_coords and grid_spacing.
range: ImagingPlane__manifold range: ImagingPlane__manifold
required: false inlined: true
multivalued: false
origin_coords: origin_coords:
name: origin_coords name: origin_coords
description: Physical location of the first element of the imaging plane (0, description: 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 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). what the physical location is relative to (e.g., bregma).
range: ImagingPlane__origin_coords range: ImagingPlane__origin_coords
required: false inlined: true
multivalued: false
grid_spacing: grid_spacing:
name: grid_spacing name: grid_spacing
description: Space between pixels in (x, y) or voxels in (x, y, z) directions, description: 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 in the specified unit. Assumes imaging plane is a regular grid. See also
reference_frame to interpret the grid. reference_frame to interpret the grid.
range: ImagingPlane__grid_spacing range: ImagingPlane__grid_spacing
required: false inlined: true
multivalued: false
reference_frame: reference_frame:
name: reference_frame name: reference_frame
description: Describes reference frame of origin_coords and grid_spacing. description: Describes reference frame of origin_coords and grid_spacing.
@ -234,14 +293,13 @@ classes:
axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral
axis (larger index = more ventral)." axis (larger index = more ventral)."
range: text range: text
required: false
multivalued: false
optical_channel: optical_channel:
name: optical_channel name: optical_channel
description: An optical channel used to record from an imaging plane. description: An optical channel used to record from an imaging plane.
range: OpticalChannel range: OpticalChannel
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
device: device:
name: device name: device
annotations: annotations:
@ -249,7 +307,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -263,6 +321,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(manifold) ifabsent: string(manifold)
identifier: true
range: string range: string
required: true required: true
equals_string: manifold equals_string: manifold
@ -312,6 +371,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(origin_coords) ifabsent: string(origin_coords)
identifier: true
range: string range: string
required: true required: true
equals_string: origin_coords equals_string: origin_coords
@ -339,6 +399,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(grid_spacing) ifabsent: string(grid_spacing)
identifier: true
range: string range: string
required: true required: true
equals_string: grid_spacing equals_string: grid_spacing
@ -364,6 +425,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -371,13 +433,11 @@ classes:
description: Description or other notes about the channel. description: Description or other notes about the channel.
range: text range: text
required: true required: true
multivalued: false
emission_lambda: emission_lambda:
name: emission_lambda name: emission_lambda
description: Emission wavelength for channel, in nm. description: Emission wavelength for channel, in nm.
range: float32 range: float32
required: true required: true
multivalued: false
MotionCorrection: MotionCorrection:
name: MotionCorrection name: MotionCorrection
description: 'An image stack where all frames are shifted (registered) to a common description: 'An image stack where all frames are shifted (registered) to a common
@ -385,10 +445,17 @@ classes:
frame at each point in time is assumed to be 2-D (has only x & y dimensions).' frame at each point in time is assumed to be 2-D (has only x & y dimensions).'
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(MotionCorrection)
inlined_as_list: false identifier: true
any_of: range: string
- range: NWBDataInterface required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: NWBDataInterface
tree_root: true tree_root: true

View file

@ -21,6 +21,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
dimension: dimension:
@ -52,6 +53,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
unit: unit:
@ -75,6 +77,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
bits_per_pixel: bits_per_pixel:
@ -115,6 +118,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(ImagingRetinotopy) ifabsent: string(ImagingRetinotopy)
identifier: true
range: string range: string
required: true required: true
axis_1_phase_map: axis_1_phase_map:
@ -129,7 +133,7 @@ classes:
description: Phase response to stimulus on the first measured axis. description: Phase response to stimulus on the first measured axis.
range: AxisMap range: AxisMap
required: true required: true
multivalued: false inlined: true
axis_1_power_map: axis_1_power_map:
name: axis_1_power_map name: axis_1_power_map
annotations: annotations:
@ -142,8 +146,7 @@ classes:
description: Power response on the first measured axis. Response is scaled description: 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. so 0.0 is no power in the response and 1.0 is maximum relative power.
range: AxisMap range: AxisMap
required: false inlined: true
multivalued: false
axis_2_phase_map: axis_2_phase_map:
name: axis_2_phase_map name: axis_2_phase_map
annotations: annotations:
@ -156,7 +159,7 @@ classes:
description: Phase response to stimulus on the second measured axis. description: Phase response to stimulus on the second measured axis.
range: AxisMap range: AxisMap
required: true required: true
multivalued: false inlined: true
axis_2_power_map: axis_2_power_map:
name: axis_2_power_map name: axis_2_power_map
annotations: annotations:
@ -168,8 +171,7 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Power response to stimulus on the second measured axis. description: Power response to stimulus on the second measured axis.
range: AxisMap range: AxisMap
required: false inlined: true
multivalued: false
sign_map: sign_map:
name: sign_map name: sign_map
annotations: annotations:
@ -183,7 +185,7 @@ classes:
and axis_2. and axis_2.
range: RetinotopyMap range: RetinotopyMap
required: true required: true
multivalued: false inlined: true
axis_descriptions: axis_descriptions:
name: axis_descriptions name: axis_descriptions
description: Two-element array describing the contents of the two response description: Two-element array describing the contents of the two response
@ -202,7 +204,7 @@ classes:
focal depth, wavelength) as data collection. Array format: [rows][columns].' focal depth, wavelength) as data collection. Array format: [rows][columns].'
range: ImagingRetinotopy__focal_depth_image range: ImagingRetinotopy__focal_depth_image
required: true required: true
multivalued: false inlined: true
vasculature_image: vasculature_image:
name: vasculature_image name: vasculature_image
annotations: annotations:
@ -216,7 +218,7 @@ classes:
[rows][columns]' [rows][columns]'
range: RetinotopyImage range: RetinotopyImage
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
ImagingRetinotopy__focal_depth_image: ImagingRetinotopy__focal_depth_image:
name: ImagingRetinotopy__focal_depth_image name: ImagingRetinotopy__focal_depth_image
@ -227,6 +229,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(focal_depth_image) ifabsent: string(focal_depth_image)
identifier: true
range: string range: string
required: true required: true
equals_string: focal_depth_image equals_string: focal_depth_image

View file

@ -20,6 +20,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -32,6 +33,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
resolution: resolution:
@ -73,6 +75,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -84,6 +87,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -94,6 +98,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -118,15 +123,14 @@ classes:
external file. external file.
range: TimeSeries__data range: TimeSeries__data
required: true required: true
multivalued: false inlined: true
starting_time: starting_time:
name: starting_time name: starting_time
description: Timestamp of the first sample in seconds. When timestamps are description: Timestamp of the first sample in seconds. When timestamps are
uniformly spaced, the timestamp of the first sample can be specified and uniformly spaced, the timestamp of the first sample can be specified and
all subsequent ones calculated from the sampling rate attribute. all subsequent ones calculated from the sampling rate attribute.
range: TimeSeries__starting_time range: TimeSeries__starting_time
required: false inlined: true
multivalued: false
timestamps: timestamps:
name: timestamps name: timestamps
description: Timestamps for samples stored in data, in seconds, relative to description: Timestamps for samples stored in data, in seconds, relative to
@ -168,8 +172,8 @@ classes:
external to the NWB file, in files storing raw data. Once timestamp data external to the NWB file, in files storing raw data. Once timestamp data
is calculated, the contents of 'sync' are mostly for archival purposes. is calculated, the contents of 'sync' are mostly for archival purposes.
range: TimeSeries__sync range: TimeSeries__sync
required: false inlined: true
multivalued: false inlined_as_list: true
tree_root: true tree_root: true
TimeSeries__data: TimeSeries__data:
name: TimeSeries__data name: TimeSeries__data
@ -180,6 +184,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
@ -244,6 +249,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(starting_time) ifabsent: string(starting_time)
identifier: true
range: string range: string
required: true required: true
equals_string: starting_time equals_string: starting_time
@ -275,6 +281,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(sync) ifabsent: string(sync)
identifier: true
range: string range: string
required: true required: true
equals_string: sync equals_string: sync
@ -283,13 +290,24 @@ classes:
description: A collection of processed data. description: A collection of processed data.
is_a: NWBContainer is_a: NWBContainer
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true identifier: true
inlined_as_list: false range: string
any_of: required: true
- range: NWBDataInterface description:
- range: DynamicTable name: description
description: Description of this collection of processed data.
range: text
required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: NWBDataInterface
- range: DynamicTable
tree_root: true tree_root: true
Images: Images:
name: Images name: Images
@ -299,6 +317,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(Images) ifabsent: string(Images)
identifier: true
range: string range: string
required: true required: true
description: description:

View file

@ -29,6 +29,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -37,13 +38,11 @@ classes:
reference frame. reference frame.
range: SpatialSeries__data range: SpatialSeries__data
required: true required: true
multivalued: false inlined: true
reference_frame: reference_frame:
name: reference_frame name: reference_frame
description: Description defining what exactly 'straight-ahead' means. description: Description defining what exactly 'straight-ahead' means.
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
SpatialSeries__data: SpatialSeries__data:
name: SpatialSeries__data name: SpatialSeries__data
@ -53,9 +52,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. The default description: Base unit of measurement for working with the data. The default
@ -91,12 +114,19 @@ classes:
events. BehavioralTimeSeries is for continuous data. events. BehavioralTimeSeries is for continuous data.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralEpochs)
inlined_as_list: false identifier: true
any_of: range: string
- range: IntervalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: IntervalSeries
tree_root: true tree_root: true
BehavioralEvents: BehavioralEvents:
name: BehavioralEvents name: BehavioralEvents
@ -104,12 +134,19 @@ classes:
for more details. for more details.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralEvents)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
BehavioralTimeSeries: BehavioralTimeSeries:
name: BehavioralTimeSeries name: BehavioralTimeSeries
@ -117,36 +154,57 @@ classes:
of <a href="#BehavioralEpochs">BehavioralEpochs</a> for more details. of <a href="#BehavioralEpochs">BehavioralEpochs</a> for more details.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralTimeSeries)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
PupilTracking: PupilTracking:
name: PupilTracking name: PupilTracking
description: Eye-tracking data, representing pupil size. description: Eye-tracking data, representing pupil size.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(PupilTracking)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
EyeTracking: EyeTracking:
name: EyeTracking name: EyeTracking
description: Eye-tracking data, representing direction of gaze. description: Eye-tracking data, representing direction of gaze.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(EyeTracking)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true
CompassDirection: CompassDirection:
name: CompassDirection name: CompassDirection
@ -157,22 +215,36 @@ classes:
be radians or degrees. be radians or degrees.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(CompassDirection)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true
Position: Position:
name: Position name: Position
description: Position data, whether along the x, x/y or x/y/z axis. description: Position data, whether along the x, x/y or x/y/z axis.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(Position)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true

View file

@ -21,6 +21,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:

View file

@ -25,41 +25,9 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data:
name: data
description: Recorded voltage data.
range: numeric
required: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_channels
- array:
dimensions:
- alias: num_times
- alias: num_channels
- alias: num_samples
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: DynamicTableRegion pointer to the electrodes that this time series
was generated from.
range: DynamicTableRegion
required: true
multivalued: false
channel_conversion: channel_conversion:
name: channel_conversion name: channel_conversion
description: Channel-specific conversion factor. Multiply the data in the description: Channel-specific conversion factor. Multiply the data in the
@ -77,7 +45,87 @@ classes:
range: float32 range: float32
required: false required: false
multivalued: false multivalued: false
data:
name: data
description: Recorded voltage data.
range: ElectricalSeries__data
required: true
inlined: true
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: DynamicTableRegion pointer to the electrodes that this time series
was generated from.
range: DynamicTableRegion
required: true
inlined: true
tree_root: true tree_root: true
ElectricalSeries__data:
name: ElectricalSeries__data
description: Recorded voltage data.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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).
ifabsent: string(volts)
range: text
required: true
equals_string: volts
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_channels
- array:
dimensions:
- alias: num_times
- alias: num_channels
- alias: num_samples
SpikeEventSeries: SpikeEventSeries:
name: SpikeEventSeries name: SpikeEventSeries
description: 'Stores snapshots/snippets of recorded spike events (i.e., threshold description: 'Stores snapshots/snippets of recorded spike events (i.e., threshold
@ -92,24 +140,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Spike waveforms. description: Spike waveforms.
range: numeric range: SpikeEventSeries__data
required: true required: true
multivalued: false inlined: true
any_of:
- array:
dimensions:
- alias: num_events
- alias: num_samples
- array:
dimensions:
- alias: num_events
- alias: num_channels
- alias: num_samples
timestamps: timestamps:
name: timestamps name: timestamps
description: Timestamps for samples stored in data, in seconds, relative to description: Timestamps for samples stored in data, in seconds, relative to
@ -123,6 +162,60 @@ classes:
required: true required: true
multivalued: false multivalued: false
tree_root: true tree_root: true
SpikeEventSeries__data:
name: SpikeEventSeries__data
description: Spike waveforms.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: Unit of measurement for waveforms, which is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: true
equals_string: volts
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_events
- alias: num_samples
- array:
dimensions:
- alias: num_events
- alias: num_channels
- alias: num_samples
FeatureExtraction: FeatureExtraction:
name: FeatureExtraction name: FeatureExtraction
description: Features, such as PC1 and PC2, that are extracted from signals stored description: Features, such as PC1 and PC2, that are extracted from signals stored
@ -132,6 +225,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(FeatureExtraction) ifabsent: string(FeatureExtraction)
identifier: true
range: string range: string
required: true required: true
description: description:
@ -177,7 +271,7 @@ classes:
was generated from. was generated from.
range: DynamicTableRegion range: DynamicTableRegion
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
EventDetection: EventDetection:
name: EventDetection name: EventDetection
@ -187,6 +281,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(EventDetection) ifabsent: string(EventDetection)
identifier: true
range: string range: string
required: true required: true
detection_method: detection_method:
@ -195,7 +290,6 @@ classes:
or dV/dT threshold, as well as relevant values. or dV/dT threshold, as well as relevant values.
range: text range: text
required: true required: true
multivalued: false
source_idx: source_idx:
name: source_idx name: source_idx
description: Indices (zero-based) into source ElectricalSeries::data array description: Indices (zero-based) into source ElectricalSeries::data array
@ -224,7 +318,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ElectricalSeries - range: ElectricalSeries
- range: string - range: string
@ -236,12 +330,19 @@ classes:
during experiment acquisition. during experiment acquisition.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(EventWaveform)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpikeEventSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpikeEventSeries
tree_root: true tree_root: true
FilteredEphys: FilteredEphys:
name: FilteredEphys name: FilteredEphys
@ -258,12 +359,19 @@ classes:
the ElectricalSeries. the ElectricalSeries.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(FilteredEphys)
inlined_as_list: false identifier: true
any_of: range: string
- range: ElectricalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: ElectricalSeries
tree_root: true tree_root: true
LFP: LFP:
name: LFP name: LFP
@ -272,12 +380,19 @@ classes:
properties should be noted in the ElectricalSeries description or comments field. properties should be noted in the ElectricalSeries description or comments field.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(LFP)
inlined_as_list: false identifier: true
any_of: range: string
- range: ElectricalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: ElectricalSeries
tree_root: true tree_root: true
ElectrodeGroup: ElectrodeGroup:
name: ElectrodeGroup name: ElectrodeGroup
@ -286,6 +401,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -304,8 +420,7 @@ classes:
name: position name: position
description: stereotaxic or common framework coordinates description: stereotaxic or common framework coordinates
range: ElectrodeGroup__position range: ElectrodeGroup__position
required: false inlined: true
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -313,7 +428,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -325,6 +440,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(position) ifabsent: string(position)
identifier: true
range: string range: string
required: true required: true
equals_string: position equals_string: position
@ -334,24 +450,18 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
y: y:
name: y name: y
description: y coordinate description: y coordinate
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
z: z:
name: z name: z
description: z coordinate description: z coordinate
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
ClusterWaveforms: ClusterWaveforms:
name: ClusterWaveforms name: ClusterWaveforms
description: DEPRECATED The mean waveform shape, including standard deviation, description: DEPRECATED The mean waveform shape, including standard deviation,
@ -365,6 +475,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(ClusterWaveforms) ifabsent: string(ClusterWaveforms)
identifier: true
range: string range: string
required: true required: true
waveform_filtering: waveform_filtering:
@ -372,7 +483,6 @@ classes:
description: Filtering applied to data before generating mean/sd description: Filtering applied to data before generating mean/sd
range: text range: text
required: true required: true
multivalued: false
waveform_mean: waveform_mean:
name: waveform_mean name: waveform_mean
description: The mean waveform for each cluster, using the same indices for description: The mean waveform for each cluster, using the same indices for
@ -404,7 +514,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Clustering - range: Clustering
- range: string - range: string
@ -418,6 +528,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(Clustering) ifabsent: string(Clustering)
identifier: true
range: string range: string
required: true required: true
description: description:
@ -426,7 +537,6 @@ classes:
clusters curated using Klusters, etc) clusters curated using Klusters, etc)
range: text range: text
required: true required: true
multivalued: false
num: num:
name: num name: num
description: Cluster number of each event description: Cluster number of each event

View file

@ -22,6 +22,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
start_time: start_time:
@ -62,14 +63,12 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Index for tags. description: Index for tags.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false
timeseries: timeseries:
name: timeseries name: timeseries
description: An index into a TimeSeries object. description: An index into a TimeSeries object.
range: TimeIntervals__timeseries range: TimeIntervals__timeseries
required: false inlined: true
multivalued: false
timeseries_index: timeseries_index:
name: timeseries_index name: timeseries_index
annotations: annotations:
@ -81,8 +80,7 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Index for timeseries. description: Index for timeseries.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false
tree_root: true tree_root: true
TimeIntervals__timeseries: TimeIntervals__timeseries:
name: TimeIntervals__timeseries name: TimeIntervals__timeseries
@ -92,6 +90,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(timeseries) ifabsent: string(timeseries)
identifier: true
range: string range: string
required: true required: true
equals_string: timeseries equals_string: timeseries
@ -103,8 +102,6 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: int32 range: int32
required: false
multivalued: false
count: count:
name: count name: count
description: Number of data samples available in this time series, during description: Number of data samples available in this time series, during
@ -112,13 +109,10 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: int32 range: int32
required: false
multivalued: false
timeseries: timeseries:
name: timeseries name: timeseries
description: the TimeSeries that this index applies to. description: the TimeSeries that this index applies to.
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: TimeSeries range: TimeSeries
required: false inlined: true
multivalued: false

View file

@ -30,6 +30,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(root) ifabsent: string(root)
identifier: true
range: string range: string
required: true required: true
equals_string: root equals_string: root
@ -64,13 +65,11 @@ classes:
other files. other files.
range: text range: text
required: true required: true
multivalued: false
session_description: session_description:
name: session_description name: session_description
description: A description of the experimental session and data in the file. description: A description of the experimental session and data in the file.
range: text range: text
required: true required: true
multivalued: false
session_start_time: session_start_time:
name: session_start_time name: session_start_time
description: 'Date and time of the experiment/session start. The date is stored description: 'Date and time of the experiment/session start. The date is stored
@ -79,7 +78,6 @@ classes:
offset. Date accuracy is up to milliseconds.' offset. Date accuracy is up to milliseconds.'
range: isodatetime range: isodatetime
required: true required: true
multivalued: false
timestamps_reference_time: timestamps_reference_time:
name: timestamps_reference_time name: timestamps_reference_time
description: 'Date and time corresponding to time zero of all timestamps. description: 'Date and time corresponding to time zero of all timestamps.
@ -89,7 +87,6 @@ classes:
times stored in the file use this time as reference (i.e., time zero).' times stored in the file use this time as reference (i.e., time zero).'
range: isodatetime range: isodatetime
required: true required: true
multivalued: false
acquisition: acquisition:
name: acquisition name: acquisition
description: Data streams recorded from the system, including ephys, ophys, description: Data streams recorded from the system, including ephys, ophys,
@ -168,7 +165,8 @@ classes:
can exist in the present file or can be linked to a remote library file. can exist in the present file or can be linked to a remote library file.
range: NWBFile__stimulus range: NWBFile__stimulus
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
general: general:
name: general name: general
description: Experimental metadata, including protocol, notes and description description: Experimental metadata, including protocol, notes and description
@ -188,7 +186,8 @@ classes:
should not be created unless there is data to store within them. should not be created unless there is data to store within them.
range: NWBFile__general range: NWBFile__general
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
intervals: intervals:
name: intervals name: intervals
description: Experimental intervals, whether that be logically distinct sub-experiments description: Experimental intervals, whether that be logically distinct sub-experiments
@ -196,14 +195,18 @@ classes:
an experiment, or epochs (see epochs subgroup) deriving from analysis of an experiment, or epochs (see epochs subgroup) deriving from analysis of
data. data.
range: NWBFile__intervals range: NWBFile__intervals
required: false inlined: true
multivalued: false inlined_as_list: true
units: units:
name: units name: units
description: Data about sorted spike units. description: Data about sorted spike units.
range: Units range: Units
required: false inlined: true
multivalued: false inlined_as_list: false
specifications:
name: specifications
description: Nested dictionary of schema specifications
range: dict
tree_root: true tree_root: true
NWBFile__stimulus: NWBFile__stimulus:
name: NWBFile__stimulus name: NWBFile__stimulus
@ -223,6 +226,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(stimulus) ifabsent: string(stimulus)
identifier: true
range: string range: string
required: true required: true
equals_string: stimulus equals_string: stimulus
@ -265,6 +269,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(general) ifabsent: string(general)
identifier: true
range: string range: string
required: true required: true
equals_string: general equals_string: general
@ -272,14 +277,10 @@ classes:
name: data_collection name: data_collection
description: Notes about data collection and analysis. description: Notes about data collection and analysis.
range: text range: text
required: false
multivalued: false
experiment_description: experiment_description:
name: experiment_description name: experiment_description
description: General description of the experiment. description: General description of the experiment.
range: text range: text
required: false
multivalued: false
experimenter: experimenter:
name: experimenter name: experimenter
description: Name of person(s) who performed the experiment. Can also specify description: Name of person(s) who performed the experiment. Can also specify
@ -294,8 +295,6 @@ classes:
name: institution name: institution
description: Institution(s) where experiment was performed. description: Institution(s) where experiment was performed.
range: text range: text
required: false
multivalued: false
keywords: keywords:
name: keywords name: keywords
description: Terms to search over. description: Terms to search over.
@ -309,28 +308,20 @@ classes:
name: lab name: lab
description: Laboratory where experiment was performed. description: Laboratory where experiment was performed.
range: text range: text
required: false
multivalued: false
notes: notes:
name: notes name: notes
description: Notes about the experiment. description: Notes about the experiment.
range: text range: text
required: false
multivalued: false
pharmacology: pharmacology:
name: pharmacology name: pharmacology
description: Description of drugs used, including how and when they were administered. description: Description of drugs used, including how and when they were administered.
Anesthesia(s), painkiller(s), etc., plus dosage, concentration, etc. Anesthesia(s), painkiller(s), etc., plus dosage, concentration, etc.
range: text range: text
required: false
multivalued: false
protocol: protocol:
name: protocol name: protocol
description: Experimental protocol, if applicable. e.g., include IACUC protocol description: Experimental protocol, if applicable. e.g., include IACUC protocol
number. number.
range: text range: text
required: false
multivalued: false
related_publications: related_publications:
name: related_publications name: related_publications
description: Publication information. PMID, DOI, URL, etc. description: Publication information. PMID, DOI, URL, etc.
@ -344,49 +335,39 @@ classes:
name: session_id name: session_id
description: Lab-specific ID for the session. description: Lab-specific ID for the session.
range: text range: text
required: false
multivalued: false
slices: slices:
name: slices name: slices
description: Description of slices, including information about preparation description: Description of slices, including information about preparation
thickness, orientation, temperature, and bath solution. thickness, orientation, temperature, and bath solution.
range: text range: text
required: false
multivalued: false
source_script: source_script:
name: source_script name: source_script
description: Script file or link to public source code used to create this description: Script file or link to public source code used to create this
NWB file. NWB file.
range: general__source_script range: general__source_script
required: false inlined: true
multivalued: false
stimulus: stimulus:
name: stimulus name: stimulus
description: Notes about stimuli, such as how and where they were presented. description: Notes about stimuli, such as how and where they were presented.
range: text range: text
required: false
multivalued: false
surgery: surgery:
name: surgery name: surgery
description: Narrative description about surgery/surgeries, including date(s) description: Narrative description about surgery/surgeries, including date(s)
and who performed surgery. and who performed surgery.
range: text range: text
required: false
multivalued: false
virus: virus:
name: virus name: virus
description: Information about virus(es) used in experiments, including virus description: Information about virus(es) used in experiments, including virus
ID, source, date made, injection location, volume, etc. ID, source, date made, injection location, volume, etc.
range: text range: text
required: false
multivalued: false
nwb_container: nwb_container:
name: nwb_container name: nwb_container
description: Place-holder than can be extended so that lab-specific meta-data description: Place-holder than can be extended so that lab-specific meta-data
can be placed in /general. can be placed in /general.
range: NWBContainer range: NWBContainer
required: false
multivalued: true multivalued: true
inlined: true
inlined_as_list: false
devices: devices:
name: devices name: devices
description: Description of hardware devices used during experiment, e.g., description: Description of hardware devices used during experiment, e.g.,
@ -401,20 +382,20 @@ classes:
description: Information about the animal or person from which the data was description: Information about the animal or person from which the data was
measured. measured.
range: Subject range: Subject
required: false inlined: true
multivalued: false inlined_as_list: true
extracellular_ephys: extracellular_ephys:
name: extracellular_ephys name: extracellular_ephys
description: Metadata related to extracellular electrophysiology. description: Metadata related to extracellular electrophysiology.
range: general__extracellular_ephys range: general__extracellular_ephys
required: false inlined: true
multivalued: false inlined_as_list: true
intracellular_ephys: intracellular_ephys:
name: intracellular_ephys name: intracellular_ephys
description: Metadata related to intracellular electrophysiology. description: Metadata related to intracellular electrophysiology.
range: general__intracellular_ephys range: general__intracellular_ephys
required: false inlined: true
multivalued: false inlined_as_list: true
optogenetics: optogenetics:
name: optogenetics name: optogenetics
description: Metadata describing optogenetic stimuluation. description: Metadata describing optogenetic stimuluation.
@ -439,6 +420,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(source_script) ifabsent: string(source_script)
identifier: true
range: string range: string
required: true required: true
equals_string: source_script equals_string: source_script
@ -459,6 +441,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(subject) ifabsent: string(subject)
identifier: true
range: string range: string
required: true required: true
equals_string: subject equals_string: subject
@ -466,52 +449,36 @@ classes:
name: age name: age
description: Age of subject. Can be supplied instead of 'date_of_birth'. description: Age of subject. Can be supplied instead of 'date_of_birth'.
range: text range: text
required: false
multivalued: false
date_of_birth: date_of_birth:
name: date_of_birth name: date_of_birth
description: Date of birth of subject. Can be supplied instead of 'age'. description: Date of birth of subject. Can be supplied instead of 'age'.
range: isodatetime range: isodatetime
required: false
multivalued: false
description: description:
name: description name: description
description: Description of subject and where subject came from (e.g., breeder, description: Description of subject and where subject came from (e.g., breeder,
if animal). if animal).
range: text range: text
required: false
multivalued: false
genotype: genotype:
name: genotype name: genotype
description: Genetic strain. If absent, assume Wild Type (WT). description: Genetic strain. If absent, assume Wild Type (WT).
range: text range: text
required: false
multivalued: false
sex: sex:
name: sex name: sex
description: Gender of subject. description: Gender of subject.
range: text range: text
required: false
multivalued: false
species: species:
name: species name: species
description: Species of subject. description: Species of subject.
range: text range: text
required: false
multivalued: false
subject_id: subject_id:
name: subject_id name: subject_id
description: ID of animal/person used/participating in experiment (lab convention). description: ID of animal/person used/participating in experiment (lab convention).
range: text range: text
required: false
multivalued: false
weight: weight:
name: weight name: weight
description: Weight at time of experiment, at time of surgery and at other description: Weight at time of experiment, at time of surgery and at other
important times. important times.
range: text range: text
required: false
multivalued: false
general__extracellular_ephys: general__extracellular_ephys:
name: general__extracellular_ephys name: general__extracellular_ephys
description: Metadata related to extracellular electrophysiology. description: Metadata related to extracellular electrophysiology.
@ -519,21 +486,23 @@ classes:
name: name:
name: name name: name
ifabsent: string(extracellular_ephys) ifabsent: string(extracellular_ephys)
identifier: true
range: string range: string
required: true required: true
equals_string: extracellular_ephys equals_string: extracellular_ephys
electrode_group:
name: electrode_group
description: Physical group of electrodes.
range: ElectrodeGroup
required: false
multivalued: true
electrodes: electrodes:
name: electrodes name: electrodes
description: A table of all electrodes (i.e. channels) used for recording. description: A table of all electrodes (i.e. channels) used for recording.
range: extracellular_ephys__electrodes range: extracellular_ephys__electrodes
required: false inlined: true
multivalued: false inlined_as_list: true
value:
name: value
description: Physical group of electrodes.
range: ElectrodeGroup
multivalued: true
inlined: true
inlined_as_list: false
extracellular_ephys__electrodes: extracellular_ephys__electrodes:
name: extracellular_ephys__electrodes name: extracellular_ephys__electrodes
description: A table of all electrodes (i.e. channels) used for recording. description: A table of all electrodes (i.e. channels) used for recording.
@ -542,6 +511,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(electrodes) ifabsent: string(electrodes)
identifier: true
range: string range: string
required: true required: true
equals_string: electrodes equals_string: electrodes
@ -604,9 +574,13 @@ classes:
group: group:
name: group name: group
description: Reference to the ElectrodeGroup this electrode is a part of. description: Reference to the ElectrodeGroup this electrode is a part of.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: ElectrodeGroup range: ElectrodeGroup
required: true required: true
multivalued: true multivalued: false
inlined: true
group_name: group_name:
name: group_name name: group_name
description: Name of the ElectrodeGroup this electrode is a part of. description: Name of the ElectrodeGroup this electrode is a part of.
@ -659,6 +633,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(intracellular_ephys) ifabsent: string(intracellular_ephys)
identifier: true
range: string range: string
required: true required: true
equals_string: intracellular_ephys equals_string: intracellular_ephys
@ -668,20 +643,19 @@ classes:
frequency fall-off, etc. If this changes between TimeSeries, filter description frequency fall-off, etc. If this changes between TimeSeries, filter description
should be stored as a text attribute for each TimeSeries. should be stored as a text attribute for each TimeSeries.
range: text range: text
required: false
multivalued: false
intracellular_electrode:
name: intracellular_electrode
description: An intracellular electrode.
range: IntracellularElectrode
required: false
multivalued: true
sweep_table: sweep_table:
name: sweep_table name: sweep_table
description: The table which groups different PatchClampSeries together. description: The table which groups different PatchClampSeries together.
range: SweepTable range: SweepTable
required: false inlined: true
multivalued: false inlined_as_list: false
value:
name: value
description: An intracellular electrode.
range: IntracellularElectrode
multivalued: true
inlined: true
inlined_as_list: false
NWBFile__intervals: NWBFile__intervals:
name: NWBFile__intervals name: NWBFile__intervals
description: Experimental intervals, whether that be logically distinct sub-experiments description: Experimental intervals, whether that be logically distinct sub-experiments
@ -691,6 +665,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(intervals) ifabsent: string(intervals)
identifier: true
range: string range: string
required: true required: true
equals_string: intervals equals_string: intervals
@ -699,24 +674,25 @@ classes:
description: Divisions in time marking experimental stages or sub-divisions description: Divisions in time marking experimental stages or sub-divisions
of a single recording session. of a single recording session.
range: TimeIntervals range: TimeIntervals
required: false inlined: true
multivalued: false inlined_as_list: false
trials: trials:
name: trials name: trials
description: Repeated experimental events that have a logical grouping. description: Repeated experimental events that have a logical grouping.
range: TimeIntervals range: TimeIntervals
required: false inlined: true
multivalued: false inlined_as_list: false
invalid_times: invalid_times:
name: invalid_times name: invalid_times
description: Time intervals that should be removed from analysis. description: Time intervals that should be removed from analysis.
range: TimeIntervals range: TimeIntervals
required: false inlined: true
multivalued: false inlined_as_list: false
time_intervals: value:
name: time_intervals name: value
description: Optional additional table(s) for describing other experimental description: Optional additional table(s) for describing other experimental
time intervals. time intervals.
range: TimeIntervals range: TimeIntervals
required: false
multivalued: true multivalued: true
inlined: true
inlined_as_list: false

View file

@ -23,6 +23,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
stimulus_description: stimulus_description:
@ -40,14 +41,12 @@ classes:
description: Recorded voltage or current. description: Recorded voltage or current.
range: PatchClampSeries__data range: PatchClampSeries__data
required: true required: true
multivalued: false inlined: true
gain: gain:
name: gain name: gain
description: Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt description: Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt
(c-clamp). (c-clamp).
range: float32 range: float32
required: false
multivalued: false
electrode: electrode:
name: electrode name: electrode
annotations: annotations:
@ -55,7 +54,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: IntracellularElectrode - range: IntracellularElectrode
- range: string - range: string
@ -67,9 +66,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. Actual stored description: Base unit of measurement for working with the data. Actual stored
@ -92,32 +115,27 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
bias_current:
name: bias_current
description: Bias current, in amps.
range: float32
bridge_balance:
name: bridge_balance
description: Bridge balance, in ohms.
range: float32
capacitance_compensation:
name: capacitance_compensation
description: Capacitance compensation, in farads.
range: float32
data: data:
name: data name: data
description: Recorded voltage. description: Recorded voltage.
range: CurrentClampSeries__data range: CurrentClampSeries__data
required: true required: true
multivalued: false inlined: true
bias_current:
name: bias_current
description: Bias current, in amps.
range: float32
required: false
multivalued: false
bridge_balance:
name: bridge_balance
description: Bridge balance, in ohms.
range: float32
required: false
multivalued: false
capacitance_compensation:
name: capacitance_compensation
description: Capacitance compensation, in farads.
range: float32
required: false
multivalued: false
tree_root: true tree_root: true
CurrentClampSeries__data: CurrentClampSeries__data:
name: CurrentClampSeries__data name: CurrentClampSeries__data
@ -126,9 +144,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. which is description: Base unit of measurement for working with the data. which is
@ -140,8 +182,10 @@ classes:
equals_string: volts equals_string: volts
value: value:
name: value name: value
range: AnyType array:
required: true dimensions:
- alias: num_times
range: numeric
IZeroClampSeries: IZeroClampSeries:
name: IZeroClampSeries name: IZeroClampSeries
description: Voltage data from an intracellular recording when all current and description: Voltage data from an intracellular recording when all current and
@ -152,6 +196,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
bias_current: bias_current:
@ -159,19 +204,16 @@ classes:
description: Bias current, in amps, fixed to 0.0. description: Bias current, in amps, fixed to 0.0.
range: float32 range: float32
required: true required: true
multivalued: false
bridge_balance: bridge_balance:
name: bridge_balance name: bridge_balance
description: Bridge balance, in ohms, fixed to 0.0. description: Bridge balance, in ohms, fixed to 0.0.
range: float32 range: float32
required: true required: true
multivalued: false
capacitance_compensation: capacitance_compensation:
name: capacitance_compensation name: capacitance_compensation
description: Capacitance compensation, in farads, fixed to 0.0. description: Capacitance compensation, in farads, fixed to 0.0.
range: float32 range: float32
required: true required: true
multivalued: false
tree_root: true tree_root: true
CurrentClampStimulusSeries: CurrentClampStimulusSeries:
name: CurrentClampStimulusSeries name: CurrentClampStimulusSeries
@ -180,6 +222,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -187,7 +230,7 @@ classes:
description: Stimulus current applied. description: Stimulus current applied.
range: CurrentClampStimulusSeries__data range: CurrentClampStimulusSeries__data
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
CurrentClampStimulusSeries__data: CurrentClampStimulusSeries__data:
name: CurrentClampStimulusSeries__data name: CurrentClampStimulusSeries__data
@ -196,9 +239,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. which is description: Base unit of measurement for working with the data. which is
@ -210,8 +277,10 @@ classes:
equals_string: amperes equals_string: amperes
value: value:
name: value name: value
range: AnyType array:
required: true dimensions:
- alias: num_times
range: numeric
VoltageClampSeries: VoltageClampSeries:
name: VoltageClampSeries name: VoltageClampSeries
description: Current data from an intracellular voltage-clamp recording. A corresponding description: Current data from an intracellular voltage-clamp recording. A corresponding
@ -221,80 +290,51 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
capacitance_fast:
name: capacitance_fast
description: Fast capacitance, in farads.
range: VoltageClampSeries__capacitance_fast
inlined: true
capacitance_slow:
name: capacitance_slow
description: Slow capacitance, in farads.
range: VoltageClampSeries__capacitance_slow
inlined: true
data: data:
name: data name: data
description: Recorded current. description: Recorded current.
range: VoltageClampSeries__data range: VoltageClampSeries__data
required: true required: true
multivalued: false inlined: true
capacitance_fast:
name: capacitance_fast
description: Fast capacitance, in farads.
range: VoltageClampSeries__capacitance_fast
required: false
multivalued: false
capacitance_slow:
name: capacitance_slow
description: Slow capacitance, in farads.
range: VoltageClampSeries__capacitance_slow
required: false
multivalued: false
resistance_comp_bandwidth: resistance_comp_bandwidth:
name: resistance_comp_bandwidth name: resistance_comp_bandwidth
description: Resistance compensation bandwidth, in hertz. description: Resistance compensation bandwidth, in hertz.
range: VoltageClampSeries__resistance_comp_bandwidth range: VoltageClampSeries__resistance_comp_bandwidth
required: false inlined: true
multivalued: false
resistance_comp_correction: resistance_comp_correction:
name: resistance_comp_correction name: resistance_comp_correction
description: Resistance compensation correction, in percent. description: Resistance compensation correction, in percent.
range: VoltageClampSeries__resistance_comp_correction range: VoltageClampSeries__resistance_comp_correction
required: false inlined: true
multivalued: false
resistance_comp_prediction: resistance_comp_prediction:
name: resistance_comp_prediction name: resistance_comp_prediction
description: Resistance compensation prediction, in percent. description: Resistance compensation prediction, in percent.
range: VoltageClampSeries__resistance_comp_prediction range: VoltageClampSeries__resistance_comp_prediction
required: false inlined: true
multivalued: false
whole_cell_capacitance_comp: whole_cell_capacitance_comp:
name: whole_cell_capacitance_comp name: whole_cell_capacitance_comp
description: Whole cell capacitance compensation, in farads. description: Whole cell capacitance compensation, in farads.
range: VoltageClampSeries__whole_cell_capacitance_comp range: VoltageClampSeries__whole_cell_capacitance_comp
required: false inlined: true
multivalued: false
whole_cell_series_resistance_comp: whole_cell_series_resistance_comp:
name: whole_cell_series_resistance_comp name: whole_cell_series_resistance_comp
description: Whole cell series resistance compensation, in ohms. description: Whole cell series resistance compensation, in ohms.
range: VoltageClampSeries__whole_cell_series_resistance_comp range: VoltageClampSeries__whole_cell_series_resistance_comp
required: false inlined: true
multivalued: false
tree_root: true tree_root: true
VoltageClampSeries__data:
name: VoltageClampSeries__data
description: Recorded current.
attributes:
name:
name: name
ifabsent: string(data)
range: string
required: true
equals_string: data
unit:
name: unit
description: 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'.
ifabsent: string(amperes)
range: text
required: true
equals_string: amperes
value:
name: value
range: AnyType
required: true
VoltageClampSeries__capacitance_fast: VoltageClampSeries__capacitance_fast:
name: VoltageClampSeries__capacitance_fast name: VoltageClampSeries__capacitance_fast
description: Fast capacitance, in farads. description: Fast capacitance, in farads.
@ -302,6 +342,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(capacitance_fast) ifabsent: string(capacitance_fast)
identifier: true
range: string range: string
required: true required: true
equals_string: capacitance_fast equals_string: capacitance_fast
@ -323,6 +364,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(capacitance_slow) ifabsent: string(capacitance_slow)
identifier: true
range: string range: string
required: true required: true
equals_string: capacitance_slow equals_string: capacitance_slow
@ -337,6 +379,55 @@ classes:
name: value name: value
range: float32 range: float32
required: true required: true
VoltageClampSeries__data:
name: VoltageClampSeries__data
description: Recorded current.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
ifabsent: string(amperes)
range: text
required: true
equals_string: amperes
value:
name: value
array:
dimensions:
- alias: num_times
range: numeric
VoltageClampSeries__resistance_comp_bandwidth: VoltageClampSeries__resistance_comp_bandwidth:
name: VoltageClampSeries__resistance_comp_bandwidth name: VoltageClampSeries__resistance_comp_bandwidth
description: Resistance compensation bandwidth, in hertz. description: Resistance compensation bandwidth, in hertz.
@ -344,6 +435,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(resistance_comp_bandwidth) ifabsent: string(resistance_comp_bandwidth)
identifier: true
range: string range: string
required: true required: true
equals_string: resistance_comp_bandwidth equals_string: resistance_comp_bandwidth
@ -366,6 +458,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(resistance_comp_correction) ifabsent: string(resistance_comp_correction)
identifier: true
range: string range: string
required: true required: true
equals_string: resistance_comp_correction equals_string: resistance_comp_correction
@ -388,6 +481,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(resistance_comp_prediction) ifabsent: string(resistance_comp_prediction)
identifier: true
range: string range: string
required: true required: true
equals_string: resistance_comp_prediction equals_string: resistance_comp_prediction
@ -410,6 +504,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(whole_cell_capacitance_comp) ifabsent: string(whole_cell_capacitance_comp)
identifier: true
range: string range: string
required: true required: true
equals_string: whole_cell_capacitance_comp equals_string: whole_cell_capacitance_comp
@ -432,6 +527,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(whole_cell_series_resistance_comp) ifabsent: string(whole_cell_series_resistance_comp)
identifier: true
range: string range: string
required: true required: true
equals_string: whole_cell_series_resistance_comp equals_string: whole_cell_series_resistance_comp
@ -454,6 +550,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -461,7 +558,7 @@ classes:
description: Stimulus voltage applied. description: Stimulus voltage applied.
range: VoltageClampStimulusSeries__data range: VoltageClampStimulusSeries__data
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
VoltageClampStimulusSeries__data: VoltageClampStimulusSeries__data:
name: VoltageClampStimulusSeries__data name: VoltageClampStimulusSeries__data
@ -470,9 +567,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. which is description: Base unit of measurement for working with the data. which is
@ -484,8 +605,10 @@ classes:
equals_string: volts equals_string: volts
value: value:
name: value name: value
range: AnyType array:
required: true dimensions:
- alias: num_times
range: numeric
IntracellularElectrode: IntracellularElectrode:
name: IntracellularElectrode name: IntracellularElectrode
description: An intracellular electrode and its metadata. description: An intracellular electrode and its metadata.
@ -493,6 +616,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -500,45 +624,32 @@ classes:
description: Description of electrode (e.g., whole-cell, sharp, etc.). description: Description of electrode (e.g., whole-cell, sharp, etc.).
range: text range: text
required: true required: true
multivalued: false
filtering: filtering:
name: filtering name: filtering
description: Electrode specific filtering. description: Electrode specific filtering.
range: text range: text
required: false
multivalued: false
initial_access_resistance: initial_access_resistance:
name: initial_access_resistance name: initial_access_resistance
description: Initial access resistance. description: Initial access resistance.
range: text range: text
required: false
multivalued: false
location: location:
name: location name: location
description: Location of the electrode. Specify the area, layer, comments description: Location of the electrode. Specify the area, layer, comments
on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use
standard atlas names for anatomical regions when possible. standard atlas names for anatomical regions when possible.
range: text range: text
required: false
multivalued: false
resistance: resistance:
name: resistance name: resistance
description: Electrode resistance, in ohms. description: Electrode resistance, in ohms.
range: text range: text
required: false
multivalued: false
seal: seal:
name: seal name: seal
description: Information about seal used for recording. description: Information about seal used for recording.
range: text range: text
required: false
multivalued: false
slice: slice:
name: slice name: slice
description: Information about slice used for recording. description: Information about slice used for recording.
range: text range: text
required: false
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -546,7 +657,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -558,23 +669,19 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
sweep_number:
name: sweep_number
description: Sweep number of the PatchClampSeries in that row.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: uint32
required: true
multivalued: false
series: series:
name: series name: series
description: The PatchClampSeries with the sweep number in that row. description: The PatchClampSeries with the sweep number in that row.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: PatchClampSeries range: PatchClampSeries
required: true required: true
multivalued: true multivalued: false
inlined: true
series_index: series_index:
name: series_index name: series_index
annotations: annotations:
@ -587,5 +694,14 @@ classes:
description: Index for series. description: Index for series.
range: VectorIndex range: VectorIndex
required: true required: true
inlined: true
sweep_number:
name: sweep_number
description: Sweep number of the PatchClampSeries in that row.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: uint32
required: true
multivalued: false multivalued: false
tree_root: true tree_root: true

View file

@ -20,6 +20,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
value: value:
@ -37,6 +38,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
value: value:
@ -56,6 +58,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
value: value:
@ -80,26 +83,14 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Binary data representing images across frames. description: Binary data representing images across frames.
range: numeric range: ImageSeries__data
required: false inlined: true
multivalued: false
any_of:
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- alias: z
dimension: dimension:
name: dimension name: dimension
description: Number of pixels on x, y, (and z) axes. description: Number of pixels on x, y, (and z) axes.
@ -117,18 +108,72 @@ classes:
used if the image is stored in another NWB file and that file is linked used if the image is stored in another NWB file and that file is linked
to this file. to this file.
range: ImageSeries__external_file range: ImageSeries__external_file
required: false inlined: true
multivalued: false
format: format:
name: format name: format
description: Format of image. If this is 'external', then the attribute 'external_file' description: 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 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 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. this attribute is not present, then the default format='raw' case is assumed.
ifabsent: string(raw)
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
ImageSeries__data:
name: ImageSeries__data
description: Binary data representing images across frames.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
range: text
required: true
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- array:
dimensions:
- alias: frame
- alias: x
- alias: y
- alias: z
ImageSeries__external_file: ImageSeries__external_file:
name: ImageSeries__external_file name: ImageSeries__external_file
description: Paths to one or more external file(s). The field is only present description: Paths to one or more external file(s). The field is only present
@ -139,6 +184,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(external_file) ifabsent: string(external_file)
identifier: true
range: string range: string
required: true required: true
equals_string: external_file equals_string: external_file
@ -176,6 +222,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
masked_imageseries: masked_imageseries:
@ -185,7 +232,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ImageSeries - range: ImageSeries
- range: string - range: string
@ -201,14 +248,13 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
distance: distance:
name: distance name: distance
description: Distance from camera/monitor to target/eye. description: Distance from camera/monitor to target/eye.
range: float32 range: float32
required: false
multivalued: false
field_of_view: field_of_view:
name: field_of_view name: field_of_view
description: Width, height and depth of image, or imaged area, in meters. description: Width, height and depth of image, or imaged area, in meters.
@ -229,8 +275,6 @@ classes:
description: Description of image relative to some reference frame (e.g., description: Description of image relative to some reference frame (e.g.,
which way is up). Must also specify frame of reference. which way is up). Must also specify frame of reference.
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
IndexSeries: IndexSeries:
name: IndexSeries name: IndexSeries
@ -244,17 +288,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Index of the frame in the referenced ImageSeries. description: Index of the frame in the referenced ImageSeries.
array: range: IndexSeries__data
dimensions:
- alias: num_times
range: int32
required: true required: true
multivalued: false inlined: true
indexed_timeseries: indexed_timeseries:
name: indexed_timeseries name: indexed_timeseries
annotations: annotations:
@ -262,8 +304,55 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ImageSeries - range: ImageSeries
- range: string - range: string
tree_root: true tree_root: true
IndexSeries__data:
name: IndexSeries__data
description: Index of the frame in the referenced ImageSeries.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
range: text
required: true
value:
name: value
array:
dimensions:
- alias: num_times
range: int32

View file

@ -66,6 +66,7 @@ types:
numeric: numeric:
name: numeric name: numeric
typeof: float typeof: float
repr: float | int
text: text:
name: text name: text
typeof: string typeof: string
@ -87,6 +88,9 @@ types:
isodatetime: isodatetime:
name: isodatetime name: isodatetime
typeof: datetime typeof: datetime
dict:
name: dict
repr: dict
classes: classes:
AnyType: AnyType:
name: AnyType name: AnyType

View file

@ -30,6 +30,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -37,7 +38,7 @@ classes:
description: Values of each feature at each time. description: Values of each feature at each time.
range: AbstractFeatureSeries__data range: AbstractFeatureSeries__data
required: true required: true
multivalued: false inlined: true
feature_units: feature_units:
name: feature_units name: feature_units
description: Units of each feature. description: Units of each feature.
@ -64,9 +65,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Since there can be different units for different features, store description: Since there can be different units for different features, store
@ -96,18 +121,63 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Annotations made during an experiment. description: Annotations made during an experiment.
range: AnnotationSeries__data
required: true
inlined: true
tree_root: true
AnnotationSeries__data:
name: AnnotationSeries__data
description: Annotations made during an experiment.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: Smallest meaningful difference between values in data. Annotations
have no units, so the value is fixed to -1.0.
ifabsent: float(-1.0)
range: float32
required: true
equals_number: -1
unit:
name: unit
description: Base unit of measurement for working with the data. Annotations
have no units, so the value is fixed to 'n/a'.
ifabsent: string(n/a)
range: text
required: true
equals_string: n/a
value:
name: value
array: array:
dimensions: dimensions:
- alias: num_times - alias: num_times
range: text range: text
required: true
multivalued: false
tree_root: true
IntervalSeries: IntervalSeries:
name: IntervalSeries name: IntervalSeries
description: Stores intervals of data. The timestamps field stores the beginning description: Stores intervals of data. The timestamps field stores the beginning
@ -121,18 +191,63 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Use values >0 if interval started, <0 if interval ended. description: Use values >0 if interval started, <0 if interval ended.
range: IntervalSeries__data
required: true
inlined: true
tree_root: true
IntervalSeries__data:
name: IntervalSeries__data
description: Use values >0 if interval started, <0 if interval ended.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: Smallest meaningful difference between values in data. Annotations
have no units, so the value is fixed to -1.0.
ifabsent: float(-1.0)
range: float32
required: true
equals_number: -1
unit:
name: unit
description: Base unit of measurement for working with the data. Annotations
have no units, so the value is fixed to 'n/a'.
ifabsent: string(n/a)
range: text
required: true
equals_string: n/a
value:
name: value
array: array:
dimensions: dimensions:
- alias: num_times - alias: num_times
range: int8 range: int8
required: true
multivalued: false
tree_root: true
DecompositionSeries: DecompositionSeries:
name: DecompositionSeries name: DecompositionSeries
description: Spectral analysis of a time series, e.g. of an LFP or a speech signal. description: Spectral analysis of a time series, e.g. of an LFP or a speech signal.
@ -140,6 +255,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -147,28 +263,27 @@ classes:
description: Data decomposed into frequency bands. description: Data decomposed into frequency bands.
range: DecompositionSeries__data range: DecompositionSeries__data
required: true required: true
multivalued: false inlined: true
metric: metric:
name: metric name: metric
description: The metric used, e.g. phase, amplitude, power. description: The metric used, e.g. phase, amplitude, power.
range: text range: text
required: true required: true
multivalued: false
bands: bands:
name: bands name: bands
description: Table for describing the bands that this series was generated description: Table for describing the bands that this series was generated
from. There should be one row in this table for each band. from. There should be one row in this table for each band.
range: DecompositionSeries__bands range: DecompositionSeries__bands
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
source_timeseries: source_timeseries:
name: source_timeseries name: source_timeseries
annotations: annotations:
source_type: source_type:
tag: source_type tag: source_type
value: link value: link
required: false inlined: true
multivalued: false
any_of: any_of:
- range: TimeSeries - range: TimeSeries
- range: string - range: string
@ -180,9 +295,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. Actual stored description: Base unit of measurement for working with the data. Actual stored
@ -208,6 +347,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(bands) ifabsent: string(bands)
identifier: true
range: string range: string
required: true required: true
equals_string: bands equals_string: bands
@ -259,10 +399,21 @@ classes:
name: name:
name: name name: name
ifabsent: string(Units) ifabsent: string(Units)
identifier: true
range: string range: string
required: true required: true
spike_times_index: electrode_group:
name: spike_times_index name: electrode_group
description: Electrode group that each spike unit came from.
array:
minimum_number_dimensions: 1
maximum_number_dimensions: false
range: ElectrodeGroup
required: false
multivalued: false
inlined: true
electrodes:
name: electrodes
annotations: annotations:
named: named:
tag: named tag: named
@ -270,14 +421,30 @@ classes:
source_type: source_type:
tag: source_type tag: source_type
value: neurodata_type_inc value: neurodata_type_inc
description: Index into the spike_times dataset. description: Electrode that each spike unit came from, specified using a DynamicTableRegion.
range: DynamicTableRegion
inlined: true
electrodes_index:
name: electrodes_index
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: Index into electrodes.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false obs_intervals:
spike_times: name: obs_intervals
name: spike_times description: Observation intervals for each unit.
description: Spike times for each unit. array:
range: Units__spike_times dimensions:
- alias: num_intervals
- alias: start_end
exact_cardinality: 2
range: float64
required: false required: false
multivalued: false multivalued: false
obs_intervals_index: obs_intervals_index:
@ -291,21 +458,14 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Index into the obs_intervals dataset. description: Index into the obs_intervals dataset.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false spike_times:
obs_intervals: name: spike_times
name: obs_intervals description: Spike times for each unit.
description: Observation intervals for each unit. range: Units__spike_times
array: inlined: true
dimensions: spike_times_index:
- alias: num_intervals name: spike_times_index
- alias: start_end
exact_cardinality: 2
range: float64
required: false
multivalued: false
electrodes_index:
name: electrodes_index
annotations: annotations:
named: named:
tag: named tag: named
@ -313,61 +473,19 @@ classes:
source_type: source_type:
tag: source_type tag: source_type
value: neurodata_type_inc value: neurodata_type_inc
description: Index into electrodes. description: Index into the spike_times dataset.
range: VectorIndex range: VectorIndex
required: false inlined: true
multivalued: false
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: Electrode that each spike unit came from, specified using a DynamicTableRegion.
range: DynamicTableRegion
required: false
multivalued: false
electrode_group:
name: electrode_group
description: Electrode group that each spike unit came from.
range: ElectrodeGroup
required: false
multivalued: true
waveform_mean: waveform_mean:
name: waveform_mean name: waveform_mean
description: Spike waveform mean for each spike unit. description: Spike waveform mean for each spike unit.
range: float32 range: Units__waveform_mean
required: false inlined: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_units
- alias: num_samples
- array:
dimensions:
- alias: num_units
- alias: num_samples
- alias: num_electrodes
waveform_sd: waveform_sd:
name: waveform_sd name: waveform_sd
description: Spike waveform standard deviation for each spike unit. description: Spike waveform standard deviation for each spike unit.
range: float32 range: Units__waveform_sd
required: false inlined: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_units
- alias: num_samples
- array:
dimensions:
- alias: num_units
- alias: num_samples
- alias: num_electrodes
tree_root: true tree_root: true
Units__spike_times: Units__spike_times:
name: Units__spike_times name: Units__spike_times
@ -377,6 +495,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(spike_times) ifabsent: string(spike_times)
identifier: true
range: string range: string
required: true required: true
equals_string: spike_times equals_string: spike_times
@ -389,3 +508,51 @@ classes:
for the spike time to be between samples. for the spike time to be between samples.
range: float64 range: float64
required: false required: false
Units__waveform_mean:
name: Units__waveform_mean
description: Spike waveform mean for each spike unit.
is_a: VectorData
attributes:
name:
name: name
ifabsent: string(waveform_mean)
identifier: true
range: string
required: true
equals_string: waveform_mean
sampling_rate:
name: sampling_rate
description: Sampling rate, in hertz.
range: float32
required: false
unit:
name: unit
description: Unit of measurement. This value is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: false
equals_string: volts
Units__waveform_sd:
name: Units__waveform_sd
description: Spike waveform standard deviation for each spike unit.
is_a: VectorData
attributes:
name:
name: name
ifabsent: string(waveform_sd)
identifier: true
range: string
required: true
equals_string: waveform_sd
sampling_rate:
name: sampling_rate
description: Sampling rate, in hertz.
range: float32
required: false
unit:
name: unit
description: Unit of measurement. This value is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: false
equals_string: volts

View file

@ -21,17 +21,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Applied power for optogenetic stimulus, in watts. description: Applied power for optogenetic stimulus, in watts.
array: range: OptogeneticSeries__data
dimensions:
- alias: num_times
range: numeric
required: true required: true
multivalued: false inlined: true
site: site:
name: site name: site
annotations: annotations:
@ -39,11 +37,58 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: OptogeneticStimulusSite - range: OptogeneticStimulusSite
- range: string - range: string
tree_root: true tree_root: true
OptogeneticSeries__data:
name: OptogeneticSeries__data
description: Applied power for optogenetic stimulus, in watts.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: Unit of measurement for data, which is fixed to 'watts'.
ifabsent: string(watts)
range: text
required: true
equals_string: watts
value:
name: value
array:
dimensions:
- alias: num_times
range: numeric
OptogeneticStimulusSite: OptogeneticStimulusSite:
name: OptogeneticStimulusSite name: OptogeneticStimulusSite
description: A site of optogenetic stimulation. description: A site of optogenetic stimulation.
@ -51,6 +96,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -58,13 +104,11 @@ classes:
description: Description of stimulation site. description: Description of stimulation site.
range: text range: text
required: true required: true
multivalued: false
excitation_lambda: excitation_lambda:
name: excitation_lambda name: excitation_lambda
description: Excitation wavelength, in nm. description: Excitation wavelength, in nm.
range: float32 range: float32
required: true required: true
multivalued: false
location: location:
name: location name: location
description: Location of the stimulation site. Specify the area, layer, comments description: Location of the stimulation site. Specify the area, layer, comments
@ -72,7 +116,6 @@ classes:
standard atlas names for anatomical regions when possible. standard atlas names for anatomical regions when possible.
range: text range: text
required: true required: true
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -80,7 +123,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string

View file

@ -23,6 +23,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
pmt_gain: pmt_gain:
@ -59,7 +60,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ImagingPlane - range: ImagingPlane
- range: string - range: string
@ -72,22 +73,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Signals from ROIs. description: Signals from ROIs.
range: numeric range: RoiResponseSeries__data
required: true required: true
multivalued: false inlined: true
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_rois
rois: rois:
name: rois name: rois
annotations: annotations:
@ -101,8 +95,60 @@ classes:
on the ROIs stored in this timeseries. on the ROIs stored in this timeseries.
range: DynamicTableRegion range: DynamicTableRegion
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
RoiResponseSeries__data:
name: RoiResponseSeries__data
description: Signals from ROIs.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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'.
range: text
required: true
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_rois
DfOverF: DfOverF:
name: DfOverF name: DfOverF
description: dF/F information about a region of interest (ROI). Storage hierarchy description: dF/F information about a region of interest (ROI). Storage hierarchy
@ -110,12 +156,19 @@ classes:
for image planes). for image planes).
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(DfOverF)
inlined_as_list: false identifier: true
any_of: range: string
- range: RoiResponseSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: RoiResponseSeries
tree_root: true tree_root: true
Fluorescence: Fluorescence:
name: Fluorescence name: Fluorescence
@ -124,12 +177,19 @@ classes:
for ROIs and for image planes). for ROIs and for image planes).
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(Fluorescence)
inlined_as_list: false identifier: true
any_of: range: string
- range: RoiResponseSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: RoiResponseSeries
tree_root: true tree_root: true
ImageSegmentation: ImageSegmentation:
name: ImageSegmentation name: ImageSegmentation
@ -142,12 +202,19 @@ classes:
is required and ROI names should remain consistent between them. is required and ROI names should remain consistent between them.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(ImageSegmentation)
inlined_as_list: false identifier: true
any_of: range: string
- range: DynamicTable required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: DynamicTable
tree_root: true tree_root: true
ImagingPlane: ImagingPlane:
name: ImagingPlane name: ImagingPlane
@ -156,32 +223,28 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
name: description name: description
description: Description of the imaging plane. description: Description of the imaging plane.
range: text range: text
required: false
multivalued: false
excitation_lambda: excitation_lambda:
name: excitation_lambda name: excitation_lambda
description: Excitation wavelength, in nm. description: Excitation wavelength, in nm.
range: float32 range: float32
required: true required: true
multivalued: false
imaging_rate: imaging_rate:
name: imaging_rate name: imaging_rate
description: Rate that images are acquired, in Hz. description: Rate that images are acquired, in Hz.
range: float32 range: float32
required: true required: true
multivalued: false
indicator: indicator:
name: indicator name: indicator
description: Calcium indicator. description: Calcium indicator.
range: text range: text
required: true required: true
multivalued: false
location: location:
name: location name: location
description: Location of the imaging plane. Specify the area, layer, comments description: Location of the imaging plane. Specify the area, layer, comments
@ -189,31 +252,27 @@ classes:
standard atlas names for anatomical regions when possible. standard atlas names for anatomical regions when possible.
range: text range: text
required: true required: true
multivalued: false
manifold: manifold:
name: manifold name: manifold
description: DEPRECATED Physical position of each pixel. 'xyz' represents description: DEPRECATED Physical position of each pixel. 'xyz' represents
the position of the pixel relative to the defined coordinate space. Deprecated the position of the pixel relative to the defined coordinate space. Deprecated
in favor of origin_coords and grid_spacing. in favor of origin_coords and grid_spacing.
range: ImagingPlane__manifold range: ImagingPlane__manifold
required: false inlined: true
multivalued: false
origin_coords: origin_coords:
name: origin_coords name: origin_coords
description: Physical location of the first element of the imaging plane (0, description: 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 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). what the physical location is relative to (e.g., bregma).
range: ImagingPlane__origin_coords range: ImagingPlane__origin_coords
required: false inlined: true
multivalued: false
grid_spacing: grid_spacing:
name: grid_spacing name: grid_spacing
description: Space between pixels in (x, y) or voxels in (x, y, z) directions, description: 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 in the specified unit. Assumes imaging plane is a regular grid. See also
reference_frame to interpret the grid. reference_frame to interpret the grid.
range: ImagingPlane__grid_spacing range: ImagingPlane__grid_spacing
required: false inlined: true
multivalued: false
reference_frame: reference_frame:
name: reference_frame name: reference_frame
description: Describes reference frame of origin_coords and grid_spacing. description: Describes reference frame of origin_coords and grid_spacing.
@ -234,14 +293,13 @@ classes:
axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral
axis (larger index = more ventral)." axis (larger index = more ventral)."
range: text range: text
required: false
multivalued: false
optical_channel: optical_channel:
name: optical_channel name: optical_channel
description: An optical channel used to record from an imaging plane. description: An optical channel used to record from an imaging plane.
range: OpticalChannel range: OpticalChannel
required: true required: true
multivalued: false inlined: true
inlined_as_list: true
device: device:
name: device name: device
annotations: annotations:
@ -249,7 +307,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -263,6 +321,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(manifold) ifabsent: string(manifold)
identifier: true
range: string range: string
required: true required: true
equals_string: manifold equals_string: manifold
@ -312,6 +371,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(origin_coords) ifabsent: string(origin_coords)
identifier: true
range: string range: string
required: true required: true
equals_string: origin_coords equals_string: origin_coords
@ -339,6 +399,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(grid_spacing) ifabsent: string(grid_spacing)
identifier: true
range: string range: string
required: true required: true
equals_string: grid_spacing equals_string: grid_spacing
@ -364,6 +425,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -371,13 +433,11 @@ classes:
description: Description or other notes about the channel. description: Description or other notes about the channel.
range: text range: text
required: true required: true
multivalued: false
emission_lambda: emission_lambda:
name: emission_lambda name: emission_lambda
description: Emission wavelength for channel, in nm. description: Emission wavelength for channel, in nm.
range: float32 range: float32
required: true required: true
multivalued: false
MotionCorrection: MotionCorrection:
name: MotionCorrection name: MotionCorrection
description: 'An image stack where all frames are shifted (registered) to a common description: 'An image stack where all frames are shifted (registered) to a common
@ -385,10 +445,17 @@ classes:
frame at each point in time is assumed to be 2-D (has only x & y dimensions).' frame at each point in time is assumed to be 2-D (has only x & y dimensions).'
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(MotionCorrection)
inlined_as_list: false identifier: true
any_of: range: string
- range: NWBDataInterface required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: NWBDataInterface
tree_root: true tree_root: true

View file

@ -21,6 +21,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
dimension: dimension:
@ -52,6 +53,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
unit: unit:
@ -75,6 +77,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
bits_per_pixel: bits_per_pixel:
@ -115,6 +118,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(ImagingRetinotopy) ifabsent: string(ImagingRetinotopy)
identifier: true
range: string range: string
required: true required: true
axis_1_phase_map: axis_1_phase_map:
@ -129,7 +133,7 @@ classes:
description: Phase response to stimulus on the first measured axis. description: Phase response to stimulus on the first measured axis.
range: AxisMap range: AxisMap
required: true required: true
multivalued: false inlined: true
axis_1_power_map: axis_1_power_map:
name: axis_1_power_map name: axis_1_power_map
annotations: annotations:
@ -142,8 +146,7 @@ classes:
description: Power response on the first measured axis. Response is scaled description: 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. so 0.0 is no power in the response and 1.0 is maximum relative power.
range: AxisMap range: AxisMap
required: false inlined: true
multivalued: false
axis_2_phase_map: axis_2_phase_map:
name: axis_2_phase_map name: axis_2_phase_map
annotations: annotations:
@ -156,7 +159,7 @@ classes:
description: Phase response to stimulus on the second measured axis. description: Phase response to stimulus on the second measured axis.
range: AxisMap range: AxisMap
required: true required: true
multivalued: false inlined: true
axis_2_power_map: axis_2_power_map:
name: axis_2_power_map name: axis_2_power_map
annotations: annotations:
@ -168,8 +171,7 @@ classes:
value: neurodata_type_inc value: neurodata_type_inc
description: Power response to stimulus on the second measured axis. description: Power response to stimulus on the second measured axis.
range: AxisMap range: AxisMap
required: false inlined: true
multivalued: false
sign_map: sign_map:
name: sign_map name: sign_map
annotations: annotations:
@ -183,7 +185,7 @@ classes:
and axis_2. and axis_2.
range: RetinotopyMap range: RetinotopyMap
required: true required: true
multivalued: false inlined: true
axis_descriptions: axis_descriptions:
name: axis_descriptions name: axis_descriptions
description: Two-element array describing the contents of the two response description: Two-element array describing the contents of the two response
@ -202,7 +204,7 @@ classes:
focal depth, wavelength) as data collection. Array format: [rows][columns].' focal depth, wavelength) as data collection. Array format: [rows][columns].'
range: ImagingRetinotopy__focal_depth_image range: ImagingRetinotopy__focal_depth_image
required: true required: true
multivalued: false inlined: true
vasculature_image: vasculature_image:
name: vasculature_image name: vasculature_image
annotations: annotations:
@ -216,7 +218,7 @@ classes:
[rows][columns]' [rows][columns]'
range: RetinotopyImage range: RetinotopyImage
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
ImagingRetinotopy__focal_depth_image: ImagingRetinotopy__focal_depth_image:
name: ImagingRetinotopy__focal_depth_image name: ImagingRetinotopy__focal_depth_image
@ -227,6 +229,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(focal_depth_image) ifabsent: string(focal_depth_image)
identifier: true
range: string range: string
required: true required: true
equals_string: focal_depth_image equals_string: focal_depth_image

View file

@ -20,6 +20,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -32,6 +33,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
resolution: resolution:
@ -73,6 +75,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -84,6 +87,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
tree_root: true tree_root: true
@ -94,6 +98,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -118,15 +123,14 @@ classes:
external file. external file.
range: TimeSeries__data range: TimeSeries__data
required: true required: true
multivalued: false inlined: true
starting_time: starting_time:
name: starting_time name: starting_time
description: Timestamp of the first sample in seconds. When timestamps are description: Timestamp of the first sample in seconds. When timestamps are
uniformly spaced, the timestamp of the first sample can be specified and uniformly spaced, the timestamp of the first sample can be specified and
all subsequent ones calculated from the sampling rate attribute. all subsequent ones calculated from the sampling rate attribute.
range: TimeSeries__starting_time range: TimeSeries__starting_time
required: false inlined: true
multivalued: false
timestamps: timestamps:
name: timestamps name: timestamps
description: Timestamps for samples stored in data, in seconds, relative to description: Timestamps for samples stored in data, in seconds, relative to
@ -168,8 +172,8 @@ classes:
external to the NWB file, in files storing raw data. Once timestamp data external to the NWB file, in files storing raw data. Once timestamp data
is calculated, the contents of 'sync' are mostly for archival purposes. is calculated, the contents of 'sync' are mostly for archival purposes.
range: TimeSeries__sync range: TimeSeries__sync
required: false inlined: true
multivalued: false inlined_as_list: true
tree_root: true tree_root: true
TimeSeries__data: TimeSeries__data:
name: TimeSeries__data name: TimeSeries__data
@ -180,6 +184,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
@ -244,6 +249,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(starting_time) ifabsent: string(starting_time)
identifier: true
range: string range: string
required: true required: true
equals_string: starting_time equals_string: starting_time
@ -275,6 +281,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(sync) ifabsent: string(sync)
identifier: true
range: string range: string
required: true required: true
equals_string: sync equals_string: sync
@ -283,13 +290,24 @@ classes:
description: A collection of processed data. description: A collection of processed data.
is_a: NWBContainer is_a: NWBContainer
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true identifier: true
inlined_as_list: false range: string
any_of: required: true
- range: NWBDataInterface description:
- range: DynamicTable name: description
description: Description of this collection of processed data.
range: text
required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: NWBDataInterface
- range: DynamicTable
tree_root: true tree_root: true
Images: Images:
name: Images name: Images
@ -299,6 +317,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(Images) ifabsent: string(Images)
identifier: true
range: string range: string
required: true required: true
description: description:

View file

@ -29,6 +29,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
@ -37,13 +38,11 @@ classes:
reference frame. reference frame.
range: SpatialSeries__data range: SpatialSeries__data
required: true required: true
multivalued: false inlined: true
reference_frame: reference_frame:
name: reference_frame name: reference_frame
description: Description defining what exactly 'straight-ahead' means. description: Description defining what exactly 'straight-ahead' means.
range: text range: text
required: false
multivalued: false
tree_root: true tree_root: true
SpatialSeries__data: SpatialSeries__data:
name: SpatialSeries__data name: SpatialSeries__data
@ -53,9 +52,33 @@ classes:
name: name:
name: name name: name
ifabsent: string(data) ifabsent: string(data)
identifier: true
range: string range: string
required: true required: true
equals_string: data equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit: unit:
name: unit name: unit
description: Base unit of measurement for working with the data. The default description: Base unit of measurement for working with the data. The default
@ -91,12 +114,19 @@ classes:
events. BehavioralTimeSeries is for continuous data. events. BehavioralTimeSeries is for continuous data.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralEpochs)
inlined_as_list: false identifier: true
any_of: range: string
- range: IntervalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: IntervalSeries
tree_root: true tree_root: true
BehavioralEvents: BehavioralEvents:
name: BehavioralEvents name: BehavioralEvents
@ -104,12 +134,19 @@ classes:
for more details. for more details.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralEvents)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
BehavioralTimeSeries: BehavioralTimeSeries:
name: BehavioralTimeSeries name: BehavioralTimeSeries
@ -117,36 +154,57 @@ classes:
of <a href="#BehavioralEpochs">BehavioralEpochs</a> for more details. of <a href="#BehavioralEpochs">BehavioralEpochs</a> for more details.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(BehavioralTimeSeries)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
PupilTracking: PupilTracking:
name: PupilTracking name: PupilTracking
description: Eye-tracking data, representing pupil size. description: Eye-tracking data, representing pupil size.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(PupilTracking)
inlined_as_list: false identifier: true
any_of: range: string
- range: TimeSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: TimeSeries
tree_root: true tree_root: true
EyeTracking: EyeTracking:
name: EyeTracking name: EyeTracking
description: Eye-tracking data, representing direction of gaze. description: Eye-tracking data, representing direction of gaze.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(EyeTracking)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true
CompassDirection: CompassDirection:
name: CompassDirection name: CompassDirection
@ -157,22 +215,36 @@ classes:
be radians or degrees. be radians or degrees.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(CompassDirection)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true
Position: Position:
name: Position name: Position
description: Position data, whether along the x, x/y or x/y/z axis. description: Position data, whether along the x, x/y or x/y/z axis.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(Position)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpatialSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpatialSeries
tree_root: true tree_root: true

View file

@ -21,6 +21,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:

View file

@ -25,41 +25,9 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data:
name: data
description: Recorded voltage data.
range: numeric
required: true
multivalued: false
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_channels
- array:
dimensions:
- alias: num_times
- alias: num_channels
- alias: num_samples
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: DynamicTableRegion pointer to the electrodes that this time series
was generated from.
range: DynamicTableRegion
required: true
multivalued: false
channel_conversion: channel_conversion:
name: channel_conversion name: channel_conversion
description: Channel-specific conversion factor. Multiply the data in the description: Channel-specific conversion factor. Multiply the data in the
@ -77,7 +45,87 @@ classes:
range: float32 range: float32
required: false required: false
multivalued: false multivalued: false
data:
name: data
description: Recorded voltage data.
range: ElectricalSeries__data
required: true
inlined: true
electrodes:
name: electrodes
annotations:
named:
tag: named
value: true
source_type:
tag: source_type
value: neurodata_type_inc
description: DynamicTableRegion pointer to the electrodes that this time series
was generated from.
range: DynamicTableRegion
required: true
inlined: true
tree_root: true tree_root: true
ElectricalSeries__data:
name: ElectricalSeries__data
description: Recorded voltage data.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: 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).
ifabsent: string(volts)
range: text
required: true
equals_string: volts
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_times
- array:
dimensions:
- alias: num_times
- alias: num_channels
- array:
dimensions:
- alias: num_times
- alias: num_channels
- alias: num_samples
SpikeEventSeries: SpikeEventSeries:
name: SpikeEventSeries name: SpikeEventSeries
description: 'Stores snapshots/snippets of recorded spike events (i.e., threshold description: 'Stores snapshots/snippets of recorded spike events (i.e., threshold
@ -92,24 +140,15 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
data: data:
name: data name: data
description: Spike waveforms. description: Spike waveforms.
range: numeric range: SpikeEventSeries__data
required: true required: true
multivalued: false inlined: true
any_of:
- array:
dimensions:
- alias: num_events
- alias: num_samples
- array:
dimensions:
- alias: num_events
- alias: num_channels
- alias: num_samples
timestamps: timestamps:
name: timestamps name: timestamps
description: Timestamps for samples stored in data, in seconds, relative to description: Timestamps for samples stored in data, in seconds, relative to
@ -123,6 +162,60 @@ classes:
required: true required: true
multivalued: false multivalued: false
tree_root: true tree_root: true
SpikeEventSeries__data:
name: SpikeEventSeries__data
description: Spike waveforms.
attributes:
name:
name: name
ifabsent: string(data)
identifier: true
range: string
required: true
equals_string: data
conversion:
name: conversion
description: 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.
ifabsent: float(1.0)
range: float32
required: false
resolution:
name: resolution
description: 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.
ifabsent: float(-1.0)
range: float32
required: false
unit:
name: unit
description: Unit of measurement for waveforms, which is fixed to 'volts'.
ifabsent: string(volts)
range: text
required: true
equals_string: volts
value:
name: value
range: numeric
any_of:
- array:
dimensions:
- alias: num_events
- alias: num_samples
- array:
dimensions:
- alias: num_events
- alias: num_channels
- alias: num_samples
FeatureExtraction: FeatureExtraction:
name: FeatureExtraction name: FeatureExtraction
description: Features, such as PC1 and PC2, that are extracted from signals stored description: Features, such as PC1 and PC2, that are extracted from signals stored
@ -132,6 +225,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(FeatureExtraction) ifabsent: string(FeatureExtraction)
identifier: true
range: string range: string
required: true required: true
description: description:
@ -177,7 +271,7 @@ classes:
was generated from. was generated from.
range: DynamicTableRegion range: DynamicTableRegion
required: true required: true
multivalued: false inlined: true
tree_root: true tree_root: true
EventDetection: EventDetection:
name: EventDetection name: EventDetection
@ -187,6 +281,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(EventDetection) ifabsent: string(EventDetection)
identifier: true
range: string range: string
required: true required: true
detection_method: detection_method:
@ -195,7 +290,6 @@ classes:
or dV/dT threshold, as well as relevant values. or dV/dT threshold, as well as relevant values.
range: text range: text
required: true required: true
multivalued: false
source_idx: source_idx:
name: source_idx name: source_idx
description: Indices (zero-based) into source ElectricalSeries::data array description: Indices (zero-based) into source ElectricalSeries::data array
@ -224,7 +318,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: ElectricalSeries - range: ElectricalSeries
- range: string - range: string
@ -236,12 +330,19 @@ classes:
during experiment acquisition. during experiment acquisition.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(EventWaveform)
inlined_as_list: false identifier: true
any_of: range: string
- range: SpikeEventSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: SpikeEventSeries
tree_root: true tree_root: true
FilteredEphys: FilteredEphys:
name: FilteredEphys name: FilteredEphys
@ -258,12 +359,19 @@ classes:
the ElectricalSeries. the ElectricalSeries.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(FilteredEphys)
inlined_as_list: false identifier: true
any_of: range: string
- range: ElectricalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: ElectricalSeries
tree_root: true tree_root: true
LFP: LFP:
name: LFP name: LFP
@ -272,12 +380,19 @@ classes:
properties should be noted in the ElectricalSeries description or comments field. properties should be noted in the ElectricalSeries description or comments field.
is_a: NWBDataInterface is_a: NWBDataInterface
attributes: attributes:
- name: value name:
multivalued: true name: name
inlined: true ifabsent: string(LFP)
inlined_as_list: false identifier: true
any_of: range: string
- range: ElectricalSeries required: true
value:
name: value
multivalued: true
inlined: true
inlined_as_list: false
any_of:
- range: ElectricalSeries
tree_root: true tree_root: true
ElectrodeGroup: ElectrodeGroup:
name: ElectrodeGroup name: ElectrodeGroup
@ -286,6 +401,7 @@ classes:
attributes: attributes:
name: name:
name: name name: name
identifier: true
range: string range: string
required: true required: true
description: description:
@ -304,8 +420,7 @@ classes:
name: position name: position
description: stereotaxic or common framework coordinates description: stereotaxic or common framework coordinates
range: ElectrodeGroup__position range: ElectrodeGroup__position
required: false inlined: true
multivalued: false
device: device:
name: device name: device
annotations: annotations:
@ -313,7 +428,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Device - range: Device
- range: string - range: string
@ -325,6 +440,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(position) ifabsent: string(position)
identifier: true
range: string range: string
required: true required: true
equals_string: position equals_string: position
@ -334,24 +450,18 @@ classes:
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
y: y:
name: y name: y
description: y coordinate description: y coordinate
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
z: z:
name: z name: z
description: z coordinate description: z coordinate
array: array:
exact_number_dimensions: 1 exact_number_dimensions: 1
range: float32 range: float32
required: false
multivalued: false
ClusterWaveforms: ClusterWaveforms:
name: ClusterWaveforms name: ClusterWaveforms
description: DEPRECATED The mean waveform shape, including standard deviation, description: DEPRECATED The mean waveform shape, including standard deviation,
@ -365,6 +475,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(ClusterWaveforms) ifabsent: string(ClusterWaveforms)
identifier: true
range: string range: string
required: true required: true
waveform_filtering: waveform_filtering:
@ -372,7 +483,6 @@ classes:
description: Filtering applied to data before generating mean/sd description: Filtering applied to data before generating mean/sd
range: text range: text
required: true required: true
multivalued: false
waveform_mean: waveform_mean:
name: waveform_mean name: waveform_mean
description: The mean waveform for each cluster, using the same indices for description: The mean waveform for each cluster, using the same indices for
@ -404,7 +514,7 @@ classes:
tag: source_type tag: source_type
value: link value: link
required: true required: true
multivalued: false inlined: true
any_of: any_of:
- range: Clustering - range: Clustering
- range: string - range: string
@ -418,6 +528,7 @@ classes:
name: name:
name: name name: name
ifabsent: string(Clustering) ifabsent: string(Clustering)
identifier: true
range: string range: string
required: true required: true
description: description:
@ -426,7 +537,6 @@ classes:
clusters curated using Klusters, etc) clusters curated using Klusters, etc)
range: text range: text
required: true required: true
multivalued: false
num: num:
name: num name: num
description: Cluster number of each event description: Cluster number of each event

Some files were not shown because too many files have changed in this diff Show more