From 3e863258063cd0fdbbc6df5d035326cf44f3ce9f Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 23 Jul 2025 10:24:01 -0400 Subject: [PATCH 01/20] Add ndtypes from ndx-pose, ndx-photometry, ndx-fiber-photometry --- dandi/metadata/util.py | 34 ++++++++++++++++++++++++++-- dandi/tests/test_metadata.py | 44 ++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 5e63fd9aa..ee194699f 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -828,9 +828,9 @@ class Neurodatum(TypedDict): "technique": "fourier analysis technique", "approach": None, }, - "OptogeneticStimulusSIte": { + "OptogeneticStimulusSite": { "module": "ogen", - "neurodata_type": "OptogeneticStimulusSIte", + "neurodata_type": "OptogeneticStimulusSite", "technique": None, "approach": "optogenetic approach", }, @@ -840,6 +840,36 @@ class Neurodatum(TypedDict): "technique": None, "approach": "optogenetic approach", }, + "PoseEstimationSeries": { + "module": "ndx-pose", + "neurodata_type": "PoseEstimationSeries", + "technique": "pose estimation technique", + "approach": "behavioral approach", + }, + "PoseEstimation": { + "module": "ndx-pose", + "neurodata_type": "PoseEstimation", + "technique": "pose estimation technique", + "approach": "behavioral approach", + }, + "PoseTraining": { + "module": "ndx-pose", + "neurodata_type": "PoseTraining", + "technique": "pose estimation technique", + "approach": "behavioral approach", + }, + "FiberPhotometryResponseSeries": { + "module": "ndx-fiber-photometry", + "neurodata_type": "FiberPhotometryResponseSeries", + "technique": "fiber photometry technique; optical technique", + "approach": "calcium imaging; cell population imaging", + }, + "FiberPhotometryResponseSeries_old": { + "module": "ndx-photometry", # deprecated and replaced by ndx-fiber-photometry + "neurodata_type": "FiberPhotometryResponseSeries", + "technique": "fiber photometry technique; optical technique", + "approach": "calcium imaging; cell population imaging", + }, } diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index 5c20acf0d..896e9c379 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -788,11 +788,11 @@ def test_species_map(): }, ), ( - ["OptogeneticStimulusSIte"], + ["OptogeneticStimulusSite"], { "approach": ["optogenetic approach"], "measurementTechnique": None, - "variableMeasured": ["OptogeneticStimulusSIte"], + "variableMeasured": ["OptogeneticStimulusSite"], }, ), ( @@ -803,6 +803,46 @@ def test_species_map(): "variableMeasured": ["OptogeneticSeries"], }, ), + ( + ["PoseEstimationSeries"], + { + "approach": ["behavioral approach"], + "measurementTechnique": ["pose estimation technique"], + "variableMeasured": ["PoseEstimationSeries"], + }, + ), + ( + ["PoseEstimation"], + { + "approach": ["behavioral approach"], + "measurementTechnique": ["pose estimation technique"], + "variableMeasured": ["PoseEstimation"], + }, + ), + ( + ["PoseTraining"], + { + "approach": ["behavioral approach"], + "measurementTechnique": ["pose estimation technique"], + "variableMeasured": ["PoseTraining"], + }, + ), + ( + ["FiberPhotometryResponseSeries"], + { + "approach": ["fiber photometry technique; optical technique"], + "measurementTechnique": ["calcium imaging; cell population imaging"], + "variableMeasured": ["FiberPhotometryResponseSeries"], + }, + ), + ( + ["FiberPhotometryResponseSeries_old"], + { + "approach": ["fiber photometry technique; optical technique"], + "measurementTechnique": ["calcium imaging; cell population imaging"], + "variableMeasured": ["FiberPhotometryResponseSeries"], + }, + ), ( # the tricky case of having number of instances of the data type # https://github.com/dandi/dandi-cli/issues/890 From 3d7baea85ea81ff0182dbfa8711ce1cb66151355 Mon Sep 17 00:00:00 2001 From: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com> Date: Tue, 26 Aug 2025 09:33:51 -0400 Subject: [PATCH 02/20] Update dandi/metadata/util.py --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index ee194699f..dfbf3f4f3 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -841,7 +841,7 @@ class Neurodatum(TypedDict): "approach": "optogenetic approach", }, "PoseEstimationSeries": { - "module": "ndx-pose", + "module": "behavior", "neurodata_type": "PoseEstimationSeries", "technique": "pose estimation technique", "approach": "behavioral approach", From 1b99658c0d36c9892be6a86d204803d4258ab69b Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:16:26 -0700 Subject: [PATCH 03/20] Update dandi/metadata/util.py Co-authored-by: Yaroslav Halchenko --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index dfbf3f4f3..2f3141e97 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -847,7 +847,7 @@ class Neurodatum(TypedDict): "approach": "behavioral approach", }, "PoseEstimation": { - "module": "ndx-pose", + "module": "motion", "neurodata_type": "PoseEstimation", "technique": "pose estimation technique", "approach": "behavioral approach", From d360e2d61d094aed64b9a7ed70bacde0ffb0d620 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:16:34 -0700 Subject: [PATCH 04/20] Update dandi/metadata/util.py Co-authored-by: Yaroslav Halchenko --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 2f3141e97..1c8b29e43 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -859,7 +859,7 @@ class Neurodatum(TypedDict): "approach": "behavioral approach", }, "FiberPhotometryResponseSeries": { - "module": "ndx-fiber-photometry", + "module": "fiberphotometry", "neurodata_type": "FiberPhotometryResponseSeries", "technique": "fiber photometry technique; optical technique", "approach": "calcium imaging; cell population imaging", From 5e4875962b89a6e2b93d1d05ab9612f0aacf1257 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:16:40 -0700 Subject: [PATCH 05/20] Update dandi/metadata/util.py Co-authored-by: Yaroslav Halchenko --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 1c8b29e43..69eb0f3d4 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -865,7 +865,7 @@ class Neurodatum(TypedDict): "approach": "calcium imaging; cell population imaging", }, "FiberPhotometryResponseSeries_old": { - "module": "ndx-photometry", # deprecated and replaced by ndx-fiber-photometry + "module": "fiberphotometry", "neurodata_type": "FiberPhotometryResponseSeries", "technique": "fiber photometry technique; optical technique", "approach": "calcium imaging; cell population imaging", From 21b1d99cc2f92ab8838013745ebe1819d6f67422 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:16:47 -0700 Subject: [PATCH 06/20] Update dandi/metadata/util.py Co-authored-by: Yaroslav Halchenko --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 69eb0f3d4..6469d141c 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -853,7 +853,7 @@ class Neurodatum(TypedDict): "approach": "behavioral approach", }, "PoseTraining": { - "module": "ndx-pose", + "module": "motion", "neurodata_type": "PoseTraining", "technique": "pose estimation technique", "approach": "behavioral approach", From 20394ffc01a49cb376a25c2f01274190e2bbcc2c Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:25:15 -0700 Subject: [PATCH 07/20] Update metadata for various neurodata types --- dandi/metadata/util.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 6469d141c..0c165db08 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -823,7 +823,7 @@ class Neurodatum(TypedDict): "approach": "electrophysiological approach", }, "Spectrum": { - "module": "ndx-spectrum", + "module": "spectrum", "neurodata_type": "Spectrum", "technique": "fourier analysis technique", "approach": None, @@ -837,11 +837,11 @@ class Neurodatum(TypedDict): "OptogeneticSeries": { "module": "ogen", "neurodata_type": "OptogeneticSeries", - "technique": None, + "technique": "optogenetic stimulation technique", "approach": "optogenetic approach", }, "PoseEstimationSeries": { - "module": "behavior", + "module": "motion", "neurodata_type": "PoseEstimationSeries", "technique": "pose estimation technique", "approach": "behavioral approach", @@ -855,17 +855,12 @@ class Neurodatum(TypedDict): "PoseTraining": { "module": "motion", "neurodata_type": "PoseTraining", - "technique": "pose estimation technique", + "technique": None, # this data often consists of human-labeled points on images "approach": "behavioral approach", }, "FiberPhotometryResponseSeries": { "module": "fiberphotometry", - "neurodata_type": "FiberPhotometryResponseSeries", - "technique": "fiber photometry technique; optical technique", - "approach": "calcium imaging; cell population imaging", - }, - "FiberPhotometryResponseSeries_old": { - "module": "fiberphotometry", + # this can come from both the old ndx-photometry and the new ndx-fiber-photometry "neurodata_type": "FiberPhotometryResponseSeries", "technique": "fiber photometry technique; optical technique", "approach": "calcium imaging; cell population imaging", From 6ad64c1e7befdd0f44d5a20801735e6cc5286ecd Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:30:29 -0700 Subject: [PATCH 08/20] Update test_metadata.py --- dandi/tests/test_metadata.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index 896e9c379..7ddb5c7f8 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -799,7 +799,7 @@ def test_species_map(): ["OptogeneticSeries"], { "approach": ["optogenetic approach"], - "measurementTechnique": None, + "measurementTechnique": ["optogenetic stimulation technique"], "variableMeasured": ["OptogeneticSeries"], }, ), @@ -823,7 +823,7 @@ def test_species_map(): ["PoseTraining"], { "approach": ["behavioral approach"], - "measurementTechnique": ["pose estimation technique"], + "measurementTechnique": [], "variableMeasured": ["PoseTraining"], }, ), @@ -835,14 +835,6 @@ def test_species_map(): "variableMeasured": ["FiberPhotometryResponseSeries"], }, ), - ( - ["FiberPhotometryResponseSeries_old"], - { - "approach": ["fiber photometry technique; optical technique"], - "measurementTechnique": ["calcium imaging; cell population imaging"], - "variableMeasured": ["FiberPhotometryResponseSeries"], - }, - ), ( # the tricky case of having number of instances of the data type # https://github.com/dandi/dandi-cli/issues/890 From 0648a4045a0e831e5d17c501880194b7665b1d65 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:32:28 -0700 Subject: [PATCH 09/20] Fix whitespace lint error --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 0c165db08..e8dad6b94 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -855,7 +855,7 @@ class Neurodatum(TypedDict): "PoseTraining": { "module": "motion", "neurodata_type": "PoseTraining", - "technique": None, # this data often consists of human-labeled points on images + "technique": None, # this data often consists of human-labeled points on images "approach": "behavioral approach", }, "FiberPhotometryResponseSeries": { From 7dddd60f574cb0c52e7a8ab94deab5c1dba00346 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:33:57 -0700 Subject: [PATCH 10/20] Update technique description for PoseTraining --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index e8dad6b94..064ded426 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -855,7 +855,7 @@ class Neurodatum(TypedDict): "PoseTraining": { "module": "motion", "neurodata_type": "PoseTraining", - "technique": None, # this data often consists of human-labeled points on images + "technique": "pose estimation training technique", "approach": "behavioral approach", }, "FiberPhotometryResponseSeries": { From 7fcddb8f1416c2faf0b8a5078e0659c666b7b397 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 14:34:15 -0700 Subject: [PATCH 11/20] Update test_metadata.py --- dandi/tests/test_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index 7ddb5c7f8..ed9de894d 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -823,7 +823,7 @@ def test_species_map(): ["PoseTraining"], { "approach": ["behavioral approach"], - "measurementTechnique": [], + "measurementTechnique": ["pose estimation training technique"], "variableMeasured": ["PoseTraining"], }, ), From c2688424d379b53cda1a271e8fea9459c8e69660 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 27 Aug 2025 21:39:40 -0700 Subject: [PATCH 12/20] Update test_metadata.py --- dandi/tests/test_metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index ed9de894d..fb80fb99b 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -830,8 +830,8 @@ def test_species_map(): ( ["FiberPhotometryResponseSeries"], { - "approach": ["fiber photometry technique; optical technique"], - "measurementTechnique": ["calcium imaging; cell population imaging"], + "approach": ["calcium imaging; cell population imaging"], + "measurementTechnique": ["fiber photometry technique; optical technique"], "variableMeasured": ["FiberPhotometryResponseSeries"], }, ), From f8490a9cdd0eee57a34bb7d2566289b901a2c12b Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 17 Sep 2025 05:46:11 -0700 Subject: [PATCH 13/20] Change Units module from 'misc' to 'sortedunits' --- dandi/metadata/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index ea6fe2e72..9b7d3a7da 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -823,7 +823,7 @@ class Neurodatum(TypedDict): "approach": None, }, "Units": { - "module": "misc", + "module": "sortedunits", "neurodata_type": "Units", "technique": "spike sorting technique", "approach": "electrophysiological approach", From 4269177b7854d20d83cf26ea97286252122d1e4b Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 17 Sep 2025 06:17:08 -0700 Subject: [PATCH 14/20] Add draft more complete neurodata type map --- dandi/metadata/neurodata_typemap.py | 1201 +++++++++++++++++++++++++++ 1 file changed, 1201 insertions(+) create mode 100644 dandi/metadata/neurodata_typemap.py diff --git a/dandi/metadata/neurodata_typemap.py b/dandi/metadata/neurodata_typemap.py new file mode 100644 index 000000000..607c2e6fb --- /dev/null +++ b/dandi/metadata/neurodata_typemap.py @@ -0,0 +1,1201 @@ +neurodata_typemap: dict[str, dict[str, str | None]] = { + # base module + "NWBFile": { + "module": "base", + "neurodata_type": "NWBFile", + "technique": None, + "approach": None, + }, + "ProcessingModule": { + "module": "base", + "neurodata_type": "ProcessingModule", + "technique": "analytical technique", + "approach": None, + }, + "TimeSeries": { + "module": "base", + "neurodata_type": "TimeSeries", + "technique": None, + "approach": None, + }, + + # behavior module + "AnnotatedEventsTable": { + "module": "behavior", + "neurodata_type": "AnnotatedEventsTable", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "BehavioralEpochs": { + "module": "behavior", + "neurodata_type": "BehavioralEpochs", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "BehavioralEvents": { + "module": "behavior", + "neurodata_type": "BehavioralEvents", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "BehavioralTimeSeries": { + "module": "behavior", + "neurodata_type": "BehavioralTimeSeries", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "CompassDirection": { + "module": "behavior", + "neurodata_type": "CompassDirection", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "EllipseEyeTracking": { + "module": "behavior", + "neurodata_type": "EllipseEyeTracking", + "technique": "eye tracking technique", + "approach": "behavioral approach", + }, + "EllipseSeries": { + "module": "behavior", + "neurodata_type": "EllipseSeries", + "technique": "eye tracking technique", + "approach": "behavioral approach", + }, + "EventTypesTable": { + "module": "behavior", + "neurodata_type": "EventTypesTable", + "technique": None, + "approach": "behavioral approach", + }, + "Eventlog": { + "module": "behavior", + "neurodata_type": "Eventlog", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "Events": { + "module": "behavior", + "neurodata_type": "Events", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "EventsTable": { + "module": "behavior", + "neurodata_type": "EventsTable", + "technique": None, + "approach": "behavioral approach", + }, + "EyeTracking": { + "module": "behavior", + "neurodata_type": "EyeTracking", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "LabeledEvents": { + "module": "behavior", + "neurodata_type": "LabeledEvents", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "MoSeqExtractGroup": { + "module": "behavior", + "neurodata_type": "MoSeqExtractGroup", + "technique": "motion analysis technique", + "approach": "behavioral approach", + }, + "MoSeqExtractParameterGroup": { + "module": "behavior", + "neurodata_type": "MoSeqExtractParameterGroup", + "technique": None, + "approach": "behavioral approach", + }, + "Position": { + "module": "behavior", + "neurodata_type": "Position", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "PupilTracking": { + "module": "behavior", + "neurodata_type": "PupilTracking", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "Skeleton": { + "module": "behavior", + "neurodata_type": "Skeleton", + "technique": None, + "approach": "behavioral approach", + }, + "SpatialSeries": { + "module": "behavior", + "neurodata_type": "SpatialSeries", + "technique": "behavioral technique", + "approach": "behavioral approach", + }, + "TtlTypesTable": { + "module": "behavior", + "neurodata_type": "TtlTypesTable", + "technique": None, + "approach": "behavioral approach", + }, + "TtlsTable": { + "module": "behavior", + "neurodata_type": "TtlsTable", + "technique": None, + "approach": "behavioral approach", + }, + + # device module + "CameraDevice": { + "module": "device", + "neurodata_type": "CameraDevice", + "technique": "photographic technique", + "approach": None, + }, + "DataAcqDevice": { + "module": "device", + "neurodata_type": "DataAcqDevice", + "technique": None, + "approach": None, + }, + "Device": { + "module": "device", + "neurodata_type": "Device", + "technique": None, + "approach": None, + }, + "HeaderDevice": { + "module": "device", + "neurodata_type": "HeaderDevice", + "technique": None, + "approach": None, + }, + "LabNotebookDevice": { + "module": "device", + "neurodata_type": "LabNotebookDevice", + "technique": None, + "approach": None, + }, + "Microscope": { + "module": "device", + "neurodata_type": "Microscope", + "technique": None, + "approach": "microscopy approach", + }, + "Miniscope": { + "module": "device", + "neurodata_type": "Miniscope", + "technique": None, + "approach": "microscopy approach", + }, + "NIRSDevice": { + "module": "device", + "neurodata_type": "NIRSDevice", + "technique": None, + "approach": "near-infrared spectroscopy", + }, + "TestpulseDevice": { + "module": "device", + "neurodata_type": "TestpulseDevice", + "technique": None, + "approach": None, + }, + "UserCommentDevice": { + "module": "device", + "neurodata_type": "UserCommentDevice", + "technique": None, + "approach": None, + }, + + # ecephys module + "EcephysCSD": { + "module": "ecephys", + "neurodata_type": "EcephysCSD", + "technique": "current source density technique", + "approach": "electrophysiological approach", + }, + "EcephysElectrodeGroup": { + "module": "ecephys", + "neurodata_type": "EcephysElectrodeGroup", + "technique": "surgical technique", + "approach": "electrophysiological approach", + }, + "EcephysProbe": { + "module": "ecephys", + "neurodata_type": "EcephysProbe", + "technique": None, + "approach": "electrophysiological approach", + }, + "ElectricalSeries": { + "module": "ecephys", + "neurodata_type": "ElectricalSeries", + "technique": "multi electrode extracellular electrophysiology recording technique", + "approach": "electrophysiological approach", + }, + "ElectrodeGroup": { + "module": "ecephys", + "neurodata_type": "ElectrodeGroup", + "technique": "surgical technique", + "approach": "electrophysiological approach", + }, + "ElectrodesTable": { + "module": "ecephys", + "neurodata_type": "ElectrodesTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "FilteredEphys": { + "module": "ecephys", + "neurodata_type": "FilteredEphys", + "technique": "signal filtering technique", + "approach": "electrophysiological approach", + }, + "IblProbes": { + "module": "ecephys", + "neurodata_type": "IblProbes", + "technique": None, + "approach": "electrophysiological approach", + }, + "LFP": { + "module": "ecephys", + "neurodata_type": "LFP", + "technique": "signal filtering technique", + "approach": "electrophysiological approach", + }, + "NwbElectrodeGroup": { + "module": "ecephys", + "neurodata_type": "NwbElectrodeGroup", + "technique": "surgical technique", + "approach": "electrophysiological approach", + }, + "Probe": { + "module": "ecephys", + "neurodata_type": "Probe", + "technique": None, + "approach": "electrophysiological approach", + }, + "Shank": { + "module": "ecephys", + "neurodata_type": "Shank", + "technique": None, + "approach": "electrophysiological approach", + }, + "ShanksElectrode": { + "module": "ecephys", + "neurodata_type": "ShanksElectrode", + "technique": None, + "approach": "electrophysiological approach", + }, + "SpikeEventSeries": { + "module": "ecephys", + "neurodata_type": "SpikeEventSeries", + "technique": "spike sorting technique", + "approach": "electrophysiological approach", + }, + + # fiberphotometry module + "FiberPhotometry": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometry", + "technique": "fiber photometry technique; optical technique", + "approach": "calcium imaging; cell population imaging", + }, + "FiberPhotometryResponseSeries": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometryResponseSeries", + "technique": "fiber photometry technique; optical technique", + "approach": "calcium imaging; cell population imaging", + }, + "FiberPhotometrySeries": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometrySeries", + "technique": "fiber photometry technique; optical technique", + "approach": "calcium imaging; cell population imaging", + }, + "FiberPhotometryTable": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometryTable", + "technique": None, + "approach": "calcium imaging; cell population imaging", + }, + "FibersTable": { + "module": "fiberphotometry", + "neurodata_type": "FibersTable", + "technique": None, + "approach": "calcium imaging; cell population imaging", + }, + "OpticalFiber": { + "module": "fiberphotometry", + "neurodata_type": "OpticalFiber", + "technique": None, + "approach": "calcium imaging; cell population imaging", + }, + "Photodetector": { + "module": "fiberphotometry", + "neurodata_type": "Photodetector", + "technique": None, + "approach": "calcium imaging; cell population imaging", + }, + "PhotodetectorsTable": { + "module": "fiberphotometry", + "neurodata_type": "PhotodetectorsTable", + "technique": None, + "approach": "calcium imaging; cell population imaging", + }, + + # icephys module + "CommandedVoltageSeries": { + "module": "icephys", + "neurodata_type": "CommandedVoltageSeries", + "technique": "voltage control technique", + "approach": "electrophysiological approach", + }, + "CompartmentSeries": { + "module": "icephys", + "neurodata_type": "CompartmentSeries", + "technique": "compartmental recording technique", + "approach": "electrophysiological approach", + }, + "Compartments": { + "module": "icephys", + "neurodata_type": "Compartments", + "technique": "compartmental recording technique", + "approach": "electrophysiological approach", + }, + "CurrentClampSeries": { + "module": "icephys", + "neurodata_type": "CurrentClampSeries", + "technique": "current clamp technique", + "approach": "electrophysiological approach", + }, + "CurrentClampStimulusSeries": { + "module": "icephys", + "neurodata_type": "CurrentClampStimulusSeries", + "technique": "current clamp technique", + "approach": "electrophysiological approach", + }, + "IZeroClampSeries": { + "module": "icephys", + "neurodata_type": "IZeroClampSeries", + "technique": "current clamp technique", + "approach": "electrophysiological approach", + }, + "IntracellularElectrode": { + "module": "icephys", + "neurodata_type": "IntracellularElectrode", + "technique": None, + "approach": "electrophysiological approach", + }, + "IntracellularElectrodesTable": { + "module": "icephys", + "neurodata_type": "IntracellularElectrodesTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "IntracellularRecordingsTable": { + "module": "icephys", + "neurodata_type": "IntracellularRecordingsTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "IntracellularResponsesTable": { + "module": "icephys", + "neurodata_type": "IntracellularResponsesTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "IntracellularStimuliTable": { + "module": "icephys", + "neurodata_type": "IntracellularStimuliTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "PatchClampSeries": { + "module": "icephys", + "neurodata_type": "PatchClampSeries", + "technique": "patch clamp technique", + "approach": "electrophysiological approach", + }, + "SequentialRecordingsTable": { + "module": "icephys", + "neurodata_type": "SequentialRecordingsTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "SimultaneousRecordingsTable": { + "module": "icephys", + "neurodata_type": "SimultaneousRecordingsTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "SweepTable": { + "module": "icephys", + "neurodata_type": "SweepTable", + "technique": None, + "approach": "electrophysiological approach", + }, + "VoltageClampSeries": { + "module": "icephys", + "neurodata_type": "VoltageClampSeries", + "technique": "voltage clamp technique", + "approach": "electrophysiological approach", + }, + "VoltageClampStimulusSeries": { + "module": "icephys", + "neurodata_type": "VoltageClampStimulusSeries", + "technique": "voltage clamp technique", + "approach": "electrophysiological approach", + }, + + # image module + "GrayscaleImage": { + "module": "image", + "neurodata_type": "GrayscaleImage", + "technique": "photographic technique", + "approach": None, + }, + "Image": { + "module": "image", + "neurodata_type": "Image", + "technique": "photographic technique", + "approach": None, + }, + "Images": { + "module": "image", + "neurodata_type": "Images", + "technique": "photographic technique", + "approach": None, + }, + "RGBAImage": { + "module": "image", + "neurodata_type": "RGBAImage", + "technique": "photographic technique", + "approach": None, + }, + "RGBImage": { + "module": "image", + "neurodata_type": "RGBImage", + "technique": "photographic technique", + "approach": None, + }, + + # misc module + "AnnotationSeries": { + "module": "misc", + "neurodata_type": "AnnotationSeries", + "technique": "annotation technique", + "approach": None, + }, + "AssociatedFiles": { + "module": "misc", + "neurodata_type": "AssociatedFiles", + "technique": "file management technique", + "approach": None, + }, + "DandiIcephysMetadata": { + "module": "misc", + "neurodata_type": "DandiIcephysMetadata", + "technique": None, + "approach": "electrophysiological approach", + }, + "DecompositionSeries": { + "module": "misc", + "neurodata_type": "DecompositionSeries", + "technique": "fourier analysis technique", + "approach": None, + }, + "DynamicTable": { + "module": "misc", + "neurodata_type": "DynamicTable", + "technique": None, + "approach": None, + }, + "DynamicTableRegion": { + "module": "misc", + "neurodata_type": "DynamicTableRegion", + "technique": None, + "approach": None, + }, + "EcephysEyeTrackingRigMetadata": { + "module": "misc", + "neurodata_type": "EcephysEyeTrackingRigMetadata", + "technique": None, + "approach": "electrophysiological approach", + }, + "ElementIdentifiers": { + "module": "misc", + "neurodata_type": "ElementIdentifiers", + "technique": None, + "approach": None, + }, + "ExperimentalConditionsTable": { + "module": "misc", + "neurodata_type": "ExperimentalConditionsTable", + "technique": None, + "approach": None, + }, + "GeneratedBy": { + "module": "misc", + "neurodata_type": "GeneratedBy", + "technique": None, + "approach": None, + }, + "IblSessionData": { + "module": "misc", + "neurodata_type": "IblSessionData", + "technique": None, + "approach": None, + }, + "ImageReferences": { + "module": "misc", + "neurodata_type": "ImageReferences", + "technique": None, + "approach": None, + }, + "IndexSeries": { + "module": "misc", + "neurodata_type": "IndexSeries", + "technique": None, + "approach": None, + }, + "IntervalSeries": { + "module": "misc", + "neurodata_type": "IntervalSeries", + "technique": None, + "approach": None, + }, + "LabMetaData": { + "module": "misc", + "neurodata_type": "LabMetaData", + "technique": None, + "approach": None, + }, + "LabMetaDataMouse": { + "module": "misc", + "neurodata_type": "LabMetaDataMouse", + "technique": None, + "approach": None, + }, + "LabMetaDataSession": { + "module": "misc", + "neurodata_type": "LabMetaDataSession", + "technique": None, + "approach": None, + }, + "LabMetaData_ext": { + "module": "misc", + "neurodata_type": "LabMetaData_ext", + "technique": None, + "approach": None, + }, + "LabNotebook": { + "module": "misc", + "neurodata_type": "LabNotebook", + "technique": None, + "approach": None, + }, + "LabNotebookNumericalKeys": { + "module": "misc", + "neurodata_type": "LabNotebookNumericalKeys", + "technique": None, + "approach": None, + }, + "LabNotebookNumericalValues": { + "module": "misc", + "neurodata_type": "LabNotebookNumericalValues", + "technique": None, + "approach": None, + }, + "LabNotebookTextualKeys": { + "module": "misc", + "neurodata_type": "LabNotebookTextualKeys", + "technique": None, + "approach": None, + }, + "LabNotebookTextualValues": { + "module": "misc", + "neurodata_type": "LabNotebookTextualValues", + "technique": None, + "approach": None, + }, + "NDXICEphysFile": { + "module": "misc", + "neurodata_type": "NDXICEphysFile", + "technique": None, + "approach": "electrophysiological approach", + }, + "OphysMetadata": { + "module": "misc", + "neurodata_type": "OphysMetadata", + "technique": None, + "approach": "microscopy approach", + }, + "OpticalChannelReferences": { + "module": "misc", + "neurodata_type": "OpticalChannelReferences", + "technique": None, + "approach": None, + }, + "RepetitionsTable": { + "module": "misc", + "neurodata_type": "RepetitionsTable", + "technique": None, + "approach": None, + }, + "Results": { + "module": "misc", + "neurodata_type": "Results", + "technique": None, + "approach": None, + }, + "ResultsNumericalKeys": { + "module": "misc", + "neurodata_type": "ResultsNumericalKeys", + "technique": None, + "approach": None, + }, + "ResultsNumericalValues": { + "module": "misc", + "neurodata_type": "ResultsNumericalValues", + "technique": None, + "approach": None, + }, + "ResultsTextualKeys": { + "module": "misc", + "neurodata_type": "ResultsTextualKeys", + "technique": None, + "approach": None, + }, + "ResultsTextualValues": { + "module": "misc", + "neurodata_type": "ResultsTextualValues", + "technique": None, + "approach": None, + }, + "ScratchData": { + "module": "misc", + "neurodata_type": "ScratchData", + "technique": None, + "approach": None, + }, + "SimulationMetaData": { + "module": "misc", + "neurodata_type": "SimulationMetaData", + "technique": None, + "approach": None, + }, + "StimulusSetReferenced": { + "module": "misc", + "neurodata_type": "StimulusSetReferenced", + "technique": None, + "approach": None, + }, + "StimulusSetReferencedFolder": { + "module": "misc", + "neurodata_type": "StimulusSetReferencedFolder", + "technique": None, + "approach": None, + }, + "StimulusSetReferencedWaveform": { + "module": "misc", + "neurodata_type": "StimulusSetReferencedWaveform", + "technique": None, + "approach": None, + }, + "StimulusSetWavebuilderParameter": { + "module": "misc", + "neurodata_type": "StimulusSetWavebuilderParameter", + "technique": None, + "approach": None, + }, + "StimulusSetWavebuilderParameterText": { + "module": "misc", + "neurodata_type": "StimulusSetWavebuilderParameterText", + "technique": None, + "approach": None, + }, + "StimulusSetWavebuilderSegmentTypes": { + "module": "misc", + "neurodata_type": "StimulusSetWavebuilderSegmentTypes", + "technique": None, + "approach": None, + }, + "StimulusSets": { + "module": "misc", + "neurodata_type": "StimulusSets", + "technique": None, + "approach": None, + }, + "Testpulse": { + "module": "misc", + "neurodata_type": "Testpulse", + "technique": None, + "approach": None, + }, + "TestpulseMetadata": { + "module": "misc", + "neurodata_type": "TestpulseMetadata", + "technique": None, + "approach": None, + }, + "TestpulseRawData": { + "module": "misc", + "neurodata_type": "TestpulseRawData", + "technique": None, + "approach": None, + }, + "TimeIntervals": { + "module": "misc", + "neurodata_type": "TimeIntervals", + "technique": None, + "approach": None, + }, + "TimeSeriesReferenceVectorData": { + "module": "misc", + "neurodata_type": "TimeSeriesReferenceVectorData", + "technique": None, + "approach": None, + }, + "TimestampVectorData": { + "module": "misc", + "neurodata_type": "TimestampVectorData", + "technique": None, + "approach": None, + }, + "TurnerLabMetaData": { + "module": "misc", + "neurodata_type": "TurnerLabMetaData", + "technique": None, + "approach": None, + }, + "UserComment": { + "module": "misc", + "neurodata_type": "UserComment", + "technique": None, + "approach": None, + }, + "UserCommentString": { + "module": "misc", + "neurodata_type": "UserCommentString", + "technique": None, + "approach": None, + }, + "VectorData": { + "module": "misc", + "neurodata_type": "VectorData", + "technique": None, + "approach": None, + }, + "VectorIndex": { + "module": "misc", + "neurodata_type": "VectorIndex", + "technique": None, + "approach": None, + }, + "experimentlevel1": { + "module": "misc", + "neurodata_type": "experimentlevel1", + "technique": None, + "approach": None, + }, + "experimentlevel2": { + "module": "misc", + "neurodata_type": "experimentlevel2", + "technique": None, + "approach": None, + }, + "experimentlevel3": { + "module": "misc", + "neurodata_type": "experimentlevel3", + "technique": None, + "approach": None, + }, + "experimentlevel4": { + "module": "misc", + "neurodata_type": "experimentlevel4", + "technique": None, + "approach": None, + }, + "ibl_bwm_metadata": { + "module": "misc", + "neurodata_type": "ibl_bwm_metadata", + "technique": None, + "approach": None, + }, + + # motion module + "PoseEstimation": { + "module": "motion", + "neurodata_type": "PoseEstimation", + "technique": "pose estimation technique", + "approach": "behavioral approach", + }, + "PoseEstimationSeries": { + "module": "motion", + "neurodata_type": "PoseEstimationSeries", + "technique": "pose estimation technique", + "approach": "behavioral approach", + }, + + # nirs module + "NIRSChannelsTable": { + "module": "nirs", + "neurodata_type": "NIRSChannelsTable", + "technique": None, + "approach": "near-infrared spectroscopy", + }, + "NIRSDetectorsTable": { + "module": "nirs", + "neurodata_type": "NIRSDetectorsTable", + "technique": None, + "approach": "near-infrared spectroscopy", + }, + "NIRSSeries": { + "module": "nirs", + "neurodata_type": "NIRSSeries", + "technique": "near-infrared spectroscopy technique", + "approach": "near-infrared spectroscopy", + }, + "NIRSSourcesTable": { + "module": "nirs", + "neurodata_type": "NIRSSourcesTable", + "technique": None, + "approach": "near-infrared spectroscopy", + }, + + # ogen module + "OptogeneticSeries": { + "module": "ogen", + "neurodata_type": "OptogeneticSeries", + "technique": "optogenetic stimulation technique", + "approach": "optogenetic approach", + }, + "OptogeneticStimulusSite": { + "module": "ogen", + "neurodata_type": "OptogeneticStimulusSite", + "technique": None, + "approach": "optogenetic approach", + }, + "OptogeneticStimulusTarget": { + "module": "ogen", + "neurodata_type": "OptogeneticStimulusTarget", + "technique": None, + "approach": "optogenetic approach", + }, + "PatternedOptogeneticStimulusSite": { + "module": "ogen", + "neurodata_type": "PatternedOptogeneticStimulusSite", + "technique": "optogenetic stimulation technique", + "approach": "optogenetic approach", + }, + "PatternedOptogeneticStimulusTable": { + "module": "ogen", + "neurodata_type": "PatternedOptogeneticStimulusTable", + "technique": None, + "approach": "optogenetic approach", + }, + "TemporalFocusing": { + "module": "ogen", + "neurodata_type": "TemporalFocusing", + "technique": "optogenetic stimulation technique", + "approach": "optogenetic approach", + }, + + # ophys module + "BandOpticalFilter": { + "module": "ophys", + "neurodata_type": "BandOpticalFilter", + "technique": "optical filtering technique", + "approach": "microscopy approach", + }, + "CorrectedImageStack": { + "module": "ophys", + "neurodata_type": "CorrectedImageStack", + "technique": "image correction technique", + "approach": "microscopy approach", + }, + "DepthImageSeries": { + "module": "ophys", + "neurodata_type": "DepthImageSeries", + "technique": "depth imaging technique", + "approach": "microscopy approach", + }, + "DfOverF": { + "module": "ophys", + "neurodata_type": "DfOverF", + "technique": "fluorescence imaging technique", + "approach": "calcium imaging; cell population imaging", + }, + "DffSeries": { + "module": "ophys", + "neurodata_type": "DffSeries", + "technique": "fluorescence imaging technique", + "approach": "calcium imaging; cell population imaging", + }, + "DichroicMirror": { + "module": "ophys", + "neurodata_type": "DichroicMirror", + "technique": "optical filtering technique", + "approach": "microscopy approach", + }, + "EXTRACTSegmentation": { + "module": "ophys", + "neurodata_type": "EXTRACTSegmentation", + "technique": "image segmentation technique", + "approach": "microscopy approach; cell population imaging", + }, + "ExcitationSource": { + "module": "ophys", + "neurodata_type": "ExcitationSource", + "technique": None, + "approach": "microscopy approach", + }, + "ExcitationSourcesTable": { + "module": "ophys", + "neurodata_type": "ExcitationSourcesTable", + "technique": None, + "approach": "microscopy approach", + }, + "Fluorescence": { + "module": "ophys", + "neurodata_type": "Fluorescence", + "technique": "fluorescence imaging technique", + "approach": "calcium imaging; cell population imaging", + }, + "FluorophoresTable": { + "module": "ophys", + "neurodata_type": "FluorophoresTable", + "technique": None, + "approach": "microscopy approach", + }, + "ImageMaskSeries": { + "module": "ophys", + "neurodata_type": "ImageMaskSeries", + "technique": "image segmentation technique", + "approach": "microscopy approach", + }, + "ImageSegmentation": { + "module": "ophys", + "neurodata_type": "ImageSegmentation", + "technique": "image segmentation technique", + "approach": "microscopy approach; cell population imaging", + }, + "ImageSeries": { + "module": "ophys", + "neurodata_type": "ImageSeries", + "technique": "optical imaging technique", + "approach": "microscopy approach", + }, + "ImagingPlane": { + "module": "ophys", + "neurodata_type": "ImagingPlane", + "technique": None, + "approach": "microscopy approach; cell population imaging", + }, + "ImagingVolume": { + "module": "ophys", + "neurodata_type": "ImagingVolume", + "technique": "volumetric imaging technique", + "approach": "microscopy approach; cell population imaging", + }, + "Indicator": { + "module": "ophys", + "neurodata_type": "Indicator", + "technique": None, + "approach": "microscopy approach", + }, + "LightSource": { + "module": "ophys", + "neurodata_type": "LightSource", + "technique": None, + "approach": "microscopy approach", + }, + "MicroscopyLightSource": { + "module": "ophys", + "neurodata_type": "MicroscopyLightSource", + "technique": None, + "approach": "microscopy approach", + }, + "MicroscopyOpticalChannel": { + "module": "ophys", + "neurodata_type": "MicroscopyOpticalChannel", + "technique": None, + "approach": "microscopy approach", + }, + "MicroscopyPlaneSegmentation": { + "module": "ophys", + "neurodata_type": "MicroscopyPlaneSegmentation", + "technique": "image segmentation technique", + "approach": "microscopy approach; cell population imaging", + }, + "MicroscopyResponseSeries": { + "module": "ophys", + "neurodata_type": "MicroscopyResponseSeries", + "technique": "optical imaging technique", + "approach": "microscopy approach", + }, + "MicroscopyResponseSeriesContainer": { + "module": "ophys", + "neurodata_type": "MicroscopyResponseSeriesContainer", + "technique": None, + "approach": "microscopy approach", + }, + "MicroscopySegmentations": { + "module": "ophys", + "neurodata_type": "MicroscopySegmentations", + "technique": "image segmentation technique", + "approach": "microscopy approach; cell population imaging", + }, + "MotionCorrection": { + "module": "ophys", + "neurodata_type": "MotionCorrection", + "technique": "image correction technique", + "approach": "microscopy approach", + }, + "MultiChannelVolume": { + "module": "ophys", + "neurodata_type": "MultiChannelVolume", + "technique": "volumetric imaging technique", + "approach": "microscopy approach", + }, + "MultiChannelVolumeSeries": { + "module": "ophys", + "neurodata_type": "MultiChannelVolumeSeries", + "technique": "volumetric imaging technique", + "approach": "microscopy approach", + }, + "NwbImageSeries": { + "module": "ophys", + "neurodata_type": "NwbImageSeries", + "technique": "optical imaging technique", + "approach": "microscopy approach", + }, + "OnePhotonSeries": { + "module": "ophys", + "neurodata_type": "OnePhotonSeries", + "technique": "one-photon microscopy technique", + "approach": "microscopy approach; cell population imaging", + }, + "OphysEventDetection": { + "module": "ophys", + "neurodata_type": "OphysEventDetection", + "technique": "event detection technique", + "approach": "microscopy approach; cell population imaging", + }, + "OpticalChannel": { + "module": "ophys", + "neurodata_type": "OpticalChannel", + "technique": "surgical technique", + "approach": "microscopy approach; cell population imaging", + }, + "OpticalChannelPlus": { + "module": "ophys", + "neurodata_type": "OpticalChannelPlus", + "technique": None, + "approach": "microscopy approach", + }, + "OpticalSeries": { + "module": "ophys", + "neurodata_type": "OpticalSeries", + "technique": "optical imaging technique", + "approach": "microscopy approach", + }, + "PlanarImagingSpace": { + "module": "ophys", + "neurodata_type": "PlanarImagingSpace", + "technique": None, + "approach": "microscopy approach", + }, + "PlaneSegmentation": { + "module": "ophys", + "neurodata_type": "PlaneSegmentation", + "technique": None, + "approach": "microscopy approach; cell population imaging", + }, + "RoiResponseSeries": { + "module": "ophys", + "neurodata_type": "RoiResponseSeries", + "technique": "fluorescence imaging technique", + "approach": "calcium imaging; cell population imaging", + }, + "SegmentationLabels": { + "module": "ophys", + "neurodata_type": "SegmentationLabels", + "technique": None, + "approach": "microscopy approach; cell population imaging", + }, + "TwoPhotonSeries": { + "module": "ophys", + "neurodata_type": "TwoPhotonSeries", + "technique": "two-photon microscopy technique", + "approach": "microscopy approach; cell population imaging", + }, + "VariableDepthMicroscopySeries": { + "module": "ophys", + "neurodata_type": "VariableDepthMicroscopySeries", + "technique": "volumetric imaging technique", + "approach": "microscopy approach", + }, + "VariableDepthMultiChannelMicroscopyVolume": { + "module": "ophys", + "neurodata_type": "VariableDepthMultiChannelMicroscopyVolume", + "technique": "volumetric imaging technique", + "approach": "microscopy approach", + }, + "VolumetricImagingSpace": { + "module": "ophys", + "neurodata_type": "VolumetricImagingSpace", + "technique": None, + "approach": "microscopy approach", + }, + + # sortedunits module + "Units": { + "module": "sortedunits", + "neurodata_type": "Units", + "technique": "spike sorting technique", + "approach": "electrophysiological approach", + }, + + # spectrum module + "Spectrum": { + "module": "spectrum", + "neurodata_type": "Spectrum", + "technique": "fourier analysis technique", + "approach": None, + }, + + # subject module + "CElegansSubject": { + "module": "subject", + "neurodata_type": "CElegansSubject", + "technique": None, + "approach": None, + }, + "CreSubject": { + "module": "subject", + "neurodata_type": "CreSubject", + "technique": None, + "approach": None, + }, + "EcephysSpecimen": { + "module": "subject", + "neurodata_type": "EcephysSpecimen", + "technique": None, + "approach": "electrophysiological approach", + }, + "IblSubject": { + "module": "subject", + "neurodata_type": "IblSubject", + "technique": None, + "approach": None, + }, + "Subject": { + "module": "subject", + "neurodata_type": "Subject", + "technique": None, + "approach": None, + }, +} From c25e3d24f0d71414e5b5cf63334457bd777908e5 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 17 Sep 2025 06:33:39 -0700 Subject: [PATCH 15/20] Apply my first edits to neurodata_typemap.py --- dandi/metadata/neurodata_typemap.py | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/dandi/metadata/neurodata_typemap.py b/dandi/metadata/neurodata_typemap.py index 607c2e6fb..a7f8951f3 100644 --- a/dandi/metadata/neurodata_typemap.py +++ b/dandi/metadata/neurodata_typemap.py @@ -107,7 +107,7 @@ "MoSeqExtractParameterGroup": { "module": "behavior", "neurodata_type": "MoSeqExtractParameterGroup", - "technique": None, + "technique": "motion analysis technique", "approach": "behavioral approach", }, "Position": { @@ -119,7 +119,7 @@ "PupilTracking": { "module": "behavior", "neurodata_type": "PupilTracking", - "technique": "behavioral technique", + "technique": "eye tracking technique", "approach": "behavioral approach", }, "Skeleton": { @@ -135,13 +135,13 @@ "approach": "behavioral approach", }, "TtlTypesTable": { - "module": "behavior", + "module": "misc", "neurodata_type": "TtlTypesTable", "technique": None, "approach": "behavioral approach", }, "TtlsTable": { - "module": "behavior", + "module": "misc", "neurodata_type": "TtlsTable", "technique": None, "approach": "behavioral approach", @@ -225,7 +225,7 @@ "EcephysProbe": { "module": "ecephys", "neurodata_type": "EcephysProbe", - "technique": None, + "technique": "surgical technique", "approach": "electrophysiological approach", }, "ElectricalSeries": { @@ -255,7 +255,7 @@ "IblProbes": { "module": "ecephys", "neurodata_type": "IblProbes", - "technique": None, + "technique": "surgical technique", "approach": "electrophysiological approach", }, "LFP": { @@ -273,19 +273,19 @@ "Probe": { "module": "ecephys", "neurodata_type": "Probe", - "technique": None, + "technique": "surgical technique", "approach": "electrophysiological approach", }, "Shank": { "module": "ecephys", "neurodata_type": "Shank", - "technique": None, + "technique": "surgical technique", "approach": "electrophysiological approach", }, "ShanksElectrode": { "module": "ecephys", "neurodata_type": "ShanksElectrode", - "technique": None, + "technique": "surgical technique", "approach": "electrophysiological approach", }, "SpikeEventSeries": { @@ -329,7 +329,7 @@ "OpticalFiber": { "module": "fiberphotometry", "neurodata_type": "OpticalFiber", - "technique": None, + "technique": "surgical technique", "approach": "calcium imaging; cell population imaging", }, "Photodetector": { @@ -385,7 +385,7 @@ "IntracellularElectrode": { "module": "icephys", "neurodata_type": "IntracellularElectrode", - "technique": None, + "technique": "surgical technique", "approach": "electrophysiological approach", }, "IntracellularElectrodesTable": { @@ -519,10 +519,10 @@ "approach": None, }, "EcephysEyeTrackingRigMetadata": { - "module": "misc", + "module": "device", "neurodata_type": "EcephysEyeTrackingRigMetadata", - "technique": None, - "approach": "electrophysiological approach", + "technique": "eye tracking technique", + "approach": "behavioral approach", }, "ElementIdentifiers": { "module": "misc", @@ -624,7 +624,7 @@ "module": "misc", "neurodata_type": "NDXICEphysFile", "technique": None, - "approach": "electrophysiological approach", + "approach": None, }, "OphysMetadata": { "module": "misc", From a6d1cb290a7a30e26469c506d037c5f6e65d28a3 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 17 Sep 2025 06:42:23 -0700 Subject: [PATCH 16/20] Apply edits from review --- dandi/metadata/neurodata_typemap.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dandi/metadata/neurodata_typemap.py b/dandi/metadata/neurodata_typemap.py index a7f8951f3..514a329b9 100644 --- a/dandi/metadata/neurodata_typemap.py +++ b/dandi/metadata/neurodata_typemap.py @@ -971,10 +971,10 @@ "approach": "microscopy approach", }, "ImageMaskSeries": { - "module": "ophys", + "module": "misc", "neurodata_type": "ImageMaskSeries", "technique": "image segmentation technique", - "approach": "microscopy approach", + "approach": None, }, "ImageSegmentation": { "module": "ophys", @@ -983,10 +983,10 @@ "approach": "microscopy approach; cell population imaging", }, "ImageSeries": { - "module": "ophys", + "module": "core", "neurodata_type": "ImageSeries", - "technique": "optical imaging technique", - "approach": "microscopy approach", + "technique": None, + "approach": None, }, "ImagingPlane": { "module": "ophys", @@ -1067,10 +1067,10 @@ "approach": "microscopy approach", }, "NwbImageSeries": { - "module": "ophys", + "module": "misc", "neurodata_type": "NwbImageSeries", - "technique": "optical imaging technique", - "approach": "microscopy approach", + "technique": None, + "approach": None, }, "OnePhotonSeries": { "module": "ophys", @@ -1087,7 +1087,7 @@ "OpticalChannel": { "module": "ophys", "neurodata_type": "OpticalChannel", - "technique": "surgical technique", + "technique": None, "approach": "microscopy approach; cell population imaging", }, "OpticalChannelPlus": { From b784ba391a2692b88785154899eb526af56f545c Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 17 Sep 2025 06:45:17 -0700 Subject: [PATCH 17/20] Sort neurodata_typemap.py Added new neurodata types for image series and eye tracking metadata while removing deprecated types. --- dandi/metadata/neurodata_typemap.py | 72 ++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/dandi/metadata/neurodata_typemap.py b/dandi/metadata/neurodata_typemap.py index 514a329b9..d55fd4d47 100644 --- a/dandi/metadata/neurodata_typemap.py +++ b/dandi/metadata/neurodata_typemap.py @@ -1,5 +1,11 @@ neurodata_typemap: dict[str, dict[str, str | None]] = { # base module + "ImageSeries": { + "module": "base", + "neurodata_type": "ImageSeries", + "technique": None, + "approach": None, + }, "NWBFile": { "module": "base", "neurodata_type": "NWBFile", @@ -134,18 +140,6 @@ "technique": "behavioral technique", "approach": "behavioral approach", }, - "TtlTypesTable": { - "module": "misc", - "neurodata_type": "TtlTypesTable", - "technique": None, - "approach": "behavioral approach", - }, - "TtlsTable": { - "module": "misc", - "neurodata_type": "TtlsTable", - "technique": None, - "approach": "behavioral approach", - }, # device module "CameraDevice": { @@ -166,6 +160,12 @@ "technique": None, "approach": None, }, + "EcephysEyeTrackingRigMetadata": { + "module": "device", + "neurodata_type": "EcephysEyeTrackingRigMetadata", + "technique": "eye tracking technique", + "approach": "behavioral approach", + }, "HeaderDevice": { "module": "device", "neurodata_type": "HeaderDevice", @@ -518,12 +518,6 @@ "technique": None, "approach": None, }, - "EcephysEyeTrackingRigMetadata": { - "module": "device", - "neurodata_type": "EcephysEyeTrackingRigMetadata", - "technique": "eye tracking technique", - "approach": "behavioral approach", - }, "ElementIdentifiers": { "module": "misc", "neurodata_type": "ElementIdentifiers", @@ -548,6 +542,12 @@ "technique": None, "approach": None, }, + "ImageMaskSeries": { + "module": "misc", + "neurodata_type": "ImageMaskSeries", + "technique": "image segmentation technique", + "approach": None, + }, "ImageReferences": { "module": "misc", "neurodata_type": "ImageReferences", @@ -626,6 +626,12 @@ "technique": None, "approach": None, }, + "NwbImageSeries": { + "module": "misc", + "neurodata_type": "NwbImageSeries", + "technique": None, + "approach": None, + }, "OphysMetadata": { "module": "misc", "neurodata_type": "OphysMetadata", @@ -764,6 +770,18 @@ "technique": None, "approach": None, }, + "TtlTypesTable": { + "module": "misc", + "neurodata_type": "TtlTypesTable", + "technique": None, + "approach": "behavioral approach", + }, + "TtlsTable": { + "module": "misc", + "neurodata_type": "TtlsTable", + "technique": None, + "approach": "behavioral approach", + }, "TurnerLabMetaData": { "module": "misc", "neurodata_type": "TurnerLabMetaData", @@ -970,24 +988,12 @@ "technique": None, "approach": "microscopy approach", }, - "ImageMaskSeries": { - "module": "misc", - "neurodata_type": "ImageMaskSeries", - "technique": "image segmentation technique", - "approach": None, - }, "ImageSegmentation": { "module": "ophys", "neurodata_type": "ImageSegmentation", "technique": "image segmentation technique", "approach": "microscopy approach; cell population imaging", }, - "ImageSeries": { - "module": "core", - "neurodata_type": "ImageSeries", - "technique": None, - "approach": None, - }, "ImagingPlane": { "module": "ophys", "neurodata_type": "ImagingPlane", @@ -1066,12 +1072,6 @@ "technique": "volumetric imaging technique", "approach": "microscopy approach", }, - "NwbImageSeries": { - "module": "misc", - "neurodata_type": "NwbImageSeries", - "technique": None, - "approach": None, - }, "OnePhotonSeries": { "module": "ophys", "neurodata_type": "OnePhotonSeries", From 88adc1359d162bb0c118b6edb0a06a60754cb200 Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Thu, 27 Aug 2026 11:20:41 -0400 Subject: [PATCH 18/20] Use clean fiber photometry terms; add photometry table and device types Use "fiber photometry approach" and "fiber photometry technique" for the photometry types. Semicolon-joined strings like "fiber photometry technique; optical technique" would become a single unfacetable term, and "calcium imaging" is inaccurate for the many photometry datasets using dLight or GRAB sensors to measure neurotransmitters rather than calcium. Add the metadata table types from the deprecated ndx-photometry and the container, table, and device types from ndx-fiber-photometry so files carrying only those are still marked. Drop the unused dandi/metadata/neurodata_typemap.py for now; the expanded map can be reintroduced when it is wired into the code. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Wuywpnnb3Q57q6oeMZ4God --- dandi/metadata/neurodata_typemap.py | 1201 --------------------------- dandi/metadata/util.py | 68 +- dandi/tests/test_metadata.py | 14 +- 3 files changed, 77 insertions(+), 1206 deletions(-) delete mode 100644 dandi/metadata/neurodata_typemap.py diff --git a/dandi/metadata/neurodata_typemap.py b/dandi/metadata/neurodata_typemap.py deleted file mode 100644 index d55fd4d47..000000000 --- a/dandi/metadata/neurodata_typemap.py +++ /dev/null @@ -1,1201 +0,0 @@ -neurodata_typemap: dict[str, dict[str, str | None]] = { - # base module - "ImageSeries": { - "module": "base", - "neurodata_type": "ImageSeries", - "technique": None, - "approach": None, - }, - "NWBFile": { - "module": "base", - "neurodata_type": "NWBFile", - "technique": None, - "approach": None, - }, - "ProcessingModule": { - "module": "base", - "neurodata_type": "ProcessingModule", - "technique": "analytical technique", - "approach": None, - }, - "TimeSeries": { - "module": "base", - "neurodata_type": "TimeSeries", - "technique": None, - "approach": None, - }, - - # behavior module - "AnnotatedEventsTable": { - "module": "behavior", - "neurodata_type": "AnnotatedEventsTable", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "BehavioralEpochs": { - "module": "behavior", - "neurodata_type": "BehavioralEpochs", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "BehavioralEvents": { - "module": "behavior", - "neurodata_type": "BehavioralEvents", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "BehavioralTimeSeries": { - "module": "behavior", - "neurodata_type": "BehavioralTimeSeries", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "CompassDirection": { - "module": "behavior", - "neurodata_type": "CompassDirection", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "EllipseEyeTracking": { - "module": "behavior", - "neurodata_type": "EllipseEyeTracking", - "technique": "eye tracking technique", - "approach": "behavioral approach", - }, - "EllipseSeries": { - "module": "behavior", - "neurodata_type": "EllipseSeries", - "technique": "eye tracking technique", - "approach": "behavioral approach", - }, - "EventTypesTable": { - "module": "behavior", - "neurodata_type": "EventTypesTable", - "technique": None, - "approach": "behavioral approach", - }, - "Eventlog": { - "module": "behavior", - "neurodata_type": "Eventlog", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "Events": { - "module": "behavior", - "neurodata_type": "Events", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "EventsTable": { - "module": "behavior", - "neurodata_type": "EventsTable", - "technique": None, - "approach": "behavioral approach", - }, - "EyeTracking": { - "module": "behavior", - "neurodata_type": "EyeTracking", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "LabeledEvents": { - "module": "behavior", - "neurodata_type": "LabeledEvents", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "MoSeqExtractGroup": { - "module": "behavior", - "neurodata_type": "MoSeqExtractGroup", - "technique": "motion analysis technique", - "approach": "behavioral approach", - }, - "MoSeqExtractParameterGroup": { - "module": "behavior", - "neurodata_type": "MoSeqExtractParameterGroup", - "technique": "motion analysis technique", - "approach": "behavioral approach", - }, - "Position": { - "module": "behavior", - "neurodata_type": "Position", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - "PupilTracking": { - "module": "behavior", - "neurodata_type": "PupilTracking", - "technique": "eye tracking technique", - "approach": "behavioral approach", - }, - "Skeleton": { - "module": "behavior", - "neurodata_type": "Skeleton", - "technique": None, - "approach": "behavioral approach", - }, - "SpatialSeries": { - "module": "behavior", - "neurodata_type": "SpatialSeries", - "technique": "behavioral technique", - "approach": "behavioral approach", - }, - - # device module - "CameraDevice": { - "module": "device", - "neurodata_type": "CameraDevice", - "technique": "photographic technique", - "approach": None, - }, - "DataAcqDevice": { - "module": "device", - "neurodata_type": "DataAcqDevice", - "technique": None, - "approach": None, - }, - "Device": { - "module": "device", - "neurodata_type": "Device", - "technique": None, - "approach": None, - }, - "EcephysEyeTrackingRigMetadata": { - "module": "device", - "neurodata_type": "EcephysEyeTrackingRigMetadata", - "technique": "eye tracking technique", - "approach": "behavioral approach", - }, - "HeaderDevice": { - "module": "device", - "neurodata_type": "HeaderDevice", - "technique": None, - "approach": None, - }, - "LabNotebookDevice": { - "module": "device", - "neurodata_type": "LabNotebookDevice", - "technique": None, - "approach": None, - }, - "Microscope": { - "module": "device", - "neurodata_type": "Microscope", - "technique": None, - "approach": "microscopy approach", - }, - "Miniscope": { - "module": "device", - "neurodata_type": "Miniscope", - "technique": None, - "approach": "microscopy approach", - }, - "NIRSDevice": { - "module": "device", - "neurodata_type": "NIRSDevice", - "technique": None, - "approach": "near-infrared spectroscopy", - }, - "TestpulseDevice": { - "module": "device", - "neurodata_type": "TestpulseDevice", - "technique": None, - "approach": None, - }, - "UserCommentDevice": { - "module": "device", - "neurodata_type": "UserCommentDevice", - "technique": None, - "approach": None, - }, - - # ecephys module - "EcephysCSD": { - "module": "ecephys", - "neurodata_type": "EcephysCSD", - "technique": "current source density technique", - "approach": "electrophysiological approach", - }, - "EcephysElectrodeGroup": { - "module": "ecephys", - "neurodata_type": "EcephysElectrodeGroup", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "EcephysProbe": { - "module": "ecephys", - "neurodata_type": "EcephysProbe", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "ElectricalSeries": { - "module": "ecephys", - "neurodata_type": "ElectricalSeries", - "technique": "multi electrode extracellular electrophysiology recording technique", - "approach": "electrophysiological approach", - }, - "ElectrodeGroup": { - "module": "ecephys", - "neurodata_type": "ElectrodeGroup", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "ElectrodesTable": { - "module": "ecephys", - "neurodata_type": "ElectrodesTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "FilteredEphys": { - "module": "ecephys", - "neurodata_type": "FilteredEphys", - "technique": "signal filtering technique", - "approach": "electrophysiological approach", - }, - "IblProbes": { - "module": "ecephys", - "neurodata_type": "IblProbes", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "LFP": { - "module": "ecephys", - "neurodata_type": "LFP", - "technique": "signal filtering technique", - "approach": "electrophysiological approach", - }, - "NwbElectrodeGroup": { - "module": "ecephys", - "neurodata_type": "NwbElectrodeGroup", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "Probe": { - "module": "ecephys", - "neurodata_type": "Probe", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "Shank": { - "module": "ecephys", - "neurodata_type": "Shank", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "ShanksElectrode": { - "module": "ecephys", - "neurodata_type": "ShanksElectrode", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "SpikeEventSeries": { - "module": "ecephys", - "neurodata_type": "SpikeEventSeries", - "technique": "spike sorting technique", - "approach": "electrophysiological approach", - }, - - # fiberphotometry module - "FiberPhotometry": { - "module": "fiberphotometry", - "neurodata_type": "FiberPhotometry", - "technique": "fiber photometry technique; optical technique", - "approach": "calcium imaging; cell population imaging", - }, - "FiberPhotometryResponseSeries": { - "module": "fiberphotometry", - "neurodata_type": "FiberPhotometryResponseSeries", - "technique": "fiber photometry technique; optical technique", - "approach": "calcium imaging; cell population imaging", - }, - "FiberPhotometrySeries": { - "module": "fiberphotometry", - "neurodata_type": "FiberPhotometrySeries", - "technique": "fiber photometry technique; optical technique", - "approach": "calcium imaging; cell population imaging", - }, - "FiberPhotometryTable": { - "module": "fiberphotometry", - "neurodata_type": "FiberPhotometryTable", - "technique": None, - "approach": "calcium imaging; cell population imaging", - }, - "FibersTable": { - "module": "fiberphotometry", - "neurodata_type": "FibersTable", - "technique": None, - "approach": "calcium imaging; cell population imaging", - }, - "OpticalFiber": { - "module": "fiberphotometry", - "neurodata_type": "OpticalFiber", - "technique": "surgical technique", - "approach": "calcium imaging; cell population imaging", - }, - "Photodetector": { - "module": "fiberphotometry", - "neurodata_type": "Photodetector", - "technique": None, - "approach": "calcium imaging; cell population imaging", - }, - "PhotodetectorsTable": { - "module": "fiberphotometry", - "neurodata_type": "PhotodetectorsTable", - "technique": None, - "approach": "calcium imaging; cell population imaging", - }, - - # icephys module - "CommandedVoltageSeries": { - "module": "icephys", - "neurodata_type": "CommandedVoltageSeries", - "technique": "voltage control technique", - "approach": "electrophysiological approach", - }, - "CompartmentSeries": { - "module": "icephys", - "neurodata_type": "CompartmentSeries", - "technique": "compartmental recording technique", - "approach": "electrophysiological approach", - }, - "Compartments": { - "module": "icephys", - "neurodata_type": "Compartments", - "technique": "compartmental recording technique", - "approach": "electrophysiological approach", - }, - "CurrentClampSeries": { - "module": "icephys", - "neurodata_type": "CurrentClampSeries", - "technique": "current clamp technique", - "approach": "electrophysiological approach", - }, - "CurrentClampStimulusSeries": { - "module": "icephys", - "neurodata_type": "CurrentClampStimulusSeries", - "technique": "current clamp technique", - "approach": "electrophysiological approach", - }, - "IZeroClampSeries": { - "module": "icephys", - "neurodata_type": "IZeroClampSeries", - "technique": "current clamp technique", - "approach": "electrophysiological approach", - }, - "IntracellularElectrode": { - "module": "icephys", - "neurodata_type": "IntracellularElectrode", - "technique": "surgical technique", - "approach": "electrophysiological approach", - }, - "IntracellularElectrodesTable": { - "module": "icephys", - "neurodata_type": "IntracellularElectrodesTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "IntracellularRecordingsTable": { - "module": "icephys", - "neurodata_type": "IntracellularRecordingsTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "IntracellularResponsesTable": { - "module": "icephys", - "neurodata_type": "IntracellularResponsesTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "IntracellularStimuliTable": { - "module": "icephys", - "neurodata_type": "IntracellularStimuliTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "PatchClampSeries": { - "module": "icephys", - "neurodata_type": "PatchClampSeries", - "technique": "patch clamp technique", - "approach": "electrophysiological approach", - }, - "SequentialRecordingsTable": { - "module": "icephys", - "neurodata_type": "SequentialRecordingsTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "SimultaneousRecordingsTable": { - "module": "icephys", - "neurodata_type": "SimultaneousRecordingsTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "SweepTable": { - "module": "icephys", - "neurodata_type": "SweepTable", - "technique": None, - "approach": "electrophysiological approach", - }, - "VoltageClampSeries": { - "module": "icephys", - "neurodata_type": "VoltageClampSeries", - "technique": "voltage clamp technique", - "approach": "electrophysiological approach", - }, - "VoltageClampStimulusSeries": { - "module": "icephys", - "neurodata_type": "VoltageClampStimulusSeries", - "technique": "voltage clamp technique", - "approach": "electrophysiological approach", - }, - - # image module - "GrayscaleImage": { - "module": "image", - "neurodata_type": "GrayscaleImage", - "technique": "photographic technique", - "approach": None, - }, - "Image": { - "module": "image", - "neurodata_type": "Image", - "technique": "photographic technique", - "approach": None, - }, - "Images": { - "module": "image", - "neurodata_type": "Images", - "technique": "photographic technique", - "approach": None, - }, - "RGBAImage": { - "module": "image", - "neurodata_type": "RGBAImage", - "technique": "photographic technique", - "approach": None, - }, - "RGBImage": { - "module": "image", - "neurodata_type": "RGBImage", - "technique": "photographic technique", - "approach": None, - }, - - # misc module - "AnnotationSeries": { - "module": "misc", - "neurodata_type": "AnnotationSeries", - "technique": "annotation technique", - "approach": None, - }, - "AssociatedFiles": { - "module": "misc", - "neurodata_type": "AssociatedFiles", - "technique": "file management technique", - "approach": None, - }, - "DandiIcephysMetadata": { - "module": "misc", - "neurodata_type": "DandiIcephysMetadata", - "technique": None, - "approach": "electrophysiological approach", - }, - "DecompositionSeries": { - "module": "misc", - "neurodata_type": "DecompositionSeries", - "technique": "fourier analysis technique", - "approach": None, - }, - "DynamicTable": { - "module": "misc", - "neurodata_type": "DynamicTable", - "technique": None, - "approach": None, - }, - "DynamicTableRegion": { - "module": "misc", - "neurodata_type": "DynamicTableRegion", - "technique": None, - "approach": None, - }, - "ElementIdentifiers": { - "module": "misc", - "neurodata_type": "ElementIdentifiers", - "technique": None, - "approach": None, - }, - "ExperimentalConditionsTable": { - "module": "misc", - "neurodata_type": "ExperimentalConditionsTable", - "technique": None, - "approach": None, - }, - "GeneratedBy": { - "module": "misc", - "neurodata_type": "GeneratedBy", - "technique": None, - "approach": None, - }, - "IblSessionData": { - "module": "misc", - "neurodata_type": "IblSessionData", - "technique": None, - "approach": None, - }, - "ImageMaskSeries": { - "module": "misc", - "neurodata_type": "ImageMaskSeries", - "technique": "image segmentation technique", - "approach": None, - }, - "ImageReferences": { - "module": "misc", - "neurodata_type": "ImageReferences", - "technique": None, - "approach": None, - }, - "IndexSeries": { - "module": "misc", - "neurodata_type": "IndexSeries", - "technique": None, - "approach": None, - }, - "IntervalSeries": { - "module": "misc", - "neurodata_type": "IntervalSeries", - "technique": None, - "approach": None, - }, - "LabMetaData": { - "module": "misc", - "neurodata_type": "LabMetaData", - "technique": None, - "approach": None, - }, - "LabMetaDataMouse": { - "module": "misc", - "neurodata_type": "LabMetaDataMouse", - "technique": None, - "approach": None, - }, - "LabMetaDataSession": { - "module": "misc", - "neurodata_type": "LabMetaDataSession", - "technique": None, - "approach": None, - }, - "LabMetaData_ext": { - "module": "misc", - "neurodata_type": "LabMetaData_ext", - "technique": None, - "approach": None, - }, - "LabNotebook": { - "module": "misc", - "neurodata_type": "LabNotebook", - "technique": None, - "approach": None, - }, - "LabNotebookNumericalKeys": { - "module": "misc", - "neurodata_type": "LabNotebookNumericalKeys", - "technique": None, - "approach": None, - }, - "LabNotebookNumericalValues": { - "module": "misc", - "neurodata_type": "LabNotebookNumericalValues", - "technique": None, - "approach": None, - }, - "LabNotebookTextualKeys": { - "module": "misc", - "neurodata_type": "LabNotebookTextualKeys", - "technique": None, - "approach": None, - }, - "LabNotebookTextualValues": { - "module": "misc", - "neurodata_type": "LabNotebookTextualValues", - "technique": None, - "approach": None, - }, - "NDXICEphysFile": { - "module": "misc", - "neurodata_type": "NDXICEphysFile", - "technique": None, - "approach": None, - }, - "NwbImageSeries": { - "module": "misc", - "neurodata_type": "NwbImageSeries", - "technique": None, - "approach": None, - }, - "OphysMetadata": { - "module": "misc", - "neurodata_type": "OphysMetadata", - "technique": None, - "approach": "microscopy approach", - }, - "OpticalChannelReferences": { - "module": "misc", - "neurodata_type": "OpticalChannelReferences", - "technique": None, - "approach": None, - }, - "RepetitionsTable": { - "module": "misc", - "neurodata_type": "RepetitionsTable", - "technique": None, - "approach": None, - }, - "Results": { - "module": "misc", - "neurodata_type": "Results", - "technique": None, - "approach": None, - }, - "ResultsNumericalKeys": { - "module": "misc", - "neurodata_type": "ResultsNumericalKeys", - "technique": None, - "approach": None, - }, - "ResultsNumericalValues": { - "module": "misc", - "neurodata_type": "ResultsNumericalValues", - "technique": None, - "approach": None, - }, - "ResultsTextualKeys": { - "module": "misc", - "neurodata_type": "ResultsTextualKeys", - "technique": None, - "approach": None, - }, - "ResultsTextualValues": { - "module": "misc", - "neurodata_type": "ResultsTextualValues", - "technique": None, - "approach": None, - }, - "ScratchData": { - "module": "misc", - "neurodata_type": "ScratchData", - "technique": None, - "approach": None, - }, - "SimulationMetaData": { - "module": "misc", - "neurodata_type": "SimulationMetaData", - "technique": None, - "approach": None, - }, - "StimulusSetReferenced": { - "module": "misc", - "neurodata_type": "StimulusSetReferenced", - "technique": None, - "approach": None, - }, - "StimulusSetReferencedFolder": { - "module": "misc", - "neurodata_type": "StimulusSetReferencedFolder", - "technique": None, - "approach": None, - }, - "StimulusSetReferencedWaveform": { - "module": "misc", - "neurodata_type": "StimulusSetReferencedWaveform", - "technique": None, - "approach": None, - }, - "StimulusSetWavebuilderParameter": { - "module": "misc", - "neurodata_type": "StimulusSetWavebuilderParameter", - "technique": None, - "approach": None, - }, - "StimulusSetWavebuilderParameterText": { - "module": "misc", - "neurodata_type": "StimulusSetWavebuilderParameterText", - "technique": None, - "approach": None, - }, - "StimulusSetWavebuilderSegmentTypes": { - "module": "misc", - "neurodata_type": "StimulusSetWavebuilderSegmentTypes", - "technique": None, - "approach": None, - }, - "StimulusSets": { - "module": "misc", - "neurodata_type": "StimulusSets", - "technique": None, - "approach": None, - }, - "Testpulse": { - "module": "misc", - "neurodata_type": "Testpulse", - "technique": None, - "approach": None, - }, - "TestpulseMetadata": { - "module": "misc", - "neurodata_type": "TestpulseMetadata", - "technique": None, - "approach": None, - }, - "TestpulseRawData": { - "module": "misc", - "neurodata_type": "TestpulseRawData", - "technique": None, - "approach": None, - }, - "TimeIntervals": { - "module": "misc", - "neurodata_type": "TimeIntervals", - "technique": None, - "approach": None, - }, - "TimeSeriesReferenceVectorData": { - "module": "misc", - "neurodata_type": "TimeSeriesReferenceVectorData", - "technique": None, - "approach": None, - }, - "TimestampVectorData": { - "module": "misc", - "neurodata_type": "TimestampVectorData", - "technique": None, - "approach": None, - }, - "TtlTypesTable": { - "module": "misc", - "neurodata_type": "TtlTypesTable", - "technique": None, - "approach": "behavioral approach", - }, - "TtlsTable": { - "module": "misc", - "neurodata_type": "TtlsTable", - "technique": None, - "approach": "behavioral approach", - }, - "TurnerLabMetaData": { - "module": "misc", - "neurodata_type": "TurnerLabMetaData", - "technique": None, - "approach": None, - }, - "UserComment": { - "module": "misc", - "neurodata_type": "UserComment", - "technique": None, - "approach": None, - }, - "UserCommentString": { - "module": "misc", - "neurodata_type": "UserCommentString", - "technique": None, - "approach": None, - }, - "VectorData": { - "module": "misc", - "neurodata_type": "VectorData", - "technique": None, - "approach": None, - }, - "VectorIndex": { - "module": "misc", - "neurodata_type": "VectorIndex", - "technique": None, - "approach": None, - }, - "experimentlevel1": { - "module": "misc", - "neurodata_type": "experimentlevel1", - "technique": None, - "approach": None, - }, - "experimentlevel2": { - "module": "misc", - "neurodata_type": "experimentlevel2", - "technique": None, - "approach": None, - }, - "experimentlevel3": { - "module": "misc", - "neurodata_type": "experimentlevel3", - "technique": None, - "approach": None, - }, - "experimentlevel4": { - "module": "misc", - "neurodata_type": "experimentlevel4", - "technique": None, - "approach": None, - }, - "ibl_bwm_metadata": { - "module": "misc", - "neurodata_type": "ibl_bwm_metadata", - "technique": None, - "approach": None, - }, - - # motion module - "PoseEstimation": { - "module": "motion", - "neurodata_type": "PoseEstimation", - "technique": "pose estimation technique", - "approach": "behavioral approach", - }, - "PoseEstimationSeries": { - "module": "motion", - "neurodata_type": "PoseEstimationSeries", - "technique": "pose estimation technique", - "approach": "behavioral approach", - }, - - # nirs module - "NIRSChannelsTable": { - "module": "nirs", - "neurodata_type": "NIRSChannelsTable", - "technique": None, - "approach": "near-infrared spectroscopy", - }, - "NIRSDetectorsTable": { - "module": "nirs", - "neurodata_type": "NIRSDetectorsTable", - "technique": None, - "approach": "near-infrared spectroscopy", - }, - "NIRSSeries": { - "module": "nirs", - "neurodata_type": "NIRSSeries", - "technique": "near-infrared spectroscopy technique", - "approach": "near-infrared spectroscopy", - }, - "NIRSSourcesTable": { - "module": "nirs", - "neurodata_type": "NIRSSourcesTable", - "technique": None, - "approach": "near-infrared spectroscopy", - }, - - # ogen module - "OptogeneticSeries": { - "module": "ogen", - "neurodata_type": "OptogeneticSeries", - "technique": "optogenetic stimulation technique", - "approach": "optogenetic approach", - }, - "OptogeneticStimulusSite": { - "module": "ogen", - "neurodata_type": "OptogeneticStimulusSite", - "technique": None, - "approach": "optogenetic approach", - }, - "OptogeneticStimulusTarget": { - "module": "ogen", - "neurodata_type": "OptogeneticStimulusTarget", - "technique": None, - "approach": "optogenetic approach", - }, - "PatternedOptogeneticStimulusSite": { - "module": "ogen", - "neurodata_type": "PatternedOptogeneticStimulusSite", - "technique": "optogenetic stimulation technique", - "approach": "optogenetic approach", - }, - "PatternedOptogeneticStimulusTable": { - "module": "ogen", - "neurodata_type": "PatternedOptogeneticStimulusTable", - "technique": None, - "approach": "optogenetic approach", - }, - "TemporalFocusing": { - "module": "ogen", - "neurodata_type": "TemporalFocusing", - "technique": "optogenetic stimulation technique", - "approach": "optogenetic approach", - }, - - # ophys module - "BandOpticalFilter": { - "module": "ophys", - "neurodata_type": "BandOpticalFilter", - "technique": "optical filtering technique", - "approach": "microscopy approach", - }, - "CorrectedImageStack": { - "module": "ophys", - "neurodata_type": "CorrectedImageStack", - "technique": "image correction technique", - "approach": "microscopy approach", - }, - "DepthImageSeries": { - "module": "ophys", - "neurodata_type": "DepthImageSeries", - "technique": "depth imaging technique", - "approach": "microscopy approach", - }, - "DfOverF": { - "module": "ophys", - "neurodata_type": "DfOverF", - "technique": "fluorescence imaging technique", - "approach": "calcium imaging; cell population imaging", - }, - "DffSeries": { - "module": "ophys", - "neurodata_type": "DffSeries", - "technique": "fluorescence imaging technique", - "approach": "calcium imaging; cell population imaging", - }, - "DichroicMirror": { - "module": "ophys", - "neurodata_type": "DichroicMirror", - "technique": "optical filtering technique", - "approach": "microscopy approach", - }, - "EXTRACTSegmentation": { - "module": "ophys", - "neurodata_type": "EXTRACTSegmentation", - "technique": "image segmentation technique", - "approach": "microscopy approach; cell population imaging", - }, - "ExcitationSource": { - "module": "ophys", - "neurodata_type": "ExcitationSource", - "technique": None, - "approach": "microscopy approach", - }, - "ExcitationSourcesTable": { - "module": "ophys", - "neurodata_type": "ExcitationSourcesTable", - "technique": None, - "approach": "microscopy approach", - }, - "Fluorescence": { - "module": "ophys", - "neurodata_type": "Fluorescence", - "technique": "fluorescence imaging technique", - "approach": "calcium imaging; cell population imaging", - }, - "FluorophoresTable": { - "module": "ophys", - "neurodata_type": "FluorophoresTable", - "technique": None, - "approach": "microscopy approach", - }, - "ImageSegmentation": { - "module": "ophys", - "neurodata_type": "ImageSegmentation", - "technique": "image segmentation technique", - "approach": "microscopy approach; cell population imaging", - }, - "ImagingPlane": { - "module": "ophys", - "neurodata_type": "ImagingPlane", - "technique": None, - "approach": "microscopy approach; cell population imaging", - }, - "ImagingVolume": { - "module": "ophys", - "neurodata_type": "ImagingVolume", - "technique": "volumetric imaging technique", - "approach": "microscopy approach; cell population imaging", - }, - "Indicator": { - "module": "ophys", - "neurodata_type": "Indicator", - "technique": None, - "approach": "microscopy approach", - }, - "LightSource": { - "module": "ophys", - "neurodata_type": "LightSource", - "technique": None, - "approach": "microscopy approach", - }, - "MicroscopyLightSource": { - "module": "ophys", - "neurodata_type": "MicroscopyLightSource", - "technique": None, - "approach": "microscopy approach", - }, - "MicroscopyOpticalChannel": { - "module": "ophys", - "neurodata_type": "MicroscopyOpticalChannel", - "technique": None, - "approach": "microscopy approach", - }, - "MicroscopyPlaneSegmentation": { - "module": "ophys", - "neurodata_type": "MicroscopyPlaneSegmentation", - "technique": "image segmentation technique", - "approach": "microscopy approach; cell population imaging", - }, - "MicroscopyResponseSeries": { - "module": "ophys", - "neurodata_type": "MicroscopyResponseSeries", - "technique": "optical imaging technique", - "approach": "microscopy approach", - }, - "MicroscopyResponseSeriesContainer": { - "module": "ophys", - "neurodata_type": "MicroscopyResponseSeriesContainer", - "technique": None, - "approach": "microscopy approach", - }, - "MicroscopySegmentations": { - "module": "ophys", - "neurodata_type": "MicroscopySegmentations", - "technique": "image segmentation technique", - "approach": "microscopy approach; cell population imaging", - }, - "MotionCorrection": { - "module": "ophys", - "neurodata_type": "MotionCorrection", - "technique": "image correction technique", - "approach": "microscopy approach", - }, - "MultiChannelVolume": { - "module": "ophys", - "neurodata_type": "MultiChannelVolume", - "technique": "volumetric imaging technique", - "approach": "microscopy approach", - }, - "MultiChannelVolumeSeries": { - "module": "ophys", - "neurodata_type": "MultiChannelVolumeSeries", - "technique": "volumetric imaging technique", - "approach": "microscopy approach", - }, - "OnePhotonSeries": { - "module": "ophys", - "neurodata_type": "OnePhotonSeries", - "technique": "one-photon microscopy technique", - "approach": "microscopy approach; cell population imaging", - }, - "OphysEventDetection": { - "module": "ophys", - "neurodata_type": "OphysEventDetection", - "technique": "event detection technique", - "approach": "microscopy approach; cell population imaging", - }, - "OpticalChannel": { - "module": "ophys", - "neurodata_type": "OpticalChannel", - "technique": None, - "approach": "microscopy approach; cell population imaging", - }, - "OpticalChannelPlus": { - "module": "ophys", - "neurodata_type": "OpticalChannelPlus", - "technique": None, - "approach": "microscopy approach", - }, - "OpticalSeries": { - "module": "ophys", - "neurodata_type": "OpticalSeries", - "technique": "optical imaging technique", - "approach": "microscopy approach", - }, - "PlanarImagingSpace": { - "module": "ophys", - "neurodata_type": "PlanarImagingSpace", - "technique": None, - "approach": "microscopy approach", - }, - "PlaneSegmentation": { - "module": "ophys", - "neurodata_type": "PlaneSegmentation", - "technique": None, - "approach": "microscopy approach; cell population imaging", - }, - "RoiResponseSeries": { - "module": "ophys", - "neurodata_type": "RoiResponseSeries", - "technique": "fluorescence imaging technique", - "approach": "calcium imaging; cell population imaging", - }, - "SegmentationLabels": { - "module": "ophys", - "neurodata_type": "SegmentationLabels", - "technique": None, - "approach": "microscopy approach; cell population imaging", - }, - "TwoPhotonSeries": { - "module": "ophys", - "neurodata_type": "TwoPhotonSeries", - "technique": "two-photon microscopy technique", - "approach": "microscopy approach; cell population imaging", - }, - "VariableDepthMicroscopySeries": { - "module": "ophys", - "neurodata_type": "VariableDepthMicroscopySeries", - "technique": "volumetric imaging technique", - "approach": "microscopy approach", - }, - "VariableDepthMultiChannelMicroscopyVolume": { - "module": "ophys", - "neurodata_type": "VariableDepthMultiChannelMicroscopyVolume", - "technique": "volumetric imaging technique", - "approach": "microscopy approach", - }, - "VolumetricImagingSpace": { - "module": "ophys", - "neurodata_type": "VolumetricImagingSpace", - "technique": None, - "approach": "microscopy approach", - }, - - # sortedunits module - "Units": { - "module": "sortedunits", - "neurodata_type": "Units", - "technique": "spike sorting technique", - "approach": "electrophysiological approach", - }, - - # spectrum module - "Spectrum": { - "module": "spectrum", - "neurodata_type": "Spectrum", - "technique": "fourier analysis technique", - "approach": None, - }, - - # subject module - "CElegansSubject": { - "module": "subject", - "neurodata_type": "CElegansSubject", - "technique": None, - "approach": None, - }, - "CreSubject": { - "module": "subject", - "neurodata_type": "CreSubject", - "technique": None, - "approach": None, - }, - "EcephysSpecimen": { - "module": "subject", - "neurodata_type": "EcephysSpecimen", - "technique": None, - "approach": "electrophysiological approach", - }, - "IblSubject": { - "module": "subject", - "neurodata_type": "IblSubject", - "technique": None, - "approach": None, - }, - "Subject": { - "module": "subject", - "neurodata_type": "Subject", - "technique": None, - "approach": None, - }, -} diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 978e09831..ab020fc59 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -993,12 +993,74 @@ class Neurodatum(TypedDict): "technique": "pose estimation training technique", "approach": "behavioral approach", }, + # from both the deprecated ndx-photometry and the new ndx-fiber-photometry "FiberPhotometryResponseSeries": { "module": "fiberphotometry", - # this can come from both the old ndx-photometry and the new ndx-fiber-photometry "neurodata_type": "FiberPhotometryResponseSeries", - "technique": "fiber photometry technique; optical technique", - "approach": "calcium imaging; cell population imaging", + "technique": "fiber photometry technique", + "approach": "fiber photometry approach", + }, + # from the deprecated ndx-photometry + "FibersTable": { + "module": "fiberphotometry", + "neurodata_type": "FibersTable", + "technique": None, + "approach": "fiber photometry approach", + }, + "ExcitationSourcesTable": { + "module": "fiberphotometry", + "neurodata_type": "ExcitationSourcesTable", + "technique": None, + "approach": "fiber photometry approach", + }, + "PhotodetectorsTable": { + "module": "fiberphotometry", + "neurodata_type": "PhotodetectorsTable", + "technique": None, + "approach": "fiber photometry approach", + }, + "FluorophoresTable": { + "module": "fiberphotometry", + "neurodata_type": "FluorophoresTable", + "technique": None, + "approach": "fiber photometry approach", + }, + # from ndx-fiber-photometry + "FiberPhotometry": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometry", + "technique": None, + "approach": "fiber photometry approach", + }, + "FiberPhotometryTable": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometryTable", + "technique": None, + "approach": "fiber photometry approach", + }, + "OpticalFiber": { + "module": "fiberphotometry", + "neurodata_type": "OpticalFiber", + "technique": None, + "approach": "fiber photometry approach", + }, + "ExcitationSource": { + "module": "fiberphotometry", + "neurodata_type": "ExcitationSource", + "technique": None, + "approach": "fiber photometry approach", + }, + "Photodetector": { + "module": "fiberphotometry", + "neurodata_type": "Photodetector", + "technique": None, + "approach": "fiber photometry approach", + }, + "Indicator": { + "module": "fiberphotometry", + "neurodata_type": "Indicator", + "technique": None, + "approach": "fiber photometry approach", }, } diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index 539b9b5ac..67948d377 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -1257,11 +1257,21 @@ def test_species_record_matching_methods() -> None: ( ["FiberPhotometryResponseSeries"], { - "approach": ["calcium imaging; cell population imaging"], - "measurementTechnique": ["fiber photometry technique; optical technique"], + "approach": ["fiber photometry approach"], + "measurementTechnique": ["fiber photometry technique"], "variableMeasured": ["FiberPhotometryResponseSeries"], }, ), + pytest.param( + # ndx-photometry metadata tables alone should mark the asset + ["FibersTable"], + { + "approach": ["fiber photometry approach"], + "measurementTechnique": None, + "variableMeasured": ["FibersTable"], + }, + marks=pytest.mark.ai_generated, + ), ( # the tricky case of having number of instances of the data type # https://github.com/dandi/dandi-cli/issues/890 From 9427a7ec35ac451304a7f8db6b10fc7a991f506b Mon Sep 17 00:00:00 2001 From: rly <310197+rly@users.noreply.github.com> Date: Wed, 2 Sep 2026 09:24:19 -0700 Subject: [PATCH 19/20] Restrict photometry types to names unique to the photometry extensions OpticalFiber, ExcitationSource, Photodetector, and Indicator are defined by ndx-ophys-devices, which ndx-microscopy and ndx-optogenetics also import. get_neurodata_types reads the raw HDF5 neurodata_type attribute and drops the namespace, so keying the map on those names tagged two-photon and optogenetics assets as fiber photometry. Drop them and cover the remaining names that only the photometry extensions define: CommandedVoltageSeries, DeconvolvedFiberPhotometryResponseSeries, MultiCommandedVoltage, FiberPhotometryIndicators, FiberPhotometryViruses, and FiberPhotometryVirusInjections. FiberPhotometry is defined by both extensions, so group it with FiberPhotometryResponseSeries. Co-Authored-By: Claude Opus 5 (1M context) --- dandi/metadata/util.py | 44 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index 3a6c6bc09..fea4b5d00 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -993,14 +993,26 @@ class Neurodatum(TypedDict): "technique": "pose estimation training technique", "approach": "behavioral approach", }, - # from both the deprecated ndx-photometry and the new ndx-fiber-photometry + # defined by both the deprecated ndx-photometry and ndx-fiber-photometry "FiberPhotometryResponseSeries": { "module": "fiberphotometry", "neurodata_type": "FiberPhotometryResponseSeries", "technique": "fiber photometry technique", "approach": "fiber photometry approach", }, - # from the deprecated ndx-photometry + "FiberPhotometry": { + "module": "fiberphotometry", + "neurodata_type": "FiberPhotometry", + "technique": None, + "approach": "fiber photometry approach", + }, + "CommandedVoltageSeries": { + "module": "fiberphotometry", + "neurodata_type": "CommandedVoltageSeries", + "technique": None, + "approach": "fiber photometry approach", + }, + # defined by the deprecated ndx-photometry "FibersTable": { "module": "fiberphotometry", "neurodata_type": "FibersTable", @@ -1025,40 +1037,40 @@ class Neurodatum(TypedDict): "technique": None, "approach": "fiber photometry approach", }, - # from ndx-fiber-photometry - "FiberPhotometry": { + "DeconvolvedFiberPhotometryResponseSeries": { "module": "fiberphotometry", - "neurodata_type": "FiberPhotometry", - "technique": None, + "neurodata_type": "DeconvolvedFiberPhotometryResponseSeries", + "technique": "fiber photometry technique", "approach": "fiber photometry approach", }, - "FiberPhotometryTable": { + "MultiCommandedVoltage": { "module": "fiberphotometry", - "neurodata_type": "FiberPhotometryTable", + "neurodata_type": "MultiCommandedVoltage", "technique": None, "approach": "fiber photometry approach", }, - "OpticalFiber": { + # defined by ndx-fiber-photometry + "FiberPhotometryTable": { "module": "fiberphotometry", - "neurodata_type": "OpticalFiber", + "neurodata_type": "FiberPhotometryTable", "technique": None, "approach": "fiber photometry approach", }, - "ExcitationSource": { + "FiberPhotometryIndicators": { "module": "fiberphotometry", - "neurodata_type": "ExcitationSource", + "neurodata_type": "FiberPhotometryIndicators", "technique": None, "approach": "fiber photometry approach", }, - "Photodetector": { + "FiberPhotometryViruses": { "module": "fiberphotometry", - "neurodata_type": "Photodetector", + "neurodata_type": "FiberPhotometryViruses", "technique": None, "approach": "fiber photometry approach", }, - "Indicator": { + "FiberPhotometryVirusInjections": { "module": "fiberphotometry", - "neurodata_type": "Indicator", + "neurodata_type": "FiberPhotometryVirusInjections", "technique": None, "approach": "fiber photometry approach", }, From bfbe6eb9e52eb7d185d98b8901425dfde68ca903 Mon Sep 17 00:00:00 2001 From: rly <310197+rly@users.noreply.github.com> Date: Wed, 2 Sep 2026 13:02:24 -0700 Subject: [PATCH 20/20] Assign techniques to implant and commanded voltage types Entries in neurodata_typemap declare what their type implies on its own, without relying on other types being present in the same file: CurrentClampStimulusSeries carries the clamp technique alongside CurrentClampSeries, and eight behavior types each carry the behavioral technique. process_ndtypes collects into a set, so the overlap costs nothing. FibersTable and FiberPhotometryTable hold stereotactic implant coordinates, and OptogeneticStimulusSite describes an implanted stimulation site, so all three take "surgical technique" as ElectrodeGroup does. CommandedVoltageSeries and MultiCommandedVoltage drive the excitation source, so they take "fiber photometry technique" as the response series does. The Units and Spectrum module values return to their master values. Nothing reads Neurodatum["module"], and filename suffixes come from get_neurodata_types_to_modalities_map, so changing them belongs with the work that gives the field meaning. Co-Authored-By: Claude Opus 5 (1M context) --- dandi/metadata/util.py | 14 +++++++------- dandi/tests/test_metadata.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dandi/metadata/util.py b/dandi/metadata/util.py index fea4b5d00..ce580fac3 100644 --- a/dandi/metadata/util.py +++ b/dandi/metadata/util.py @@ -952,13 +952,13 @@ class Neurodatum(TypedDict): "approach": None, }, "Units": { - "module": "sortedunits", + "module": "misc", "neurodata_type": "Units", "technique": "spike sorting technique", "approach": "electrophysiological approach", }, "Spectrum": { - "module": "spectrum", + "module": "ndx-spectrum", "neurodata_type": "Spectrum", "technique": "fourier analysis technique", "approach": None, @@ -966,7 +966,7 @@ class Neurodatum(TypedDict): "OptogeneticStimulusSite": { "module": "ogen", "neurodata_type": "OptogeneticStimulusSite", - "technique": None, + "technique": "surgical technique", "approach": "optogenetic approach", }, "OptogeneticSeries": { @@ -1009,14 +1009,14 @@ class Neurodatum(TypedDict): "CommandedVoltageSeries": { "module": "fiberphotometry", "neurodata_type": "CommandedVoltageSeries", - "technique": None, + "technique": "fiber photometry technique", "approach": "fiber photometry approach", }, # defined by the deprecated ndx-photometry "FibersTable": { "module": "fiberphotometry", "neurodata_type": "FibersTable", - "technique": None, + "technique": "surgical technique", "approach": "fiber photometry approach", }, "ExcitationSourcesTable": { @@ -1046,14 +1046,14 @@ class Neurodatum(TypedDict): "MultiCommandedVoltage": { "module": "fiberphotometry", "neurodata_type": "MultiCommandedVoltage", - "technique": None, + "technique": "fiber photometry technique", "approach": "fiber photometry approach", }, # defined by ndx-fiber-photometry "FiberPhotometryTable": { "module": "fiberphotometry", "neurodata_type": "FiberPhotometryTable", - "technique": None, + "technique": "surgical technique", "approach": "fiber photometry approach", }, "FiberPhotometryIndicators": { diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index 67948d377..3b9f71681 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -1218,7 +1218,7 @@ def test_species_record_matching_methods() -> None: ["OptogeneticStimulusSite"], { "approach": ["optogenetic approach"], - "measurementTechnique": None, + "measurementTechnique": ["surgical technique"], "variableMeasured": ["OptogeneticStimulusSite"], }, ), @@ -1267,7 +1267,7 @@ def test_species_record_matching_methods() -> None: ["FibersTable"], { "approach": ["fiber photometry approach"], - "measurementTechnique": None, + "measurementTechnique": ["surgical technique"], "variableMeasured": ["FibersTable"], }, marks=pytest.mark.ai_generated,