diff --git a/.gitignore b/.gitignore index a6393f3da..cb00ad48a 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ src/build # PyCharm .idea/ + +ophys_testing_data/ diff --git a/src/supported_interfaces.json b/src/supported_interfaces.json index db1023f39..36710f80d 100644 --- a/src/supported_interfaces.json +++ b/src/supported_interfaces.json @@ -29,11 +29,10 @@ "PlexonRecordingInterface", "PlexonSortingInterface", "AxonaRecordingInterface", - "VideoInterface", + "ExternalVideoInterface", "NeuralynxRecordingInterface", "Suite2pSegmentationInterface", "AlphaOmegaRecordingInterface", - "AlphaOmegaRecordingInterface", "DeepLabCutInterface", "SLEAPInterface", "FicTracDataInterface", @@ -44,5 +43,6 @@ "BrukerTiffSinglePlaneConverter", "BrukerTiffMultiPlaneConverter", "MiniscopeConverter", - "CellExplorerRecordingInterface" + "CellExplorerRecordingInterface", + "WhiteMatterRecordingInterface" ] diff --git a/stories/inputs/interface_schemas/AlphaOmegaRecordingInterface.json b/stories/inputs/interface_schemas/AlphaOmegaRecordingInterface.json index 203c5c399..d77754519 100644 --- a/stories/inputs/interface_schemas/AlphaOmegaRecordingInterface.json +++ b/stories/inputs/interface_schemas/AlphaOmegaRecordingInterface.json @@ -4,12 +4,12 @@ "AlphaOmegaRecordingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to the folder of .mpx files." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/AudioInterface.json b/stories/inputs/interface_schemas/AudioInterface.json index 9dcaca8c2..59e461e2c 100644 --- a/stories/inputs/interface_schemas/AudioInterface.json +++ b/stories/inputs/interface_schemas/AudioInterface.json @@ -5,7 +5,7 @@ "properties": { "file_paths": { "items": { - "format": "file-path", + "format": "path", "type": "string" }, "type": "array" diff --git a/stories/inputs/interface_schemas/AxonaRecordingInterface.json b/stories/inputs/interface_schemas/AxonaRecordingInterface.json index ae718921d..2c950f117 100644 --- a/stories/inputs/interface_schemas/AxonaRecordingInterface.json +++ b/stories/inputs/interface_schemas/AxonaRecordingInterface.json @@ -4,12 +4,12 @@ "AxonaRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to .bin file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/BiocamRecordingInterface.json b/stories/inputs/interface_schemas/BiocamRecordingInterface.json index 47fcf95b9..4a3cb6684 100644 --- a/stories/inputs/interface_schemas/BiocamRecordingInterface.json +++ b/stories/inputs/interface_schemas/BiocamRecordingInterface.json @@ -4,12 +4,12 @@ "BiocamRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the .bwr file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/BlackrockRecordingInterface.json b/stories/inputs/interface_schemas/BlackrockRecordingInterface.json index 73e5d708e..0a4a3a2a5 100644 --- a/stories/inputs/interface_schemas/BlackrockRecordingInterface.json +++ b/stories/inputs/interface_schemas/BlackrockRecordingInterface.json @@ -4,14 +4,14 @@ "BlackrockRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the Blackrock file with suffix being .ns1, .ns2, .ns3, .ns4m .ns4, or .ns6." }, "nsx_override": { "anyOf": [ { - "format": "file-path", + "format": "path", "type": "string" }, { @@ -21,7 +21,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/BlackrockSortingInterface.json b/stories/inputs/interface_schemas/BlackrockSortingInterface.json index d101083b6..d89252469 100644 --- a/stories/inputs/interface_schemas/BlackrockSortingInterface.json +++ b/stories/inputs/interface_schemas/BlackrockSortingInterface.json @@ -4,17 +4,43 @@ "BlackrockSortingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to Blackrock .nev file." }, "sampling_frequency": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], "default": null, - "type": "number", - "description": "The sampling frequency for the sorting extractor. When the signal data is available (.ncs) those files will be" + "description": "The sampling frequency for the sorting extractor. When the signal data is available (.ncs) those files will be\nused to extract the frequency automatically. Otherwise, the sampling frequency needs to be specified for\nthis extractor to be initialized." + }, + "nsx_to_load": { + "anyOf": [ + { + "type": "integer" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "IDs of nsX file from which to load data, e.g., if set to 5 only data from the ns5 file are loaded.\nIf 'all', then all nsX will be loaded. If None, all nsX files will be loaded. If empty list, no nsX files will be loaded." }, "verbose": { - "default": true, + "default": false, "type": "boolean", "description": "Enables verbosity" } diff --git a/stories/inputs/interface_schemas/BrukerTiffMultiPlaneConverter.json b/stories/inputs/interface_schemas/BrukerTiffMultiPlaneConverter.json index d12570e22..60b3428b0 100644 --- a/stories/inputs/interface_schemas/BrukerTiffMultiPlaneConverter.json +++ b/stories/inputs/interface_schemas/BrukerTiffMultiPlaneConverter.json @@ -4,12 +4,11 @@ "BrukerTiffMultiPlaneConverter": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "The folder that contains the Bruker TIF image files (.ome.tif) and configuration files (.xml, .env)." }, "plane_separation_type": { - "default": null, "enum": [ "disjoint", "contiguous" @@ -22,7 +21,8 @@ } }, "required": [ - "folder_path" + "folder_path", + "plane_separation_type" ], "type": "object", "additionalProperties": false diff --git a/stories/inputs/interface_schemas/BrukerTiffMultiPlaneImagingInterface.json b/stories/inputs/interface_schemas/BrukerTiffMultiPlaneImagingInterface.json index 6e2b59226..80a897aee 100644 --- a/stories/inputs/interface_schemas/BrukerTiffMultiPlaneImagingInterface.json +++ b/stories/inputs/interface_schemas/BrukerTiffMultiPlaneImagingInterface.json @@ -4,7 +4,7 @@ "BrukerTiffMultiPlaneImagingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "The folder that contains the Bruker TIF image files (.ome.tif) and configuration files (.xml, .env)." }, @@ -20,7 +20,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/BrukerTiffSinglePlaneConverter.json b/stories/inputs/interface_schemas/BrukerTiffSinglePlaneConverter.json index 9e37da925..c1efaa9b8 100644 --- a/stories/inputs/interface_schemas/BrukerTiffSinglePlaneConverter.json +++ b/stories/inputs/interface_schemas/BrukerTiffSinglePlaneConverter.json @@ -4,7 +4,7 @@ "BrukerTiffSinglePlaneConverter": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string" }, "verbose": { diff --git a/stories/inputs/interface_schemas/BrukerTiffSinglePlaneImagingInterface.json b/stories/inputs/interface_schemas/BrukerTiffSinglePlaneImagingInterface.json index 846d4a4c5..f4d8b6267 100644 --- a/stories/inputs/interface_schemas/BrukerTiffSinglePlaneImagingInterface.json +++ b/stories/inputs/interface_schemas/BrukerTiffSinglePlaneImagingInterface.json @@ -4,7 +4,7 @@ "BrukerTiffSinglePlaneImagingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "The folder containing the Bruker TIF image files and configuration files." }, @@ -20,7 +20,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/CaimanSegmentationInterface.json b/stories/inputs/interface_schemas/CaimanSegmentationInterface.json index ad10efa1d..cefbd8ae0 100644 --- a/stories/inputs/interface_schemas/CaimanSegmentationInterface.json +++ b/stories/inputs/interface_schemas/CaimanSegmentationInterface.json @@ -4,12 +4,12 @@ "CaimanSegmentationInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to .hdf5 file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/CellExplorerRecordingInterface.json b/stories/inputs/interface_schemas/CellExplorerRecordingInterface.json index 9e6c78679..c362bb1ce 100644 --- a/stories/inputs/interface_schemas/CellExplorerRecordingInterface.json +++ b/stories/inputs/interface_schemas/CellExplorerRecordingInterface.json @@ -4,12 +4,12 @@ "CellExplorerRecordingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Folder containing the .session.mat file" }, "verbose": { - "default": true, + "default": false, "type": "boolean", "description": "Whether to output verbose text." }, diff --git a/stories/inputs/interface_schemas/CellExplorerSortingInterface.json b/stories/inputs/interface_schemas/CellExplorerSortingInterface.json index 7b6f88059..4a8396487 100644 --- a/stories/inputs/interface_schemas/CellExplorerSortingInterface.json +++ b/stories/inputs/interface_schemas/CellExplorerSortingInterface.json @@ -4,11 +4,11 @@ "CellExplorerSortingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string" }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/CnmfeSegmentationInterface.json b/stories/inputs/interface_schemas/CnmfeSegmentationInterface.json index f29cad94c..de294e453 100644 --- a/stories/inputs/interface_schemas/CnmfeSegmentationInterface.json +++ b/stories/inputs/interface_schemas/CnmfeSegmentationInterface.json @@ -4,11 +4,11 @@ "CnmfeSegmentationInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string" }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/DeepLabCutInterface.json b/stories/inputs/interface_schemas/DeepLabCutInterface.json index 97b0a03c3..e60bd26ff 100644 --- a/stories/inputs/interface_schemas/DeepLabCutInterface.json +++ b/stories/inputs/interface_schemas/DeepLabCutInterface.json @@ -4,27 +4,38 @@ "DeepLabCutInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", - "description": "Path to the .h5 file output by dlc." + "description": "Path to the file output by dlc (.h5 or .csv)." }, "config_file_path": { - "format": "file-path", - "type": "string", - "description": "Path to .yml config file" + "anyOf": [ + { + "format": "path", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Path to .yml config file." }, "subject_name": { "default": "ind1", "type": "string" }, + "pose_estimation_metadata_key": { + "default": "PoseEstimationDeepLabCut", + "type": "string" + }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, "required": [ - "file_path", - "config_file_path" + "file_path" ], "type": "object", "additionalProperties": false diff --git a/stories/inputs/interface_schemas/EDFRecordingInterface.json b/stories/inputs/interface_schemas/EDFRecordingInterface.json index c86cb641d..a8b169955 100644 --- a/stories/inputs/interface_schemas/EDFRecordingInterface.json +++ b/stories/inputs/interface_schemas/EDFRecordingInterface.json @@ -4,17 +4,29 @@ "EDFRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the .edf file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { "default": "ElectricalSeries", "type": "string" + }, + "channels_to_skip": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null } }, "required": [ diff --git a/stories/inputs/interface_schemas/VideoInterface.json b/stories/inputs/interface_schemas/ExternalVideoInterface.json similarity index 68% rename from stories/inputs/interface_schemas/VideoInterface.json rename to stories/inputs/interface_schemas/ExternalVideoInterface.json index 0b9e5e08f..f7e1d9225 100644 --- a/stories/inputs/interface_schemas/VideoInterface.json +++ b/stories/inputs/interface_schemas/ExternalVideoInterface.json @@ -1,11 +1,11 @@ { "required": [], "properties": { - "VideoInterface": { + "ExternalVideoInterface": { "properties": { "file_paths": { "items": { - "format": "file-path", + "format": "path", "type": "string" }, "type": "array" @@ -14,9 +14,16 @@ "default": false, "type": "boolean" }, - "metadata_key_name": { - "default": "Videos", - "type": "string" + "video_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null } }, "required": [ diff --git a/stories/inputs/interface_schemas/ExtractSegmentationInterface.json b/stories/inputs/interface_schemas/ExtractSegmentationInterface.json index 05fe0fb18..7732c4cfe 100644 --- a/stories/inputs/interface_schemas/ExtractSegmentationInterface.json +++ b/stories/inputs/interface_schemas/ExtractSegmentationInterface.json @@ -4,7 +4,7 @@ "ExtractSegmentationInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string" }, "sampling_frequency": { @@ -22,7 +22,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/FicTracDataInterface.json b/stories/inputs/interface_schemas/FicTracDataInterface.json index 0ce14acdf..e4bee21bd 100644 --- a/stories/inputs/interface_schemas/FicTracDataInterface.json +++ b/stories/inputs/interface_schemas/FicTracDataInterface.json @@ -4,7 +4,7 @@ "FicTracDataInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the .dat file (the output of fictrac)" }, @@ -22,7 +22,7 @@ "configuration_file_path": { "anyOf": [ { - "format": "file-path", + "format": "path", "type": "string" }, { @@ -32,7 +32,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/IntanRecordingInterface.json b/stories/inputs/interface_schemas/IntanRecordingInterface.json index 149286f4c..f0b072736 100644 --- a/stories/inputs/interface_schemas/IntanRecordingInterface.json +++ b/stories/inputs/interface_schemas/IntanRecordingInterface.json @@ -4,23 +4,12 @@ "IntanRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to either a .rhd or a .rhs file" }, - "stream_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/KiloSortSortingInterface.json b/stories/inputs/interface_schemas/KiloSortSortingInterface.json index edf2e799c..3dda9586c 100644 --- a/stories/inputs/interface_schemas/KiloSortSortingInterface.json +++ b/stories/inputs/interface_schemas/KiloSortSortingInterface.json @@ -4,7 +4,7 @@ "KiloSortSortingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to the output Phy folder (containing the params.py)" }, @@ -13,7 +13,7 @@ "type": "boolean" }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/MCSRawRecordingInterface.json b/stories/inputs/interface_schemas/MCSRawRecordingInterface.json index 4cdde3f82..f2bbf9b78 100644 --- a/stories/inputs/interface_schemas/MCSRawRecordingInterface.json +++ b/stories/inputs/interface_schemas/MCSRawRecordingInterface.json @@ -4,12 +4,12 @@ "MCSRawRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the .raw file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/MEArecRecordingInterface.json b/stories/inputs/interface_schemas/MEArecRecordingInterface.json index 6a61a4d90..553addb2e 100644 --- a/stories/inputs/interface_schemas/MEArecRecordingInterface.json +++ b/stories/inputs/interface_schemas/MEArecRecordingInterface.json @@ -4,12 +4,12 @@ "MEArecRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the MEArec .h5 file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/MicroManagerTiffImagingInterface.json b/stories/inputs/interface_schemas/MicroManagerTiffImagingInterface.json index 3e3dd52b4..7a58fb7ee 100644 --- a/stories/inputs/interface_schemas/MicroManagerTiffImagingInterface.json +++ b/stories/inputs/interface_schemas/MicroManagerTiffImagingInterface.json @@ -4,12 +4,12 @@ "MicroManagerTiffImagingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "The folder containing the OME-TIF image files." }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/MiniscopeBehaviorInterface.json b/stories/inputs/interface_schemas/MiniscopeBehaviorInterface.json index 8770c2d90..809cb8c40 100644 --- a/stories/inputs/interface_schemas/MiniscopeBehaviorInterface.json +++ b/stories/inputs/interface_schemas/MiniscopeBehaviorInterface.json @@ -4,9 +4,13 @@ "MiniscopeBehaviorInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "The main Miniscope folder. The movie files are expected to be in sub folders within the main folder." + }, + "verbose": { + "default": false, + "type": "boolean" } }, "required": [ diff --git a/stories/inputs/interface_schemas/MiniscopeConverter.json b/stories/inputs/interface_schemas/MiniscopeConverter.json index 67fb323d6..116ffdcb7 100644 --- a/stories/inputs/interface_schemas/MiniscopeConverter.json +++ b/stories/inputs/interface_schemas/MiniscopeConverter.json @@ -4,12 +4,18 @@ "MiniscopeConverter": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "The path to the main Miniscope folder." }, + "user_configuration_file_path": { + "type": "string", + "format": "file-path", + "description": "Path to the Miniscope acquisition User Config JSON file (named 'UserConfigFile.json' in the Miniscope documentation and source code). When provided, the converter uses this configuration to interpret the folder hierarchy and device names instead of relying on a fixed directory structure.", + "default": null + }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/MiniscopeImagingInterface.json b/stories/inputs/interface_schemas/MiniscopeImagingInterface.json index 36fb8cc31..d09e4187e 100644 --- a/stories/inputs/interface_schemas/MiniscopeImagingInterface.json +++ b/stories/inputs/interface_schemas/MiniscopeImagingInterface.json @@ -4,14 +4,28 @@ "MiniscopeImagingInterface": { "properties": { "folder_path": { - "format": "directory-path", - "type": "string", - "description": "The main Miniscope folder. The microscope movie files are expected to be in sub folders within the main folder." + "default": null, + "format": "path", + "type": "string" + }, + "file_paths": { + "default": null, + "items": {}, + "type": "array" + }, + "configuration_file_path": { + "default": null, + "type": "string" + }, + "timeStamps_file_path": { + "default": null, + "type": "string" + }, + "verbose": { + "default": false, + "type": "boolean" } }, - "required": [ - "folder_path" - ], "type": "object", "additionalProperties": false } diff --git a/stories/inputs/interface_schemas/NeuralynxRecordingInterface.json b/stories/inputs/interface_schemas/NeuralynxRecordingInterface.json index a188add17..6b8d8cb7d 100644 --- a/stories/inputs/interface_schemas/NeuralynxRecordingInterface.json +++ b/stories/inputs/interface_schemas/NeuralynxRecordingInterface.json @@ -4,7 +4,7 @@ "NeuralynxRecordingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to Neuralynx directory containing \".ncs\", \".nse\", \".ntt\", \".nse\", or \".nev\" files." }, diff --git a/stories/inputs/interface_schemas/NeuroScopeLFPInterface.json b/stories/inputs/interface_schemas/NeuroScopeLFPInterface.json index b027efe19..66ad922ae 100644 --- a/stories/inputs/interface_schemas/NeuroScopeLFPInterface.json +++ b/stories/inputs/interface_schemas/NeuroScopeLFPInterface.json @@ -4,7 +4,7 @@ "NeuroScopeLFPInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to .lfp or .eeg file." }, @@ -22,7 +22,7 @@ "xml_file_path": { "anyOf": [ { - "format": "file-path", + "format": "path", "type": "string" }, { @@ -30,6 +30,14 @@ } ], "default": null + }, + "verbose": { + "default": false, + "type": "boolean" + }, + "es_key": { + "default": "ElectricalSeries", + "type": "string" } }, "required": [ diff --git a/stories/inputs/interface_schemas/NeuroScopeRecordingInterface.json b/stories/inputs/interface_schemas/NeuroScopeRecordingInterface.json index 251d9ead9..ca1e7899c 100644 --- a/stories/inputs/interface_schemas/NeuroScopeRecordingInterface.json +++ b/stories/inputs/interface_schemas/NeuroScopeRecordingInterface.json @@ -4,7 +4,7 @@ "NeuroScopeRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to .dat file." }, @@ -22,7 +22,7 @@ "xml_file_path": { "anyOf": [ { - "format": "file-path", + "format": "path", "type": "string" }, { @@ -32,7 +32,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/NeuroScopeSortingInterface.json b/stories/inputs/interface_schemas/NeuroScopeSortingInterface.json index 37f8852bc..6f1be9ad3 100644 --- a/stories/inputs/interface_schemas/NeuroScopeSortingInterface.json +++ b/stories/inputs/interface_schemas/NeuroScopeSortingInterface.json @@ -4,7 +4,7 @@ "NeuroScopeSortingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to folder containing .res and .clu files." }, @@ -31,7 +31,7 @@ "xml_file_path": { "anyOf": [ { - "format": "file-path", + "format": "path", "type": "string" }, { @@ -42,7 +42,7 @@ "description": "Path to .xml file containing device and electrode configuration." }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/OpenEphysRecordingInterface.json b/stories/inputs/interface_schemas/OpenEphysRecordingInterface.json index 9f58a64c8..73d42d379 100644 --- a/stories/inputs/interface_schemas/OpenEphysRecordingInterface.json +++ b/stories/inputs/interface_schemas/OpenEphysRecordingInterface.json @@ -31,7 +31,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/PhySortingInterface.json b/stories/inputs/interface_schemas/PhySortingInterface.json index e6b5d64ae..6057b093f 100644 --- a/stories/inputs/interface_schemas/PhySortingInterface.json +++ b/stories/inputs/interface_schemas/PhySortingInterface.json @@ -4,7 +4,7 @@ "PhySortingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to the output Phy folder (containing the params.py)." }, @@ -26,7 +26,7 @@ } }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/PlexonRecordingInterface.json b/stories/inputs/interface_schemas/PlexonRecordingInterface.json index 884ec9dac..da8ef87d9 100644 --- a/stories/inputs/interface_schemas/PlexonRecordingInterface.json +++ b/stories/inputs/interface_schemas/PlexonRecordingInterface.json @@ -4,17 +4,21 @@ "PlexonRecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the .plx file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { "default": "ElectricalSeries", "type": "string" + }, + "stream_name": { + "default": "WB-Wideband", + "type": "string" } }, "required": [ diff --git a/stories/inputs/interface_schemas/PlexonSortingInterface.json b/stories/inputs/interface_schemas/PlexonSortingInterface.json index 513dcf5b4..c49203ad8 100644 --- a/stories/inputs/interface_schemas/PlexonSortingInterface.json +++ b/stories/inputs/interface_schemas/PlexonSortingInterface.json @@ -4,12 +4,12 @@ "PlexonSortingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the plexon spiking data (.plx file)." }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/SLEAPInterface.json b/stories/inputs/interface_schemas/SLEAPInterface.json index 75610c8f7..f1c5d1c0d 100644 --- a/stories/inputs/interface_schemas/SLEAPInterface.json +++ b/stories/inputs/interface_schemas/SLEAPInterface.json @@ -4,14 +4,14 @@ "SLEAPInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to the .slp file (the output of sleap)" }, "video_file_path": { "anyOf": [ { - "format": "file-path", + "format": "path", "type": "string" }, { @@ -22,7 +22,7 @@ "description": "Path of the video for extracting timestamps (optional)." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "frames_per_second": { diff --git a/stories/inputs/interface_schemas/SbxImagingInterface.json b/stories/inputs/interface_schemas/SbxImagingInterface.json index 4753dbf68..a0bdca915 100644 --- a/stories/inputs/interface_schemas/SbxImagingInterface.json +++ b/stories/inputs/interface_schemas/SbxImagingInterface.json @@ -4,15 +4,22 @@ "SbxImagingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string" }, "sampling_frequency": { - "default": null, - "type": "number" + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "photon_series_type": { diff --git a/stories/inputs/interface_schemas/ScanImageImagingInterface.json b/stories/inputs/interface_schemas/ScanImageImagingInterface.json index e1f0560bc..9a03572e7 100644 --- a/stories/inputs/interface_schemas/ScanImageImagingInterface.json +++ b/stories/inputs/interface_schemas/ScanImageImagingInterface.json @@ -4,9 +4,16 @@ "ScanImageImagingInterface": { "properties": { "file_path": { - "format": "file-path", - "type": "string", - "description": "Path to Tiff file." + "anyOf": [ + { + "format": "path", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null }, "channel_name": { "anyOf": [ @@ -19,6 +26,54 @@ ], "default": null }, + "slice_sample": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "plane_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + }, + "file_paths": { + "anyOf": [ + { + "items": { + "format": "path", + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "interleave_slice_samples": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, "plane_name": { "anyOf": [ { @@ -42,13 +97,10 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, - "required": [ - "file_path" - ], "type": "object", "additionalProperties": false } diff --git a/stories/inputs/interface_schemas/Spike2RecordingInterface.json b/stories/inputs/interface_schemas/Spike2RecordingInterface.json index bcc8fcc85..7196c8fdd 100644 --- a/stories/inputs/interface_schemas/Spike2RecordingInterface.json +++ b/stories/inputs/interface_schemas/Spike2RecordingInterface.json @@ -4,12 +4,12 @@ "Spike2RecordingInterface": { "properties": { "file_path": { - "format": "file-path", + "format": "path", "type": "string", "description": "Path to .smrx file." }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { diff --git a/stories/inputs/interface_schemas/SpikeGLXConverterPipe.json b/stories/inputs/interface_schemas/SpikeGLXConverterPipe.json index 22ffe99d4..07da09650 100644 --- a/stories/inputs/interface_schemas/SpikeGLXConverterPipe.json +++ b/stories/inputs/interface_schemas/SpikeGLXConverterPipe.json @@ -4,7 +4,7 @@ "SpikeGLXConverterPipe": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to the folder containing SpikeGLX streams." }, diff --git a/stories/inputs/interface_schemas/SpikeGLXNIDQInterface.json b/stories/inputs/interface_schemas/SpikeGLXNIDQInterface.json index 1f9991784..91ddf7393 100644 --- a/stories/inputs/interface_schemas/SpikeGLXNIDQInterface.json +++ b/stories/inputs/interface_schemas/SpikeGLXNIDQInterface.json @@ -3,28 +3,68 @@ "properties": { "SpikeGLXNIDQInterface": { "properties": { - "file_path": { - "format": "file-path", + "folder_path": { + "format": "path", "type": "string", - "description": "Path to SpikeGLX .nidq file." + "description": "Path to the folder containing the .nidq.bin file." }, "verbose": { - "default": true, - "type": "boolean", - "description": "Whether to output verbose text." - }, - "load_sync_channel": { "default": false, "type": "boolean", - "description": "Whether to load the last channel in the stream, which is typically used for synchronization.\nIf True, then the probe is not loaded." + "description": "Whether to output verbose text." }, "es_key": { - "default": "ElectricalSeriesNIDQ", - "type": "string" + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Deprecated. This parameter has no effect and will be removed on or after May 2026." + }, + "metadata_key": { + "default": "SpikeGLXNIDQ", + "type": "string", + "description": "Key used to organize metadata in the metadata dictionary. This is especially useful when multiple NIDQ interfaces are used in the same conversion. The metadata_key is used to organize TimeSeries and Events metadata." + }, + "analog_channel_groups": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": true, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Dictionary mapping group names to analog channel configurations.\nEach group specifies which channels to include and will be written as a separate\nTimeSeries in the NWB file.\nIf None (default), all analog channels are written as a single TimeSeries.\nIf empty dict {}, no analog channels are written.\n\nStructure:\n {\n \"group_key\": {\n \"channels\": [\"channel_id_1\", \"channel_id_2\", ...],\n },\n }\n\nExample:\n {\n \"audio\": {\n \"channels\": [\"nidq#XA0\"],\n },\n \"accel\": {\n \"channels\": [\"nidq#XA3\", \"nidq#XA4\", \"nidq#XA5\"],\n },\n }" + }, + "digital_channel_groups": { + "anyOf": [ + { + "additionalProperties": { + "additionalProperties": true, + "type": "object" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Dictionary mapping group names to digital channel configurations.\nEach group specifies which channels to include and their label mappings.\nIf None (default), all digital channels are written with auto-generated defaults.\nIf empty dict {}, no digital channels are written.\n\nCurrently, only single-channel groups are supported (each group maps to one\nLabeledEvents object). Multi-channel groups will be supported in future versions\nwhen ndx-events EventsTable is integrated into NWB core.\n\n\nStructure:\n {\n \"group_key\": {\n \"channels\": {\n \"channel_id\": {\"labels_map\": {0: \"label_a\", 1: \"label_b\"}},\n },\n },\n }\n\nExample:\n {\n \"camera\": {\n \"channels\": {\n \"nidq#XD0\": {\"labels_map\": {0: \"exposure_end\", 1: \"frame_start\"}},\n },\n },\n \"lick\": {\n \"channels\": {\n \"nidq#XD1\": {\"labels_map\": {0: \"no_lick\", 1: \"lick_detected\"}},\n },\n },\n }" } }, "required": [ - "file_path" + "folder_path" ], "type": "object", "additionalProperties": false diff --git a/stories/inputs/interface_schemas/SpikeGLXRecordingInterface.json b/stories/inputs/interface_schemas/SpikeGLXRecordingInterface.json index 7da25e95a..3caa7456f 100644 --- a/stories/inputs/interface_schemas/SpikeGLXRecordingInterface.json +++ b/stories/inputs/interface_schemas/SpikeGLXRecordingInterface.json @@ -3,13 +3,17 @@ "properties": { "SpikeGLXRecordingInterface": { "properties": { - "file_path": { - "format": "file-path", + "folder_path": { + "format": "path", "type": "string", - "description": "Path to SpikeGLX ap.bin or lf.bin file." + "description": "Path to the folder containing the .ap.bin or .lf.bin SpikeGLX file." + }, + "stream_id": { + "type": "string", + "description": "Stream ID of the SpikeGLX recording.\nExamples are 'imec0.ap', 'imec0.lf', 'imec1.ap', 'imec1.lf', etc." }, "verbose": { - "default": true, + "default": false, "type": "boolean", "description": "Whether to output verbose text." }, @@ -22,11 +26,13 @@ "type": "null" } ], - "default": null + "default": null, + "description": "The key to access the metadata of the ElectricalSeries." } }, "required": [ - "file_path" + "folder_path", + "stream_id" ], "type": "object", "additionalProperties": false diff --git a/stories/inputs/interface_schemas/Suite2pSegmentationInterface.json b/stories/inputs/interface_schemas/Suite2pSegmentationInterface.json index cdd900831..80b639d24 100644 --- a/stories/inputs/interface_schemas/Suite2pSegmentationInterface.json +++ b/stories/inputs/interface_schemas/Suite2pSegmentationInterface.json @@ -4,7 +4,7 @@ "Suite2pSegmentationInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string", "description": "Path to the folder containing Suite2p segmentation data. Should contain 'plane#' subfolder(s)." }, @@ -43,7 +43,7 @@ "default": null }, "verbose": { - "default": true, + "default": false, "type": "boolean" } }, diff --git a/stories/inputs/interface_schemas/TdtRecordingInterface.json b/stories/inputs/interface_schemas/TdtRecordingInterface.json index 66e1a8a17..e10f4a8e6 100644 --- a/stories/inputs/interface_schemas/TdtRecordingInterface.json +++ b/stories/inputs/interface_schemas/TdtRecordingInterface.json @@ -4,7 +4,7 @@ "TdtRecordingInterface": { "properties": { "folder_path": { - "format": "directory-path", + "format": "path", "type": "string" }, "gain": { @@ -15,12 +15,23 @@ "type": "string" }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "es_key": { "default": "ElectricalSeries", "type": "string" + }, + "stream_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null } }, "required": [ diff --git a/stories/inputs/interface_schemas/TiffImagingInterface.json b/stories/inputs/interface_schemas/TiffImagingInterface.json index 2650f41c6..a83462161 100644 --- a/stories/inputs/interface_schemas/TiffImagingInterface.json +++ b/stories/inputs/interface_schemas/TiffImagingInterface.json @@ -4,15 +4,62 @@ "TiffImagingInterface": { "properties": { "file_path": { - "format": "file-path", - "type": "string", + "anyOf": [ + { + "format": "path", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, "description": "Path to Tiff file." }, + "file_paths": { + "anyOf": [ + { + "items": { + "format": "path", + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, "sampling_frequency": { + "default": null, "type": "number" }, + "dimension_order": { + "default": "ZCT", + "type": "string" + }, + "num_channels": { + "default": 1, + "type": "integer" + }, + "channel_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "num_planes": { + "default": 1, + "type": "integer" + }, "verbose": { - "default": true, + "default": false, "type": "boolean" }, "photon_series_type": { @@ -24,10 +71,6 @@ "type": "string" } }, - "required": [ - "file_path", - "sampling_frequency" - ], "type": "object", "additionalProperties": false } diff --git a/stories/inputs/interface_schemas/WhiteMatterRecordingInterface.json b/stories/inputs/interface_schemas/WhiteMatterRecordingInterface.json new file mode 100644 index 000000000..8992f50d2 --- /dev/null +++ b/stories/inputs/interface_schemas/WhiteMatterRecordingInterface.json @@ -0,0 +1,64 @@ +{ + "required": [], + "properties": { + "WhiteMatterRecordingInterface": { + "properties": { + "file_path": { + "format": "path", + "type": "string" + }, + "sampling_frequency": { + "type": "number" + }, + "num_channels": { + "type": "integer" + }, + "channel_ids": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "is_filtered": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + }, + "verbose": { + "default": false, + "type": "boolean" + }, + "es_key": { + "default": "ElectricalSeries", + "type": "string" + } + }, + "required": [ + "file_path", + "sampling_frequency", + "num_channels" + ], + "type": "object", + "additionalProperties": false + } + }, + "type": "object", + "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "source.schema.json", + "title": "Source data schema", + "description": "Schema for the source data, files and directories", + "version": "0.1.0" +} diff --git a/stories/pages/SourceData.stories.js b/stories/pages/SourceData.stories.js index 841007cf2..aca83e74b 100644 --- a/stories/pages/SourceData.stories.js +++ b/stories/pages/SourceData.stories.js @@ -29,7 +29,7 @@ import MEArecRecordingInterfaceSchema from "../inputs/interface_schemas/MEArecRe import PlexonRecordingInterfaceSchema from "../inputs/interface_schemas/PlexonRecordingInterface.json"; import PlexonSortingInterfaceSchema from "../inputs/interface_schemas/PlexonSortingInterface.json"; import AxonaRecordingInterfaceSchema from "../inputs/interface_schemas/AxonaRecordingInterface.json"; -import VideoInterfaceSchema from "../inputs/interface_schemas/VideoInterface.json"; +import ExternalVideoInterfaceSchema from "../inputs/interface_schemas/ExternalVideoInterface.json"; import NeuralynxRecordingInterfaceSchema from "../inputs/interface_schemas/NeuralynxRecordingInterface.json"; import Suite2pSegmentationInterfaceSchema from "../inputs/interface_schemas/Suite2pSegmentationInterface.json"; import AlphaOmegaRecordingInterfaceSchema from "../inputs/interface_schemas/AlphaOmegaRecordingInterface.json"; @@ -44,6 +44,7 @@ import BrukerTiffSinglePlaneConverterSchema from "../inputs/interface_schemas/Br import BrukerTiffMultiPlaneConverterSchema from "../inputs/interface_schemas/BrukerTiffMultiPlaneConverter.json"; import MiniscopeConverterSchema from "../inputs/interface_schemas/MiniscopeConverter.json"; import CellExplorerRecordingInterfaceSchema from "../inputs/interface_schemas/CellExplorerRecordingInterface.json"; +import WhiteMatterRecordingInterfaceSchema from "../inputs/interface_schemas/WhiteMatterRecordingInterface.json"; export default { title: "Pages/Guided Mode/Source Data", @@ -115,7 +116,8 @@ globalStateCopy.schema.source_data.properties.PlexonSortingInterface = PlexonSortingInterfaceSchema.properties.PlexonSortingInterface; globalStateCopy.schema.source_data.properties.AxonaRecordingInterface = AxonaRecordingInterfaceSchema.properties.AxonaRecordingInterface; -globalStateCopy.schema.source_data.properties.VideoInterface = VideoInterfaceSchema.properties.VideoInterface; +globalStateCopy.schema.source_data.properties.ExternalVideoInterface = + ExternalVideoInterfaceSchema.properties.ExternalVideoInterface; globalStateCopy.schema.source_data.properties.NeuralynxRecordingInterface = NeuralynxRecordingInterfaceSchema.properties.NeuralynxRecordingInterface; globalStateCopy.schema.source_data.properties.Suite2pSegmentationInterface = @@ -142,6 +144,8 @@ globalStateCopy.schema.source_data.properties.MiniscopeConverter = MiniscopeConverterSchema.properties.MiniscopeConverter; globalStateCopy.schema.source_data.properties.CellExplorerRecordingInterface = CellExplorerRecordingInterfaceSchema.properties.CellExplorerRecordingInterface; +globalStateCopy.schema.source_data.properties.WhiteMatterRecordingInterface = + WhiteMatterRecordingInterfaceSchema.properties.WhiteMatterRecordingInterface; const results = globalStateCopy.results; for (let sub in results) { @@ -335,11 +339,11 @@ AxonaRecordingInterfaceGlobalCopy.interfaces.interface = AxonaRecordingInterface AxonaRecordingInterfaceGlobalCopy.schema.source_data = AxonaRecordingInterfaceSchema; AxonaRecordingInterface.args = { activePage, globalState: AxonaRecordingInterfaceGlobalCopy }; -export const VideoInterface = PageTemplate.bind({}); -const VideoInterfaceGlobalCopy = JSON.parse(JSON.stringify(globalState)); -VideoInterfaceGlobalCopy.interfaces.interface = VideoInterface; -VideoInterfaceGlobalCopy.schema.source_data = VideoInterfaceSchema; -VideoInterface.args = { activePage, globalState: VideoInterfaceGlobalCopy }; +export const ExternalVideoInterface = PageTemplate.bind({}); +const ExternalVideoInterfaceGlobalCopy = JSON.parse(JSON.stringify(globalState)); +ExternalVideoInterfaceGlobalCopy.interfaces.interface = ExternalVideoInterface; +ExternalVideoInterfaceGlobalCopy.schema.source_data = ExternalVideoInterfaceSchema; +ExternalVideoInterface.args = { activePage, globalState: ExternalVideoInterfaceGlobalCopy }; export const NeuralynxRecordingInterface = PageTemplate.bind({}); const NeuralynxRecordingInterfaceGlobalCopy = JSON.parse(JSON.stringify(globalState)); @@ -424,3 +428,9 @@ const CellExplorerRecordingInterfaceGlobalCopy = JSON.parse(JSON.stringify(globa CellExplorerRecordingInterfaceGlobalCopy.interfaces.interface = CellExplorerRecordingInterface; CellExplorerRecordingInterfaceGlobalCopy.schema.source_data = CellExplorerRecordingInterfaceSchema; CellExplorerRecordingInterface.args = { activePage, globalState: CellExplorerRecordingInterfaceGlobalCopy }; + +export const WhiteMatterRecordingInterface = PageTemplate.bind({}); +const WhiteMatterRecordingInterfaceGlobalCopy = JSON.parse(JSON.stringify(globalState)); +WhiteMatterRecordingInterfaceGlobalCopy.interfaces.interface = WhiteMatterRecordingInterface; +WhiteMatterRecordingInterfaceGlobalCopy.schema.source_data = WhiteMatterRecordingInterfaceSchema; +WhiteMatterRecordingInterface.args = { activePage, globalState: WhiteMatterRecordingInterfaceGlobalCopy };