Skip to content

Commit 8c22a32

Browse files
Merge branch 'v0.3.x' into add-multichannelcontainer
2 parents 42b5e56 + bec5638 commit 8c22a32

26 files changed

+1839
-1027
lines changed

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
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)
815
- Added `MultiChannelMicroscopyContainer` object Sub-Issue[#53](https://github.com/catalystneuro/ndx-microscopy/issues/53)
916

1017
# v0.2.1 (March 28, 2025)

README.md

Lines changed: 86 additions & 65 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`
@@ -38,65 +39,66 @@ A Neurodata Without Borders (NWB) extension for storing microscopy data and asso
3839

3940
## Entity Relationship Diagrams
4041

41-
#### Device and Light Path Components
42+
#### Device Components
4243

4344
```mermaid
4445
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#ffffff', 'primaryBorderColor': '#144E73', 'lineColor': '#D96F32'}}}%%
4546
4647
classDiagram
4748
direction TB
48-
49-
class DeviceModel {
49+
50+
class DeviceModel{
5051
<<Device>>
5152
--------------------------------------
5253
attributes
5354
--------------------------------------
54-
model : text, optional
55+
manufacturer : text
56+
model_number : text, optional
5557
}
56-
57-
class ExcitationLightPath {
58-
<<LabMetaData>>
58+
59+
class DeviceInstance{
60+
<<Device>>
5961
--------------------------------------
6062
attributes
6163
--------------------------------------
62-
**description** : text
64+
serial_number : text, optional
6365
--------------------------------------
6466
links
6567
--------------------------------------
66-
**excitation_source** : ExcitationSource
67-
excitation_filter : OpticalFilter, optional
68-
dichroic_mirror : DichroicMirror, optional
69-
--------------------------------------
70-
methods
71-
--------------------------------------
72-
get_excitation_wavelength()
68+
model : DeviceModel, optional
7369
}
7470
75-
class EmissionLightPath {
76-
<<LabMetaData>>
71+
class MicroscopeModel {
72+
<<DeviceModel>>
73+
}
74+
75+
class Microscope {
76+
<<DeviceInstance>>
7777
--------------------------------------
7878
attributes
7979
--------------------------------------
80-
**description** : text
80+
technique : text, optional
81+
}
82+
83+
class MicroscopyRig {
84+
<<NWBContainer>>
8185
--------------------------------------
82-
groups
86+
attributes
8387
--------------------------------------
84-
**indicator** : Indicator
88+
description : text
8589
--------------------------------------
8690
links
8791
--------------------------------------
88-
**photodetector** : Photodetector
89-
emission_filter : OpticalFilter, optional
92+
microscope : Microscope
93+
excitation_source : ExcitationSource, optional
94+
excitation_filter : OpticalFilter, optional
9095
dichroic_mirror : DichroicMirror, optional
91-
--------------------------------------
92-
methods
93-
--------------------------------------
94-
get_emission_wavelength()
95-
get_indicator_label()
96+
photodetector : Photodetector, optional
97+
emission_filter : OpticalFilter, optional
9698
}
9799
98100
class ExcitationSource {
99-
<<DeviceModel>>
101+
<<DeviceInstance>>
100102
--------------------------------------
101103
attributes
102104
--------------------------------------
@@ -119,7 +121,7 @@ classDiagram
119121
}
120122
121123
class OpticalFilter {
122-
<<DeviceModel>>
124+
<<DeviceInstance>>
123125
--------------------------------------
124126
attributes
125127
--------------------------------------
@@ -147,7 +149,7 @@ classDiagram
147149
}
148150
149151
class DichroicMirror {
150-
<<DeviceModel>>
152+
<<DeviceInstance>>
151153
--------------------------------------
152154
attributes
153155
--------------------------------------
@@ -159,7 +161,7 @@ classDiagram
159161
}
160162
161163
class Photodetector {
162-
<<DeviceModel>>
164+
<<DeviceInstance>>
163165
--------------------------------------
164166
attributes
165167
--------------------------------------
@@ -181,21 +183,15 @@ classDiagram
181183
injection_coordinates_in_mm : float[3], optional
182184
}
183185
184-
DeviceModel <|-- ExcitationSource : extends
185-
DeviceModel <|-- OpticalFilter : extends
186-
DeviceModel <|-- Photodetector : extends
187-
DeviceModel <|-- DichroicMirror : extends
188-
ExcitationSource <|-- PulsedExcitationSource : extends
189-
OpticalFilter <|-- BandOpticalFilter : extends
190-
OpticalFilter <|-- EdgeOpticalFilter : extends
191-
192-
ExcitationLightPath o--> ExcitationSource : links
193-
ExcitationLightPath o--> OpticalFilter : links
194-
ExcitationLightPath o--> DichroicMirror : links
195-
EmissionLightPath o--> Photodetector : links
196-
EmissionLightPath o--> OpticalFilter : links
197-
EmissionLightPath o--> DichroicMirror : links
198-
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
199195
```
200196

201197
#### Illumination Pattern Components
@@ -229,7 +225,7 @@ classDiagram
229225
--------------------------------------
230226
attributes
231227
--------------------------------------
232-
plane_thickness_in_um : float64, optional
228+
point_spread_function_in_um : text, optional
233229
illumination_angle_in_degrees : float64, optional
234230
plane_rate_in_Hz : float64, optional
235231
}
@@ -278,14 +274,29 @@ classDiagram
278274
classDiagram
279275
direction TB
280276
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+
281292
class MicroscopySeries {
282293
<<TimeSeries>>
283294
--------------------------------------
284-
links
295+
groups
285296
--------------------------------------
286-
**microscope** : Microscope
287-
**excitation_light_path** : ExcitationLightPath
288-
**emission_light_path** : EmissionLightPath
297+
**microscopy_rig** : MicroscopyRig
298+
**microscopy_channel** : MicroscopyChannel
299+
289300
}
290301
291302
class PlanarMicroscopySeries {
@@ -355,6 +366,7 @@ classDiagram
355366
datasets
356367
--------------------------------------
357368
pixel_size_in_um : float64[2], optional
369+
dimensions_in_pixels : float64[2], optional
358370
}
359371
360372
class VolumetricImagingSpace {
@@ -363,15 +375,24 @@ classDiagram
363375
datasets
364376
--------------------------------------
365377
voxel_size_in_um : float64[3], optional
378+
dimensions_in_voxels : float64[3], optional
366379
}
367380
368-
class Microscope {
369-
<<Device>>
381+
class MicroscopyRig {
382+
<<NWBContainer>>
370383
--------------------------------------
371384
attributes
372385
--------------------------------------
373-
model : text, optional
374-
technique : text, optional
386+
description : text
387+
--------------------------------------
388+
links
389+
--------------------------------------
390+
microscope : Microscope
391+
excitation_source : ExcitationSource, optional
392+
excitation_filter : OpticalFilter, optional
393+
dichroic_mirror : DichroicMirror, optional
394+
photodetector : Photodetector, optional
395+
emission_filter : OpticalFilter, optional
375396
}
376397
377398
MicroscopySeries <|-- PlanarMicroscopySeries : extends
@@ -383,9 +404,9 @@ classDiagram
383404
VolumetricMicroscopySeries *-- VolumetricImagingSpace : contains
384405
MultiPlaneMicroscopyContainer *-- PlanarMicroscopySeries : contains
385406
MultiChannelMicroscopyContainer *-- MicroscopySeries : contains
386-
MicroscopySeries o--> Microscope : links
387-
MicroscopySeries o--> ExcitationLightPath : links
388-
MicroscopySeries o--> EmissionLightPath : links
407+
MicroscopySeries *-- MicroscopyRig : contains
408+
MicroscopyChannel *-- MicroscopySeries : contains
409+
MicroscopyChannel --* Indicator : contains
389410
```
390411

391412
#### Segmentation Components
@@ -518,7 +539,7 @@ For detailed documentation, including API reference and additional examples, ple
518539

519540
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.
520541

521-
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.
542+
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.
522543

523544
From your local copy directory, use the following commands.
524545

@@ -534,7 +555,7 @@ $ git checkout -b <new_branch>
534555

535556
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
536557

537-
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.
558+
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.
538559
Push your feature branch to origin (i.e. GitHub)
539560

540561
```bash
@@ -543,9 +564,9 @@ $ git push origin <new_branch>
543564

544565
Once you have tested and finalized your changes, create a pull request (PR) targeting dev as the base branch:
545566
Ensure the PR description clearly describes the problem and solution.
546-
Include the relevant issue number if applicable. TIP: Writing e.g. fix #613 will automatically close issue #613 when this PR is merged.
567+
Include the relevant issue number if applicable. TIP: Writing e.g. "fix #613" will automatically close issue #613 when this PR is merged.
547568
Before submitting, please ensure that the code follows the standard coding style of the respective repository.
548-
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].
569+
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]."
549570

550571
Update the CHANGELOG.md regularly to document changes to the extension.
551572

docs/source/api.rst

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,64 @@ This section provides detailed documentation for all classes and methods in the
99
Device Components
1010
===========
1111

12+
MicroscopeModel
13+
---------------
14+
.. autoclass:: ndx_microscopy.MicroscopeModel
15+
:members:
16+
:undoc-members:
17+
:show-inheritance:
18+
1219
Microscope
1320
---------
1421
.. autoclass:: ndx_microscopy.Microscope
1522
:members:
1623
:undoc-members:
1724
:show-inheritance:
1825

19-
Light Path Components
20-
===================
26+
MicroscopyRig
27+
-------------
28+
.. autoclass:: ndx_microscopy.MicroscopyRig
29+
:members:
30+
:undoc-members:
31+
:show-inheritance:
2132

22-
ExcitationLightPath
23-
------------------
24-
.. autoclass:: ndx_microscopy.ExcitationLightPath
33+
MicroscopyChannel
34+
---------------
35+
.. autoclass:: ndx_microscopy.MicroscopyChannel
2536
:members:
2637
:undoc-members:
2738
:show-inheritance:
2839

29-
Methods
30-
^^^^^^^
31-
.. automethod:: ndx_microscopy.ExcitationLightPath.get_excitation_wavelength
40+
Illumination Pattern Components
41+
==========================
3242

33-
EmissionLightPath
43+
IlluminationPattern
3444
----------------
35-
.. autoclass:: ndx_microscopy.EmissionLightPath
45+
.. autoclass:: ndx_microscopy.IlluminationPattern
3646
:members:
3747
:undoc-members:
3848
:show-inheritance:
3949

40-
Methods
41-
^^^^^^^
42-
.. automethod:: ndx_microscopy.EmissionLightPath.get_emission_wavelength
43-
.. automethod:: ndx_microscopy.EmissionLightPath.get_indicator_label
50+
LineScan
51+
-------
52+
.. autoclass:: ndx_microscopy.LineScan
53+
:members:
54+
:undoc-members:
55+
:show-inheritance:
56+
57+
PlaneAcquisition
58+
--------------
59+
.. autoclass:: ndx_microscopy.PlaneAcquisition
60+
:members:
61+
:undoc-members:
62+
:show-inheritance:
63+
64+
RandomAccessScan
65+
--------------
66+
.. autoclass:: ndx_microscopy.RandomAccessScan
67+
:members:
68+
:undoc-members:
69+
:show-inheritance:
4470

4571
Imaging Space Components
4672
=====================

0 commit comments

Comments
 (0)