Skip to content

Commit bc37353

Browse files
NWBEP0004 reviews - part 2 (#74)
* update to pynwb new Device class (old DeviceInstance) * Rename OpticalLens to ObjectiveLens in extensions and namespace files * Add MicroscopyExperimentMetadata * update documentation * Eliminate the reference to one ImagingSpace in the `SegmentationContainer" doc * update doc * add TODO * ruff fixes * Fix import for DynamicTableRegion in mock.py and update type hint in mock_MicroscopyResponseSeries * add static images representation * Add MicroscopyStaticImageContainer and related mock functions * update CHANGELOG * remove MicroscopyStaticImageContainer * update tests * Remove MicroscopyStaticImageContainer definition and references * fixes
1 parent 85a8e15 commit bc37353

File tree

9 files changed

+420
-20
lines changed

9 files changed

+420
-20
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
- **Breaking Change**: `OpticalLens`changed in `ObjectiveLens`
55
- **Breaking Change**: `MicroscopyChannel.indicator` changed from a nested group to a link reference
66
- **Breaking Change**: `MicroscopySeries.microscopy_rig` changed from a nested group to a link reference
7-
- Updated `ndx-ophys-devices` dependency from v0.2.0 to v0.4.0
7+
- Updated `ndx-ophys-devices` dependency from v0.2.0 to < v0.5.0
88

99
## Features
10+
- Added static image support for microscopy experiments:
11+
- `MicroscopyStaticImage`: Base class for static images
12+
- `PlanarMicroscopyStaticImage`: For 2D static images
13+
- `VolumetricMicroscopyStaticImage`: For 3D static images
1014
- Added `MicroscopyExperimentMetadata` (extends `LabMetaData`) as a centralized container for experiment metadata, including:
1115
- `MicroscopyRig` objects
1216
- `ViralVector` objects (from ndx-ophys-devices)

docs/source/format.rst

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,12 +223,16 @@ Container for multiple PlanarMicroscopySeries.
223223
- neurodata_type_def: MultiPlaneMicroscopyContainer
224224
neurodata_type_inc: NWBDataInterface
225225
default_name: MultiPlaneMicroscopyContainer
226-
doc: Imaging data acquired over several depths, regularly or irregularly spaced; for instance, when using an
227-
electrically tunable lens. Each depth scan is stored in a separate PlanarMicroscopySeries object.
226+
doc:
227+
Imaging data acquired over several depths, regularly or irregularly spaced; for instance, when using an
228+
electrically tunable lens. Each depth scan is stored in a separate PlanarMicroscopySeries or PlanarMicroscopyStaticImage object.
228229
groups:
229230
- neurodata_type_inc: PlanarMicroscopySeries
230231
doc: PlanarMicroscopySeries object(s) containing imaging data for a single depth scan.
231-
quantity: "+"
232+
quantity: "*"
233+
- neurodata_type_inc: PlanarMicroscopyStaticImage
234+
doc: PlanarMicroscopyStaticImage object(s) containing imaging data for a single depth scan.
235+
quantity: "*"
232236
233237
MultiChannelMicroscopyContainer
234238
^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -242,11 +246,15 @@ Container for multiple PlanerMicroscopySeries or VolumetricMicroscopySeries acqu
242246
default_name: MultiChannelMicroscopyContainer
243247
doc:
244248
Imaging data acquired over several channels; for instance, when using multiple excitation wavelengths
245-
or multiple indicators. Each channel is stored in a separate PlanarMicroscopySeries or VolumetricMicroscopySeries object.
249+
or multiple indicators. Each channel is stored in a separate PlanarMicroscopySeries, VolumetricMicroscopySeries,
250+
PlanarMicroscopyStaticImage or VolumetricMicroscopyStaticImage.
246251
groups:
247252
- neurodata_type_inc: MicroscopySeries
248253
doc: MicroscopySeries object containing imaging data for a single channel scan.
249-
quantity: "+"
254+
quantity: "*"
255+
- neurodata_type_inc: MicroscopyStaticImage
256+
doc: MicroscopyStaticImage object containing imaging data for a single channel scan.
257+
quantity: "*"
250258
251259
Illumination Pattern Components
252260
--------------------------

spec/ndx-microscopy.extensions.yaml

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,72 @@ groups:
244244
- - 3
245245
quantity: "?"
246246

247+
- neurodata_type_def: MicroscopyStaticImage
248+
neurodata_type_inc: NWBDataInterface
249+
doc:
250+
Abstract class to contain static imaging data acquired from an optical channel in a microscope while a light source illuminates the
251+
imaging space.
252+
attributes:
253+
- name: name
254+
dtype: text
255+
doc: Name of the static image.
256+
- name: description
257+
dtype: text
258+
doc: Description of the static image.
259+
links:
260+
- name: microscopy_rig
261+
doc: Link to a MicroscopyRig object containing metadata about the microscopy rig used to acquire this imaging data.
262+
target_type: MicroscopyRig
263+
groups:
264+
- neurodata_type_inc: MicroscopyChannel
265+
doc: MicroscopyChannel object containing metadata about the channel used to acquire this imaging data.
266+
quantity: 1
267+
268+
- neurodata_type_def: PlanarMicroscopyStaticImage
269+
neurodata_type_inc: MicroscopyStaticImage
270+
doc:
271+
Static imaging data acquired from an optical channel in a microscope while a light source illuminates a
272+
planar imaging space.
273+
datasets:
274+
- name: data
275+
doc: Recorded imaging data, shaped by (frame height, frame width).
276+
dtype: numeric
277+
dims:
278+
- height
279+
- width
280+
shape:
281+
- null
282+
- null
283+
groups:
284+
- neurodata_type_inc: PlanarImagingSpace
285+
doc:
286+
PlanarImagingSpace object containing metadata about the region of physical space this imaging data
287+
was recorded from.
288+
289+
- neurodata_type_def: VolumetricMicroscopyStaticImage
290+
neurodata_type_inc: MicroscopyStaticImage
291+
doc:
292+
Static volumetric imaging data acquired from an optical channel in a microscope while a light source
293+
illuminates a volumetric imaging space.
294+
Assumes the number of depth scans used to construct the volume is regular.
295+
datasets:
296+
- name: data
297+
doc: Recorded imaging data, shaped by (frame height, frame width, number of depth planes).
298+
dtype: numeric
299+
dims:
300+
- height
301+
- width
302+
- depths
303+
shape:
304+
- null
305+
- null
306+
- null
307+
groups:
308+
- neurodata_type_inc: VolumetricImagingSpace
309+
doc:
310+
VolumetricImagingSpace object containing metadata about the region of physical space this imaging data
311+
was recorded from.
312+
247313
- neurodata_type_def: MicroscopySeries
248314
neurodata_type_inc: TimeSeries
249315
doc:
@@ -316,18 +382,24 @@ groups:
316382
groups:
317383
- neurodata_type_inc: PlanarMicroscopySeries
318384
doc: PlanarMicroscopySeries object(s) containing imaging data for a single depth scan.
319-
quantity: "+"
385+
quantity: "*"
386+
- neurodata_type_inc: PlanarMicroscopyStaticImage
387+
doc: PlanarMicroscopyStaticImage object(s) containing imaging data for a single depth scan.
388+
quantity: "*"
320389

321390
- neurodata_type_def: MultiChannelMicroscopyContainer
322391
neurodata_type_inc: NWBDataInterface
323392
default_name: MultiChannelMicroscopyContainer
324393
doc:
325394
Imaging data acquired over several channels; for instance, when using multiple excitation wavelengths
326-
or multiple indicators. Each channel is stored in a separate PlanarMicroscopySeries or VolumetricMicroscopySeries object.
395+
or multiple indicators. Each channel is stored in a separate PlanarMicroscopySeries or VolumetricMicroscopySeries.
327396
groups:
328397
- neurodata_type_inc: MicroscopySeries
329398
doc: MicroscopySeries object containing imaging data for a single channel scan.
330-
quantity: "+"
399+
quantity: "*"
400+
- neurodata_type_inc: MicroscopyStaticImage
401+
doc: MicroscopyStaticImage object containing imaging data for a single channel scan.
402+
quantity: "*"
331403

332404
- neurodata_type_def: SegmentationContainer
333405
neurodata_type_inc: NWBDataInterface

spec/ndx-microscopy.namespace.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ namespaces:
2424
neurodata_types:
2525
- ExcitationSource
2626
- Indicator
27+
- ViralVectorInjection
28+
- ViralVector
2729
- OpticalFilter
2830
- Photodetector
2931
- DichroicMirror

src/pynwb/ndx_microscopy/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@
5555
PlanarImagingSpace = get_class("PlanarImagingSpace", extension_name)
5656
VolumetricImagingSpace = get_class("VolumetricImagingSpace", extension_name)
5757

58+
MicroscopyStaticImage = get_class("MicroscopyStaticImage", extension_name)
59+
PlanarMicroscopyStaticImage = get_class("PlanarMicroscopyStaticImage", extension_name)
60+
VolumetricMicroscopyStaticImage = get_class("VolumetricMicroscopyStaticImage", extension_name)
5861
MicroscopySeries = get_class("MicroscopySeries", extension_name)
5962
PlanarMicroscopySeries = get_class("PlanarMicroscopySeries", extension_name)
6063
VolumetricMicroscopySeries = get_class("VolumetricMicroscopySeries", extension_name)
@@ -91,6 +94,9 @@
9194
"MicroscopySeries",
9295
"PlanarMicroscopySeries",
9396
"VolumetricMicroscopySeries",
97+
"MicroscopyStaticImage",
98+
"PlanarMicroscopyStaticImage",
99+
"VolumetricMicroscopyStaticImage",
94100
"MultiPlaneMicroscopyContainer",
95101
"MultiChannelMicroscopyContainer",
96102
"MicroscopyResponseSeries",

src/pynwb/ndx_microscopy/testing/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
mock_MicroscopyResponseSeriesContainer,
1212
mock_PlanarImagingSpace,
1313
mock_PlanarMicroscopySeries,
14+
mock_PlanarMicroscopyStaticImage,
1415
mock_MultiPlaneMicroscopyContainer,
1516
mock_MultiChannelMicroscopyContainer,
1617
mock_VolumetricImagingSpace,
1718
mock_VolumetricMicroscopySeries,
19+
mock_VolumetricMicroscopyStaticImage,
1820
mock_IlluminationPattern,
1921
mock_LineScan,
2022
mock_PlaneAcquisition,
@@ -33,9 +35,11 @@
3335
"mock_SegmentationContainer",
3436
"mock_Segmentation",
3537
"mock_PlanarMicroscopySeries",
38+
"mock_PlanarMicroscopyStaticImage",
3639
"mock_MultiPlaneMicroscopyContainer",
3740
"mock_MultiChannelMicroscopyContainer",
3841
"mock_VolumetricMicroscopySeries",
42+
"mock_VolumetricMicroscopyStaticImage",
3943
"mock_MicroscopyResponseSeries",
4044
"mock_MicroscopyResponseSeriesContainer",
4145
"mock_IlluminationPattern",

src/pynwb/ndx_microscopy/testing/_mock.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -395,31 +395,58 @@ def mock_PlanarMicroscopySeries(
395395
return planar_microscopy_series
396396

397397

398+
def mock_PlanarMicroscopyStaticImage(
399+
*,
400+
microscopy_rig: ndx_microscopy.MicroscopyRig,
401+
planar_imaging_space: ndx_microscopy.PlanarImagingSpace,
402+
microscopy_channel: ndx_microscopy.MicroscopyChannel,
403+
name: Optional[str] = None,
404+
description: str = "A mock instance of a PlanarMicroscopyStaticImage type to be used for rapid testing.",
405+
data: Optional[np.ndarray] = None,
406+
) -> ndx_microscopy.PlanarMicroscopyStaticImage:
407+
image_name = name or name_generator("PlanarMicroscopyStaticImage")
408+
image_data = data if data is not None else np.ones(shape=(5, 5))
409+
410+
planar_microscopy_static_image = ndx_microscopy.PlanarMicroscopyStaticImage(
411+
name=image_name,
412+
description=description,
413+
microscopy_rig=microscopy_rig,
414+
microscopy_channel=microscopy_channel,
415+
planar_imaging_space=planar_imaging_space,
416+
data=image_data,
417+
)
418+
return planar_microscopy_static_image
419+
420+
398421
def mock_MultiPlaneMicroscopyContainer(
399422
*,
400-
planar_microscopy_series: List[ndx_microscopy.PlanarMicroscopySeries],
423+
planar_microscopy_static_images: Optional[List[ndx_microscopy.PlanarMicroscopyStaticImage]] = None,
424+
planar_microscopy_series: Optional[List[ndx_microscopy.PlanarMicroscopySeries]] = None,
401425
name: Optional[str] = None,
402426
) -> ndx_microscopy.MultiPlaneMicroscopyContainer:
403427
container_name = name or name_generator("MultiPlaneMicroscopyContainer")
404-
405428
multi_plane_microscopy_container = ndx_microscopy.MultiPlaneMicroscopyContainer(
406-
name=container_name, planar_microscopy_series=planar_microscopy_series
429+
name=container_name,
430+
planar_microscopy_static_images=planar_microscopy_static_images,
431+
planar_microscopy_series=planar_microscopy_series,
407432
)
408433

409434
return multi_plane_microscopy_container
410435

411436

412437
def mock_MultiChannelMicroscopyContainer(
413438
*,
414-
microscopy_series: List[ndx_microscopy.MicroscopySeries],
439+
microscopy_static_images: Optional[List[ndx_microscopy.MicroscopyStaticImage]] = None,
440+
microscopy_series: Optional[List[ndx_microscopy.MicroscopySeries]] = None,
415441
name: Optional[str] = None,
416442
) -> ndx_microscopy.MultiChannelMicroscopyContainer:
417443
container_name = name or name_generator("MultiChannelMicroscopyContainer")
418444

419445
multi_channel_microscopy_container = ndx_microscopy.MultiChannelMicroscopyContainer(
420-
name=container_name, microscopy_series=microscopy_series
446+
name=container_name,
447+
microscopy_static_images=microscopy_static_images,
448+
microscopy_series=microscopy_series,
421449
)
422-
423450
return multi_channel_microscopy_container
424451

425452

@@ -476,6 +503,29 @@ def mock_VolumetricMicroscopySeries(
476503
return volumetric_microscopy_series
477504

478505

506+
def mock_VolumetricMicroscopyStaticImage(
507+
*,
508+
microscopy_rig: ndx_microscopy.MicroscopyRig,
509+
volumetric_imaging_space: ndx_microscopy.VolumetricImagingSpace,
510+
microscopy_channel: ndx_microscopy.MicroscopyChannel,
511+
name: Optional[str] = None,
512+
description: str = "A mock instance of a VolumetricMicroscopyStaticImage type to be used for rapid testing.",
513+
data: Optional[np.ndarray] = None,
514+
) -> ndx_microscopy.VolumetricMicroscopyStaticImage:
515+
image_name = name or name_generator("VolumetricMicroscopyStaticImage")
516+
image_data = data if data is not None else np.ones(shape=(5, 5, 5))
517+
518+
volumetric_microscopy_static_image = ndx_microscopy.VolumetricMicroscopyStaticImage(
519+
name=image_name,
520+
description=description,
521+
microscopy_rig=microscopy_rig,
522+
microscopy_channel=microscopy_channel,
523+
volumetric_imaging_space=volumetric_imaging_space,
524+
data=image_data,
525+
)
526+
return volumetric_microscopy_static_image
527+
528+
479529
def mock_MicroscopyResponseSeries(
480530
*,
481531
rois: DynamicTableRegion,

0 commit comments

Comments
 (0)