- Added
check_spatial_series_unitto validate that SpatialSeries objects (outside of CompassDirection) have a recognized unit string from a curated allowlist of SI length units, angular units, and pixels. #685 - Added
check_imaging_plane_location_allen_ccf,check_electrodes_location_allen_ccf, andcheck_intracellular_electrode_location_allen_ccfto validate location fields against Allen Mouse Brain CCF ontology terms when subject species is mouse. #671 - Added
check_time_intervals_start_time_not_constantto flag TimeIntervals tables where all start_time values are identical, indicating times were likely not set relative to session start. #677 - Added
check_units_resolution_is_setto flag when the Units table has spike_times but resolution is not set to a meaningful positive float. #686 - Added
check_spike_times_not_in_samplesto flag when spike times appear to be stored as sample indices rather than seconds, detected by all values being integer-valued with implausibly large magnitudes. - Added
check_units_table_has_spikesto flag Units tables that do not contain a spike_times column. #691
- Upgraded
check_ascending_spike_timesfromBEST_PRACTICE_VIOLATIONtoCRITICALand made it flag both descending and equal consecutive spike times. Setting theresolutionfield on the Units table suppresses the equal-timestamps check for recordings with limited temporal precision. #684
- Fixed
RuntimeWarning: All-NaN slice encounteredincheck_time_intervals_durationwhen custom time columns contain all-NaN values. #682
- Added
check_file_extensionfor NWB file extension best practice recommendations (.nwb,.nwb.h5, or.nwb.zarr) #625 - Added
check_time_series_durationto detect unusually long TimeSeries durations (default threshold: 1 year). #627 - Added
check_rate_not_below_thresholdto detect suspiciously low sampling rates that may indicate period was used instead of rate. #627 - Added
check_units_table_durationto detect if the duration of spike times in a Units table exceeds a threshold (default: 1 year), which may indicate spike_times are in the wrong units or there is a data quality issue. #636 - Added
check_time_intervals_duration, which makes sure thatTimeIntervalobjects do not have a duration greater than 1 year. #635 - Added
check_electrical_series_unscaled_datato warn when ElectricalSeries has integer data type with default conversion (1.0) and offset (0.0), which suggests raw acquisition units are not properly scaled to Volts. Also considerschannel_conversionfor per-channel scaling. #408 - Added
check_subject_weightto ensure subject weight follows the form '[numeric] [unit]' (e.g., '2.3 kg' or '10 g'). #647 - Added
check_image_series_starting_frame_without_external_fileto verify thatstarting_frameis not set whenexternal_fileis not used in anImageSeries. #235 - Added
check_sweeptable_deprecatedto detect usage of the deprecatedSweepTablein NWB files with schema version >= 2.4.0, which should useIntracellularRecordingsTableinstead. #657 - Added
check_time_series_data_is_not_emptyto detect empty.datafields inTimeSeriescontainers, which often indicate incomplete data entry or conversion errors. SkipsImageSerieswithexternal_fileset, where empty data is intentional. #668
- Added documentation to API and CLI docs on how to use the dandi config option. #624
- Updated report summary to include number of files detected and indicate when no issues are found. #629
- Made subject information checks (
check_subject_exists,check_subject_id_exists,check_subject_sex,check_subject_age) CRITICAL by default to be consistent with DANDI requirements. #648 - Added
nwb_schema_version_ltandnwb_schema_version_gtparameters toregister_checkto conditionally run checks based on the NWB schema version of the file being inspected. #661
- Fixed
check_subject_ageto allow"/"and"/P3D"style age ranges where the lower bound is unspecified. #673 - Fixed
check_timestamp_of_the_first_sample_is_not_negativeto handle empty timestamps arrays instead of throwing anIndexError. #582 - Fixed file count error when checking for non-unique identifiers in a folder #629
- Improved
check_data_orientationerror message to include the TimeSeries name, current shape, and a suggestion for transposing the data. #1430 - Dropped Python 3.9 and middle Python versions (3.11, 3.12) from CI; now testing only Python 3.10 and 3.13. #632
- Updated macOS CI runner from
macos-13tomacos-latest. #639
- Fixed build configuration error in pyproject.toml #605
- Added checks to make sure subject_id and session_id do not contain slashes #570
- Fixed incorrect data orientation check for SpikeEventSeries #592
- Fixed dimensionality check for SpikeEventSeries validation #581
- Fixed error when checking for negative values in a time column with array data #600
- Fixed issue where the io object remained open after inspection was completed. #601
- Updated InspectorMessage reporting for PyNWB read errors to improve readability #603
- Added support for PyNWB 3.1 and NWB Schema 2.9 #602
- Added check for negative rates in TimeSeries #423
- Added check for ascending spike times in Units table #575
- Added support for PyNWB 3.0 #557
- Added support for Python 3.13 #564
- Remove s3fs dependency, which was causing dependency management issues #549
- Added a section for describing the issues with negative timestamps in
TimeSeries#545 - Use alternate way of generating
TimeSeriesobjects to avoid new pynwb error when the shape of the first dimension of data does not match the length of timestamps #556
- Added support for Numpy 2 and h5py 3.12, and pinned PyNWB to <3.0 temporarily. #536
- Added best practice around not using colons in object names. #532
- Fixed issue where the description check failed if the description was a list. #535
- Support for Python 3.8 has been removed. #508
- The
inspect_nwbmethod has been removed. Please useinspect_nwbfileorinspect_nwbfile_objectinstead. #505
- Added Zarr support. #513
- Removed the
robust_ros3_readutility helper. #506 - Simplified the
nwbinspector.testingconfiguration framework. #509 - Cleaned old references to non-recent PyNWB and HDMF versions. Current policy is that latest NWB Inspector releases should only support compatibility with latest PyNWB and HDMF. #510
- Swapped setup approach to the modern
pyproject.tomlstandard. #507 - Added complete annotation typing and integrated Mypy into pre-commit. #520
- Fixed incorrect error message for OptogeneticStimulusSite. #524
- Fixed detection of Zarr directories for inspection. #531
- The
driverargument has been removed frominspect_nwbfile. Please usenwbinspector.inspect_dandisetornwbinspector.inspect_dandi_file_pathinstead. #490
- The
streamandversion_idarguments have been removed fromnwbinspector.inspect_all. Please usenwbinspector.inspect_dandisetinstead. #490
- Introduced the
inspect_dandisetandinspect_dandi_file_pathAPI functions to replace the functionality innwbinspector --stream. The new feature usesremfileinstead ofros3. #490
- Fixed import error when using the CLI with
--config dandi. #494 - Removed unused imports throughout package. #496
- Certain low-level functions have been marked as private (such as the former
nwbinspector.register_checks.auto_parse) indicating they should not have been imported by downstream users. #485 - Various inappropriate imports from certain submodules have been hard deprecated (e.g.,
from nwbinspector.inspector_tools import natsorted). #485
- The
inspector_tools,register_check, and `` submodules have been soft deprecated and will be removed in the next major release. #485
- Update util function
is_ascending_seriesto discard nan values and addcheck_timestamps_without_nansfun to check if timestamps contain NaN values #476 - Updated the import structure to match modern Python packaging standards. #485
- Equivocated timezone handling to target fields when checking for past and future dates. #471
- Fixed the suggested rate in
check_regular_timestampsto be in Hz. #467 - Added a skip for mac sidecar files (._*). #470
- Extended
check_session_start_time_future_dateandcheck_session_start_time_old_dateto be timezone optional as allowed by PyNWB > 2.6.0 versions. #452
- Exposed progress bar control to
inspect_allandrun_checksto allow compatibility with more generic visualizations of inspection progress related to the NWB GUIDED. #443 - Added Python 3.12 support. #457
- Pinned action runners to MacOS x64 architecture; removed other deprecated steps of setup and continuous integration testing. #450
- Fixed
--modulesflag innwbinspectorcommand line interface to allow for import of additional modules in the command line. This was necessary to be able to register new customized checks to the NWB Inspector. #446
- Add safer retrieval of
subject_idfor in vitro protein filtering. #433
- Use cached extension namespaces when calling pynwb validate instead of just the core namespace. #425
- Added automatic suppression of certain subject related checks when inspecting files using the "dandi" configuration that have a
subject_idthat starts with the keyphrase "protein"; e.g., "proteinCaMPARI3" to indicate the in vitro subject of the experiment is a purified CaMPARI3 protein.
- Added
check_rate_is_not_zerofor ensuring non-zero rate value ofTimeSeriesthat has more than one frame. #389
- Fixed issue in
check_empty_string_for_optional_attributewhere it would not skip optional non-strfields. #400
- Support for Python 3.7 has officially been dropped by the NWB Inspector. Please use Python 3.8 and above. #380
-
check_time_interval_time_columnsnow only checks forstart_timewithis_ascending_series. #382 -
is_acending_seriesno longer asserts series to be strictly monotonic. #374
- To reduce ambiguity of the new intermediate workflow calls in the API,
inspect_nwbwill be deprecated in the next major release. It is replaced by eitherinspect_nwbfile(applied to a written file on disk) orinspect_nwbfile_object(an open object in memory). #364
- Added support for new options to
subject.sex(XXorXO) conditional on thesubject.speciesbeing either "C. elegens" or "Caenorhabditis elegens". #353
- Added an intermediate workflow to the main
nwbinspectorcall pattern, namedinspect_nwbfile_object. #364
- Added a false positive skip condition to
check_binary_columnswhen applied to special tables with pre-defined columns, such as theelectrodesofUnits. #349
-
Added a false positive skip condition to
check_timestamps_match_first_dimensionwhen applied to anImageSeriesthat is using anexternal_fileand therefore has an empty array set todata, but could have non-empty irregulartimestampsfor the video. PR #335 -
Fixed the skip condition for
imageschecks that were incorrectly run when using PyNWB v2.0.0. PR #341
- The version of the NWB Inspector can now be returned directly from the CLI via the
--versionflag. PR # 333
- Loosened upper bound of numpy version. PR # 330
- Added check
check_index_series_points_to_imageto additionally about future deprecation ofindexed_timeserieslinked inIndexSeries. # 322
- Add a special skip condition to
check_timestamps_match_first_dimensionwhen anIndexSeriesuses anImageSeriesas a target. PR #321
- Added check for unique ids for DynamicTables. PR #316
-
Fix
check_subject_proper_age_rangeto parse years. PR #314 -
Write a custom
get_data_shapemethod that does not returnmaxshape, which fixes errors in parsing shape. PR #315
-
Added compression size consideration to
check_image_series_size. PR #311 -
Added false positive skip condition for
check_image_series_sizeforTwoPhotonSeriesneurodata types. PR #301
- Added downstream testing of DANDI to the per-PR suite as a requirement for merging. PR #306
- Fixed issue in
run_checksfollowing PR #303 that prevented iteration over certain check output types. PR #306
- Fixed an issue with table checks that attempted to retrieve data from on-disk NWB files in a non-lazy manner. Also improved
check_timestamps_match_first_dimensionforTimeSeriesobjects, which similarly attempted to load unnecessary data into memory. PR #296 PR #307
- Fix to the assigned
importanceoutput of configured checks, which was reverting to pre-configuration values. PR #303
- Fix to skip certain tests if optional testing config path was not specified (mostly for conda-forge).
- Allow NCBI taxonomy references for Subject.species. PR #290
- Added PyNWB v2.1.0 specific file generation functions to the
testingsubmodule, and altered the tests forImageSeriesto use these pre-existing files when available. Also included automated workflow to push the generated files to a DANDI-staging server for public access. PR #288
- Fixed relative path detection for cross-platform strings in
check_image_series_external_file_relativePR #288
- Fixed an error with attribute retrieval specific to the
cell_idof theIntracellularElectrodeneurodata type that occurred with respect to older versions of PyNWB. PR #264
check_subject_sex,check_subject_species,check_subject_age,check_subject_proper_age_rangeare now elevated toCRITICALimportance when using the "DANDI" configuration. Therefore, these are now required for passingdandi validate.
- Enhanced human-readability of the return message from
check_experimenter_form. PR #254 - Extended check for
Subject.agefield with estimated age range using '/' separator. PR #247 - Allowed network-dependent tests to be skipped by specifying the
NWBI_SKIP_NETWORK_TESTSenvironment variable. PR #261
- Added check for existence of
IntracellularElectrode.cell_idPR #256 - Added check that bounds of age range for
Subject.ageusing the '/' separator are properly increasing. PR #247 - Added check for existence of
IntracellularElectrode.cell_idPR #256 - Added check for shape consistency between
reference_imagesand the x, y, (z) dimensions of theimage_maskofPlaneSegmentationobjects. PR #257
- Fixed the folder-wide
identifierpre-check forinspect_allto read NWB files with extensions. PR #262