Skip to content

Commit cabadcf

Browse files
Merge branch 'v0.3.x' into optional-link-in-microscopyresponseseries-to-microscopyseries
2 parents 79e838d + 0c4e3f0 commit cabadcf

26 files changed

+2349
-1172
lines changed

CHANGELOG.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
1-
# v0.3.0 (upcoming)
1+
# v0.3.0 (Jun 3, 2025)
22
## Bug Fixes
33

44
## Deprecations and Changes
5+
- Removed `ExcitationLightPath` and `EmissionLightPath` classes in favor of a more integrated approach with `MicroscopyRig`
56

67
## Features
78
### NWB TAB reviews Issue[#48](https://github.com/catalystneuro/ndx-microscopy/issues/48)
9+
- Added `MicroscopyChannel` object Sub-Issue[#49](https://github.com/catalystneuro/ndx-microscopy/issues/49)
10+
- Added `MicroscopyRig` object Sub-Issue[#51](https://github.com/catalystneuro/ndx-microscopy/issues/51)
11+
- Changed `Microscope` to inherit from `DeviceInstance` instead of `Device` Sub-Issue[#51](https://github.com/catalystneuro/ndx-microscopy/issues/51)
12+
- Added `MicroscopeModel` that inherit from `DeviceModel` Sub-Issue[#51](https://github.com/catalystneuro/ndx-microscopy/issues/51)
13+
- Updated `MicroscopySeries` to use `MicroscopyRig` instead of individual `microscope`, `excitation_light_path`, and `emission_light_path` references Sub-Issue[#51](https://github.com/catalystneuro/ndx-microscopy/issues/51)
14+
- Added `dimensions_in_pixels` to `PlanarImagingSpace` and `dimensions_in_voxels` to `VolumetricImagingSpace` object Sub-Issue[#52](https://github.com/catalystneuro/ndx-microscopy/issues/52)
15+
- Added `MultiChannelMicroscopyContainer` object Sub-Issue[#53](https://github.com/catalystneuro/ndx-microscopy/issues/53)
16+
- Refactored segmentation classes: Sub-Issue[#56](https://github.com/catalystneuro/ndx-microscopy/issues/56)
17+
- Renamed `Segmentation2D` to `PlanarSegmentation`
18+
- Renamed `Segmentation3D` to `VolumetricSegmentation`
19+
- Added `get_FOV_size()` method to both `PlanarImagingSpace` and `VolumetricImagingSpace` classes for calculating Field of View size in micrometers Sub-Issue[#53](https://github.com/catalystneuro/ndx-microscopy/issues/53)
820
- Added `microscopy_series` link to `MicroscopyResponseSeries` class Sub-Issue[#58](https://github.com/catalystneuro/ndx-microscopy/issues/58)
921

1022
# v0.2.1 (March 28, 2025)

README.md

Lines changed: 113 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@ A Neurodata Without Borders (NWB) extension for storing microscopy data and asso
66

77
**Comprehensive Neurodata Types**
88
- Microscope and optical component metadata (integration with [ndx-ophys-devices](https://github.com/catalystneuro/ndx-ophys-devices)):
9+
- `MicroscopeModel`
910
- `Microscope`
11+
- `MicroscopyRig`
1012
- `ExcitationSource` / `PulsedExcitationSource`
1113
- `BandOpticalFilter` / `EdgeOpticalFilter` /
1214
- `DichroicMirror`
1315
- `Photodetector`
1416
- `Indicator`
15-
- Advanced light path configurations:
16-
- `ExcitationLightPath`
17-
- `EmissionLightPath`
17+
- Microscopy channel configurations:
18+
- `MicroscopyChannel`
1819
- Imaging space definitions:
1920
- `PlanarImagingSpace`
2021
- `VolumetricImagingSpace`
@@ -27,75 +28,77 @@ A Neurodata Without Borders (NWB) extension for storing microscopy data and asso
2728
- `PlanarMicroscopySeries`
2829
- `VolumetricMicroscopySeries`
2930
- `MultiPlaneMicroscopyContainer`
31+
- `MultiChannelMicroscopyContainer`
3032
- ROI/segmentation storage:
31-
- `Segmentation2D`
32-
- `Segmentation3D`
33+
- `PlanarSegmentation`
34+
- `VolumetricSegmentation`
3335
- `SegmentationContainer`
3436
- `MicroscopyResponseSeries`
3537
- `MicroscopyResponseSeriesContainer`
3638
- Abstract Neurodata types: `ImagingSpace`, `MicroscopySeries`,`Segmentation`
3739

3840
## Entity Relationship Diagrams
3941

40-
#### Device and Light Path Components
42+
#### Device Components
4143

4244
```mermaid
4345
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#ffffff', 'primaryBorderColor': '#144E73', 'lineColor': '#D96F32'}}}%%
4446
4547
classDiagram
4648
direction TB
47-
48-
class DeviceModel {
49+
50+
class DeviceModel{
4951
<<Device>>
5052
--------------------------------------
5153
attributes
5254
--------------------------------------
53-
model : text, optional
55+
manufacturer : text
56+
model_number : text, optional
5457
}
55-
56-
class ExcitationLightPath {
57-
<<LabMetaData>>
58+
59+
class DeviceInstance{
60+
<<Device>>
5861
--------------------------------------
5962
attributes
6063
--------------------------------------
61-
**description** : text
64+
serial_number : text, optional
6265
--------------------------------------
6366
links
6467
--------------------------------------
65-
**excitation_source** : ExcitationSource
66-
excitation_filter : OpticalFilter, optional
67-
dichroic_mirror : DichroicMirror, optional
68-
--------------------------------------
69-
methods
70-
--------------------------------------
71-
get_excitation_wavelength()
68+
model : DeviceModel, optional
69+
}
70+
71+
class MicroscopeModel {
72+
<<DeviceModel>>
7273
}
7374
74-
class EmissionLightPath {
75-
<<LabMetaData>>
75+
class Microscope {
76+
<<DeviceInstance>>
7677
--------------------------------------
7778
attributes
7879
--------------------------------------
79-
**description** : text
80+
technique : text, optional
81+
}
82+
83+
class MicroscopyRig {
84+
<<NWBContainer>>
8085
--------------------------------------
81-
groups
86+
attributes
8287
--------------------------------------
83-
**indicator** : Indicator
88+
description : text
8489
--------------------------------------
8590
links
8691
--------------------------------------
87-
**photodetector** : Photodetector
88-
emission_filter : OpticalFilter, optional
92+
microscope : Microscope
93+
excitation_source : ExcitationSource, optional
94+
excitation_filter : OpticalFilter, optional
8995
dichroic_mirror : DichroicMirror, optional
90-
--------------------------------------
91-
methods
92-
--------------------------------------
93-
get_emission_wavelength()
94-
get_indicator_label()
96+
photodetector : Photodetector, optional
97+
emission_filter : OpticalFilter, optional
9598
}
9699
97100
class ExcitationSource {
98-
<<DeviceModel>>
101+
<<DeviceInstance>>
99102
--------------------------------------
100103
attributes
101104
--------------------------------------
@@ -118,7 +121,7 @@ classDiagram
118121
}
119122
120123
class OpticalFilter {
121-
<<DeviceModel>>
124+
<<DeviceInstance>>
122125
--------------------------------------
123126
attributes
124127
--------------------------------------
@@ -146,7 +149,7 @@ classDiagram
146149
}
147150
148151
class DichroicMirror {
149-
<<DeviceModel>>
152+
<<DeviceInstance>>
150153
--------------------------------------
151154
attributes
152155
--------------------------------------
@@ -158,7 +161,7 @@ classDiagram
158161
}
159162
160163
class Photodetector {
161-
<<DeviceModel>>
164+
<<DeviceInstance>>
162165
--------------------------------------
163166
attributes
164167
--------------------------------------
@@ -180,21 +183,15 @@ classDiagram
180183
injection_coordinates_in_mm : float[3], optional
181184
}
182185
183-
DeviceModel <|-- ExcitationSource : extends
184-
DeviceModel <|-- OpticalFilter : extends
185-
DeviceModel <|-- Photodetector : extends
186-
DeviceModel <|-- DichroicMirror : extends
187-
ExcitationSource <|-- PulsedExcitationSource : extends
188-
OpticalFilter <|-- BandOpticalFilter : extends
189-
OpticalFilter <|-- EdgeOpticalFilter : extends
190-
191-
ExcitationLightPath o--> ExcitationSource : links
192-
ExcitationLightPath o--> OpticalFilter : links
193-
ExcitationLightPath o--> DichroicMirror : links
194-
EmissionLightPath o--> Photodetector : links
195-
EmissionLightPath o--> OpticalFilter : links
196-
EmissionLightPath o--> DichroicMirror : links
197-
EmissionLightPath *-- Indicator : contains
186+
DeviceModel <|-- MicroscopeModel : extends
187+
DeviceInstance <|-- Microscope : extends
188+
189+
Microscope o--> MicroscopeModel : links
190+
MicroscopyRig o--> Microscope : links
191+
MicroscopyRig o--> ExcitationSource : links
192+
MicroscopyRig o--> OpticalFilter : links
193+
MicroscopyRig o--> DichroicMirror : links
194+
MicroscopyRig o--> Photodetector : links
198195
```
199196

200197
#### Illumination Pattern Components
@@ -228,7 +225,7 @@ classDiagram
228225
--------------------------------------
229226
attributes
230227
--------------------------------------
231-
plane_thickness_in_um : float64, optional
228+
point_spread_function_in_um : text, optional
232229
illumination_angle_in_degrees : float64, optional
233230
plane_rate_in_Hz : float64, optional
234231
}
@@ -277,14 +274,29 @@ classDiagram
277274
classDiagram
278275
direction TB
279276
277+
class MicroscopyChannel {
278+
<<NWBContainer>>
279+
--------------------------------------
280+
attributes
281+
--------------------------------------
282+
**name** : text
283+
description : text, optional
284+
**excitation_wavelength_in_nm** : float
285+
**emission_wavelength_in_nm** : float
286+
--------------------------------------
287+
groups
288+
--------------------------------------
289+
indicator
290+
}
291+
280292
class MicroscopySeries {
281293
<<TimeSeries>>
282294
--------------------------------------
283-
links
295+
groups
284296
--------------------------------------
285-
**microscope** : Microscope
286-
**excitation_light_path** : ExcitationLightPath
287-
**emission_light_path** : EmissionLightPath
297+
**microscopy_rig** : MicroscopyRig
298+
**microscopy_channel** : MicroscopyChannel
299+
288300
}
289301
290302
class PlanarMicroscopySeries {
@@ -319,6 +331,15 @@ classDiagram
319331
**planar_microscopy_series** : PlanarMicroscopySeries[1..*]
320332
}
321333
334+
335+
class MultiChannelMicroscopyContainer {
336+
<<NWBDataInterface>>
337+
--------------------------------------
338+
groups
339+
--------------------------------------
340+
**microscopy_series** : MicroscopySeries[1..*]
341+
}
342+
322343
class ImagingSpace {
323344
<<NWBContainer>>
324345
--------------------------------------
@@ -345,6 +366,11 @@ classDiagram
345366
datasets
346367
--------------------------------------
347368
pixel_size_in_um : float64[2], optional
369+
dimensions_in_pixels : float64[2], optional
370+
--------------------------------------
371+
methods
372+
--------------------------------------
373+
get_FOV_size()
348374
}
349375
350376
class VolumetricImagingSpace {
@@ -353,15 +379,28 @@ classDiagram
353379
datasets
354380
--------------------------------------
355381
voxel_size_in_um : float64[3], optional
382+
dimensions_in_voxels : float64[3], optional
383+
--------------------------------------
384+
methods
385+
--------------------------------------
386+
get_FOV_size()
356387
}
357388
358-
class Microscope {
359-
<<Device>>
389+
class MicroscopyRig {
390+
<<NWBContainer>>
360391
--------------------------------------
361392
attributes
362393
--------------------------------------
363-
model : text, optional
364-
technique : text, optional
394+
description : text
395+
--------------------------------------
396+
links
397+
--------------------------------------
398+
microscope : Microscope
399+
excitation_source : ExcitationSource, optional
400+
excitation_filter : OpticalFilter, optional
401+
dichroic_mirror : DichroicMirror, optional
402+
photodetector : Photodetector, optional
403+
emission_filter : OpticalFilter, optional
365404
}
366405
367406
MicroscopySeries <|-- PlanarMicroscopySeries : extends
@@ -372,9 +411,10 @@ classDiagram
372411
PlanarMicroscopySeries *-- PlanarImagingSpace : contains
373412
VolumetricMicroscopySeries *-- VolumetricImagingSpace : contains
374413
MultiPlaneMicroscopyContainer *-- PlanarMicroscopySeries : contains
375-
MicroscopySeries o--> Microscope : links
376-
MicroscopySeries o--> ExcitationLightPath : links
377-
MicroscopySeries o--> EmissionLightPath : links
414+
MultiChannelMicroscopyContainer *-- MicroscopySeries : contains
415+
MicroscopySeries *-- MicroscopyRig : contains
416+
MicroscopyChannel *-- MicroscopySeries : contains
417+
MicroscopyChannel --* Indicator : contains
378418
```
379419

380420
#### Segmentation Components
@@ -397,7 +437,7 @@ classDiagram
397437
summary_images : SummaryImage[0..*]
398438
}
399439
400-
class Segmentation2D {
440+
class PlanarSegmentation {
401441
<<Segmentation>>
402442
--------------------------------------
403443
datasets
@@ -418,7 +458,7 @@ classDiagram
418458
image_to_pixel()
419459
}
420460
421-
class Segmentation3D {
461+
class VolumetricSegmentation {
422462
<<Segmentation>>
423463
--------------------------------------
424464
datasets
@@ -484,14 +524,14 @@ classDiagram
484524
**microscopy_response_series** : MicroscopyResponseSeries[1..*]
485525
}
486526
487-
Segmentation <|-- Segmentation2D : extends
488-
Segmentation <|-- Segmentation3D : extends
527+
Segmentation <|-- PlanarSegmentation : extends
528+
Segmentation <|-- VolumetricSegmentation : extends
489529
SegmentationContainer *-- Segmentation : contains
490530
Segmentation *-- SummaryImage : contains
491531
MicroscopyResponseSeries o--> MicroscopySeries : links
492532
MicroscopyResponseSeriesContainer *-- MicroscopyResponseSeries : contains
493-
Segmentation2D *-- PlanarImagingSpace : contains
494-
Segmentation3D *-- VolumetricImagingSpace : contains
533+
PlanarSegmentation *-- PlanarImagingSpace : contains
534+
VolumetricSegmentation *-- VolumetricImagingSpace : contains
495535
```
496536

497537
---
@@ -512,7 +552,7 @@ For detailed documentation, including API reference and additional examples, ple
512552

513553
To help ensure a smooth Pull Request (PR) process, please always begin by raising an issue on the main repository so we can openly discuss any problems/additions before taking action.
514554

515-
The main branch of ndx-microscopy is protected; you cannot push to it directly. You must upload your changes by pushing a new branch, then submit your changes to the main branch via a Pull Request. This allows us to conduct automated testing of your contribution, and gives us a space for developers to discuss the contribution and request changes. If you decide to tackle an issue, please make yourself an assignee on the issue to communicate this to the team. Dont worry - this does not commit you to solving this issue. It just lets others know who they should talk to about it.
555+
The main branch of ndx-microscopy is protected; you cannot push to it directly. You must upload your changes by pushing a new branch, then submit your changes to the main branch via a Pull Request. This allows us to conduct automated testing of your contribution, and gives us a space for developers to discuss the contribution and request changes. If you decide to tackle an issue, please make yourself an assignee on the issue to communicate this to the team. Don't worry - this does not commit you to solving this issue. It just lets others know who they should talk to about it.
516556

517557
From your local copy directory, use the following commands.
518558

@@ -528,7 +568,7 @@ $ git checkout -b <new_branch>
528568

529569
Make your changes. Add new objects related to optical experiment or add more attributes on the existing ones. To speed up the process, you can write mock function (see _mock.py) that would be used to test the new neurodata type
530570

531-
We will automatically run tests to ensure that your contributions didnt break anything and that they follow our style guide. You can speed up the testing cycle by running these tests locally on your own computer by calling pytest from the top-level directory.
571+
We will automatically run tests to ensure that your contributions didn't break anything and that they follow our style guide. You can speed up the testing cycle by running these tests locally on your own computer by calling pytest from the top-level directory.
532572
Push your feature branch to origin (i.e. GitHub)
533573

534574
```bash
@@ -537,9 +577,9 @@ $ git push origin <new_branch>
537577

538578
Once you have tested and finalized your changes, create a pull request (PR) targeting dev as the base branch:
539579
Ensure the PR description clearly describes the problem and solution.
540-
Include the relevant issue number if applicable. TIP: Writing e.g. fix #613 will automatically close issue #613 when this PR is merged.
580+
Include the relevant issue number if applicable. TIP: Writing e.g. "fix #613" will automatically close issue #613 when this PR is merged.
541581
Before submitting, please ensure that the code follows the standard coding style of the respective repository.
542-
If you would like help with your contribution, or would like to communicate contributions that are not ready to merge, submit a PR where the title begins with [WIP].
582+
If you would like help with your contribution, or would like to communicate contributions that are not ready to merge, submit a PR where the title begins with "[WIP]."
543583

544584
Update the CHANGELOG.md regularly to document changes to the extension.
545585

0 commit comments

Comments
 (0)