15. What’s new

15.1. junifer v0.0.8 (2026-10-19)

No significant changes.

15.2. Junifer 0.0.8 (2026-10-19)

15.2.1. Bugfixes

  • Allow SpaceWarper to convert data from native to template space when using="auto" by Fede Raimondo and Synchon Mandal (#482)

  • Fix pattern indexing logic for PatternDataGrabber.get_elements() by Synchon Mandal (#492)

  • Fix the data collected by HDF5FeatureStorage being stored as float32 when force_float32=False and the h5py deprecation warning when collecting by Fede Raimondo (#504)

  • Fix PatternDataGrabber.get_elements() returning elements that miss some of the data types when several types use all the replacements by Fede Raimondo (#511)

  • Fix ReHo computation with using="junifer" including neighbours outside the mask, checking the wrong centre voxel for nneigh=125, setting voxels outside the mask to 1 instead of 0, skipping voxels at the edges of the volume and setting fully tied neighbourhoods to 1 instead of 0, so that it matches AFNI’s 3dReHo by Fede Raimondo (#514)

  • Use the masks parameter of ReHoMaps, ReHoParcels and ReHoSpheres to restrict the ReHo computation for both using="junifer" and using="afni", instead of an MNI152 brain mask resampled to the input data (wrong for native space) only for using="junifer". Without masks, both use the voxels with non-zero time series, so that both implementations give the same results by Fede Raimondo (#514)

  • Fix JuniferConnectivityMeasure not checking its input as nilearn’s ConnectivityMeasure (e.g. tangent with a single subject) and not listing all the valid kinds in the error message by Fede Raimondo (#516)

  • Fix dtype being ignored in JuniferNiftiSpheresMasker by Fede Raimondo (#516)

  • Fix the labels of the Brainnetome parcellations, which repeated each name for both hemispheres, by reading them from junifer-data (e.g. SFG_L_7_1 and SFG_R_7_1 instead of SFG_L(R)_7_1 twice), which changes their feature names by Fede Raimondo (#520)

  • Fix the labels of the Julich-Brain parcellations, which were the label values instead of the region names, which changes their feature names by Fede Raimondo (#520)

  • Fix the labels of the Yan parcellations, which were NaN or numbers instead of the region names, which changes their feature names by Fede Raimondo (#520)

  • Fix the labels of the Shen_2013 parcellations, which were assigned to the wrong parcels, and add a -{i} suffix to the repeated No_BA_region labels, which changes their feature names by Fede Raimondo (#520)

  • Fix the labels of parcellations with regions lost when resampling or warping to the target image, which shifted the labels of the following regions; the lost regions are kept (without data) and a warning lists them. The parcel markers are computed on the regions with data and give NaN for the lost ones (and RSSETSMarker only uses the edges with data) by Fede Raimondo (#520, #521)

  • Fix TemporalSNRParcels, TemporalSNRSpheres and TemporalSNRMaps replacing the BOLD data with the tSNR map, so the markers computed after them in a pipeline used the tSNR map instead of the BOLD data by Fede Raimondo (#522)

  • Fix a relative datadir of the DataGrabber in the YAML being relative to the current directory (e.g., the job directory when queueing) instead of the YAML file by Fede Raimondo (#524)

  • Fix partial element selectors (e.g., only the subject) always being reported as invalid by run(), after computing their elements by Fede Raimondo (#524)

  • Fix the same features being stored more than once: for each value of the element keys that the data does not depend on (e.g., the VBM features of a subject once per task), when running an element again, and when collecting again (SQLiteFeatureStorage also collected its own output file) by Fede Raimondo (#525)

  • Fix the metadata of the preprocessors being replaced by the one of the last preprocessor by Fede Raimondo (#525)

  • Fix the complexity markers (e.g., HurstExponent) not being available in the YAML file with with: junifer.markers.complexity by Fede Raimondo (#529)

  • Fix the Maps markers (e.g., MapsAggregation) not being available in the YAML file without importing their modules by Fede Raimondo (#529)

  • Fix junifer run and junifer list-elements ignoring the elements of the YAML file when --element is not given by Fede Raimondo (#529)

  • Fix the AFNI smoothing of Smoothing leaving 3dFWHMx.1D and 3dFWHMx.1D.png in the current directory by Fede Raimondo (#529)

15.2.2. API Changes

  • Rename the methods of QueueContextAdapter to pre_run_cmds, run_cmds, pre_collect_cmds and collect_cmds; custom queue context adapters must rename theirs by Synchon Mandal (#503)

  • Sanitise the VOI names of built-in coordinates by replacing spaces with _ and adding a -{i} suffix to duplicated names, which changes the feature names of e.g. Dosenbach and Seitzman2018 by Fede Raimondo (#511)

  • Replace boolean values of standardize in TemporalFilter, fMRIPrepConfoundRemover and JuniferConnectivityMeasure with "zscore_sample" (default), "psc" or None, following nilearn; booleans raise an error. "zscore_sample" uses the sample standard deviation, while True used the population one, so standardized values change slightly by Fede Raimondo (#516)

  • Use the BIDS version of the SPM auditory dataset in SPMAuditoryTestingDataGrabber, which has 84 timepoints instead of 96 by Fede Raimondo (#516)

  • Use enum.StrEnum for the enumerations, so str() and formatting of their members give their value (e.g. "mean") instead of "AggFunc.Mean" by Fede Raimondo (#520)

  • Use only the replacements of the data types to grab as element keys in PatternDataGrabber (e.g., only subject with VBM data), so the data that does not depend on, e.g., the task is not processed once for each task by Fede Raimondo (#524)

  • Require the element selectors to have the same number of values, and each data type to be grabbed by only one of the DataGrabbers of MultipleDataGrabber by Fede Raimondo (#524)

  • Find the elements of DataladAOMICPIOP1, DataladAOMICPIOP2, HCP1200 and DMCC13Benchmark in the dataset, so only the elements with data are listed (DataladHCP1200 lists all the subjects, as they are datalad sub-datasets), and return absolute paths in PatternDataGrabber by Fede Raimondo (#524, #528)

  • Add the version of junifer to the MD5 of the features, as for the dependencies of the markers and steps, for reproducibility: features computed with different versions of junifer are different features, so the differences between features (e.g., between datasets) can only come from the data. Running again with a new version stores the features again, with the same name, next to the ones computed with the previous version by Fede Raimondo (#525)

  • Raise an error in the collect method of HDF5FeatureStorage and SQLiteFeatureStorage if a file to collect has more than one element, as collect only compacts the files of single elements by Fede Raimondo (#525)

  • Use upsert="ignore" by default in SQLiteFeatureStorage, so the elements already stored are not stored again by Fede Raimondo (#525)

  • Add the processed_element argument to the store_* methods of BaseFeatureStorage, the element being processed, so the concrete storages can name the file of each element; custom storages must accept it by Fede Raimondo (#525)

  • Store the metadata of the preprocessors as a list, in order, in meta["preprocess"] by Fede Raimondo (#525)

  • Raise an error when installing the dataset of a PatternDataladDataGrabber if a pattern searches the files of a sub-dataset, which are only there once the sub-dataset is installed, instead of not finding the elements by Fede Raimondo (#528)

  • Use single precision in antsApplyTransforms (--float 1), halving its memory and giving float32 instead of float64 data, with differences below 0.002% of the data range by Fede Raimondo (#530)

15.2.3. Improved Documentation

  • Add documentation on adding confounds format by Synchon Mandal (#364)

  • Build the documentation of all the released versions with sphinx-polyversion instead of sphinx-multiversion, using a uv environment per version, and add a version selector and a banner showing whether the latest, an old or the development version is being viewed by Fede Raimondo (#513)

  • Use the UCLA CNP VBM testing data and the Tian parcellations in the examples and the codeless documentation, so no example needs warping by Fede Raimondo (#515)

  • Fix the docs build and the julearn example, whose scores were NaN with scikit-learn 1.8 by Fede Raimondo (#520)

  • Document the elements of the DataGrabbers, combining datasets with MultipleDataGrabber, complete and partial elements, and restricting the values of the replacements by Fede Raimondo (#524)

  • Add the “Implementation details” page with the elements, the fields of the metadata and the storage, and document the data types with different element keys when extending DataGrabbers by Fede Raimondo (#525)

  • Document that the DataGrabbers with files in datalad sub-datasets must list their elements and build the paths without searching the files by Fede Raimondo (#528)

  • Fix the collect_task option of the HTCondor queue being documented as collect, document the elements key of the YAML file and the with needed by the markers, and use the full width of the page for the content by Fede Raimondo (#529)

15.2.4. Enhancements

  • Improve logging consistency of components by Synchon Mandal (#239)

  • Adopt Pydantic for user-facing core objects to perform automatic validation using typing annotations by Synchon Mandal (#364, #502, #510)

  • Move parse_yaml from junifer.cli to junifer.api by Synchon Mandal (#499)

  • Set up the working directory first in all the commands of the CLI (from workdir in the YAML) and in run(), collect(), queue(), reset() and list_elements(), adding the workdir parameter to collect() and list_elements(), and create the working directory if it does not exist by Synchon Mandal and Fede Raimondo (#509)

  • Drop the files fetched by DataladDataGrabber in a single call and without checking their availability on the remote, making cleanup much faster by Fede Raimondo (#511)

  • Cache the available templateflow templates to speed up get_template() by Fede Raimondo (#511)

  • Vectorize ReHo computation with using="junifer", making it about 5 times faster by Fede Raimondo (#514)

  • Add UCLACNPVBMTestingDataGrabber with grey matter probability maps from OpenNeuro ds000030 in MNI152NLin2009cAsym, add n_subjects to PartlyCloudyTestingDataGrabber and use the native 3mm resolution by default in ADHDTestingDataGrabber by Fede Raimondo (#515)

  • Speed up ParcelAggregation by not passing a target affine to the masker, which made nilearn crop and copy the input image even when the parcellation was already on its grid by Fede Raimondo (#515)

  • Raise an error if a marker changes its input data (which is shared with the other markers of a pipeline), checking the values and their contents (arrays, data frames and images) by Fede Raimondo (#522, #531)

  • Run complete elements (with a value for each element key, e.g., in each queued job) without searching the dataset for its elements by Fede Raimondo (#524)

  • Store the features for the element with only the keys that the data type depends on (e.g., only subject for VBM data, when the elements also have task), and skip the elements already stored by Fede Raimondo (#525)

  • Write the intermediate images (e.g., the warped, smoothed or filtered data) uncompressed in the temporary directory of the element, as they are read right away and deleted after the element is processed, so there is no need to spend time compressing and decompressing them, and run the FSL commands with FSLOUTPUTTYPE=NIFTI to write them uncompressed by Fede Raimondo (#530)

  • Warp the volumes of 4D data in chunks of preprocessing.warping.chunksize volumes (default 100) in SpaceWarper, as the memory used by ANTs and FSL grows with the number of volumes (e.g., about 53 GB to warp 1200 volumes to native space with ANTs) by Fede Raimondo (#530)

  • Keep the data of fMRIPrepConfoundRemover, TemporalFilter, TemporalSlicer and Smoothing (with nilearn) in the saved file (memory-mapped) instead of in memory, as for the other preprocessors, releasing its memory during the next steps of the pipeline (e.g., 5 GB for 1200 volumes while running AFNI) by Fede Raimondo (#533)

  • Restrict the ALFF and fALFF computation of ALFFParcels, ALFFSpheres and ALFFMaps to the voxels in their masks (with -mask for AFNI’s 3dRSFC), as for ReHo, reducing the memory and time (e.g., from 14.5 GB to 9.4 GB and from 7 to 1 minutes for 1200 volumes with AFNI), and do not write the bandpassed time series with 3dRSFC (-no_rs_out), as only the parameters are used by Fede Raimondo (#533)

  • Read only the signals of the voxels of the spheres, in chunks of markers.spheres.chunksize volumes (default 100), in JuniferNiftiSpheresMasker, instead of loading the whole 4D data, reducing the memory used by the sphere-based markers (e.g., SphereAggregation and FunctionalConnectivitySpheres) on BOLD data, with the same results, and do not change the input data when it has NaN values by Fede Raimondo (#534)

15.2.5. Features

15.2.6. Miscellaneous

  • Drop Python 3.9 and add Python 3.14 support, upgrade codebase to follow modern syntax, bump dependencies and add uv support by Synchon Mandal (#474)

  • Use original h5io instead of junifer’s fork, keeping support for reading the features collected with the fork by Fede Raimondo (#504)

  • Speed up the test suite, split CI into tests requiring external resources (self-hosted) and the rest (GitHub-hosted), build the docs on the self-hosted runner, make the examples faster and use HDF5FeatureStorage, and bump julearn to 0.3.5 by Fede Raimondo (#511)

  • Publish the junifer Docker image (ghcr.io/juaml/junifer) on every release with the matching junifer version, base it on Ubuntu 24.04 with native ANTs, AFNI and FSL installations and the junifer-data version used by junifer, and stop building the docs and CI images on GitHub Actions by Fede Raimondo (#511)

  • Add the sphinx optional dependencies with the tools to build the documentation, make docs include everything needed to build it, and skip building the PR preview of the documentation when the PR is closed by Fede Raimondo (#513)

  • Speed up the test suite by freezing the objects alive after collection, so the full garbage collections forced by nilearn are much faster by Fede Raimondo (#515)

  • Speed up the external tests by using fewer subjects, the UCLA CNP VBM testing data and junifer-data 1.5.0, and bake the derived testing data and templateflow templates into the CI image by Fede Raimondo (#515)

  • Support nilearn 0.14 (required) by Fede Raimondo (#516)

  • Update the dependencies to their latest versions supporting Python 3.11 (e.g. numpy 2.4, pandas 3.0, scipy 1.17, click 8.5, datalad 1.7, templateflow 25), fixing the open security alerts, require junifer-data >= 1.6.1 and use junifer-data v8 by Fede Raimondo (#520)

  • Pin neurokit2 to 0.2.12, as 0.2.13 requires pandas < 3, and provide np.trapz (removed in numpy 2.4) while MultiscaleEntropyAUC calls neurokit2 by Fede Raimondo (#520)

  • Read dependency versions from the distribution metadata instead of the deprecated __version__ attributes, pass standardize=None to nilearn maskers to avoid deprecation warnings and skip the tests of vendored packages with a pytest_ignore_collect hook, as datalad’s pytest plugin prevents collect_ignore from being applied by Fede Raimondo (#520)

  • Cap sphinx below 9, as enum-tools does not support it yet by Fede Raimondo (#520)

  • Use HDF5FeatureStorage instead of SQLiteFeatureStorage in the tests and documentation, as the latter is only kept for compatibility, and fix the component registry test leaving components de-registered by Fede Raimondo (#523)

15.2.7. Deprecations and Removals

15.3. Junifer 0.0.7 (2026-03-04)

15.3.1. Bugfixes

15.3.2. API Changes

15.3.3. Improved Documentation

15.3.4. Enhancements

15.3.5. Features

15.3.6. Miscellaneous

15.4. Junifer 0.0.6 (2025-03-24)

15.4.1. Bugfixes

15.4.2. API Changes

15.4.3. Improved Documentation

15.4.4. Enhancements

15.4.5. Features

15.4.6. Miscellaneous

15.5. Junifer 0.0.5 (2024-07-22)

15.5.1. Bugfixes

  • Remove extra dimension from parcellations warped via ANTs to other template spaces by Synchon Mandal (#324)

  • Remove extra dimension from parcellations warped via ANTs when merging parcellations by Synchon Mandal (#331)

  • Fix junifer reset to properly delete storage directory and handle junifer_jobs deletion if not empty by Synchon Mandal (#332)

  • Fix validation failure of multiple Preprocessors with different input data types requirement by Synchon Mandal (#339)

  • Remove extra dimension from masks warped via ANTs by Synchon Mandal (#340)

15.5.2. API Changes

15.5.3. Improved Documentation

15.5.4. Enhancements

15.5.5. Features

15.5.6. Miscellaneous

  • Improve CI to allow external tool installation to fail gracefully and update necessary dependency version and conditional checks by Synchon Mandal (#318)

  • Update pre-commit dependency versions, add blacken-docs to pre-commit, add __all__ for modules, sub-packages and package, update ruff and pytest configs in pyproject.toml by Synchon Mandal (#337)

  • Add support for accessing FreeSurfer via Docker wrapper along with mri_binarize, mri_pretess, mri_mc and mris_convert by Synchon Mandal (#342)

  • Update core and docs dependencies by Synchon Mandal (#347)

  • Integrate warnings with logging respecting filters by Fede Raimondo (#351)

15.5.7. Deprecations and Removals

  • Remove Power coordinates, fetch_icbm152_brain_gm_mask mask, BOLDWarper Preprocessor by Synchon Mandal (#336)

15.6. Junifer 0.0.4 (2024-04-05)

15.6.1. Bugfixes

15.6.2. API Changes

15.6.3. Improved Documentation

  • Add Zenodo badge in README and improve general documentation by Synchon Mandal (#247)

  • Rename extMDN to extDMN (extended default mode network) and fix listing for eMDN (extended multiple-demand network) by Synchon Mandal (#251)

  • Fixed typo in code example for adding masks from “register_custom_mask” to “register_mask” by Tobias Muganga (#291)

  • Rename Misc section to Miscellaneous in docs/whats_new.rst by Synchon Mandal (#300)

  • Improve documentation by adding information about space transformation and writing custom Preprocessors by Synchon Mandal (#317)

15.6.4. Enhancements

15.6.5. Features

15.6.6. Miscellaneous

  • Update dependencies requirements by Fede Raimondo (#253)

  • Pin ruff to 0.1.0 as the lowest version and update pre-commit config by Synchon Mandal (#261)

  • Add support for accessing FSL via Docker wrapper along with flirt, applywarp and std2imgcoord commands by Synchon Mandal (#262)

  • Improve documentation, packaging and code style by Synchon Mandal (#269)

  • Add support for Python 3.12 and make Python 3.11 the base for code coverage and CI checks by Synchon Mandal (#270)

  • Add support for accessing ANTs via Docker wrapper along with antsApplyTransforms and antsApplyTransformsToPoints by Synchon Mandal (#277)

  • Make the external tool wrappers output to stderr instead of stdout by Synchon Mandal (#279)

  • Add support for accessing FSL img2imgcoord via Docker wrapper command by Synchon Mandal (#281)

  • Make BOLDWarper tool-agnostic by moving it from junifer.preprocess.fsl to junifer.preprocess by Synchon Mandal (#288)

  • Add support for accessing ANTs’ ResampleImage via Docker wrapper by Synchon Mandal (#293)

  • Update pyproject.toml and add FAIR shield in README.md by Synchon Mandal (#294)

  • Update dependency listing in pyproject.toml, add .github/dependabot.yml to auto-update GitHub Actions, add ANTs and FSL installation in CI and improve general code style by Synchon Mandal (#300)

15.6.7. Deprecations and Removals

15.7. Junifer 0.0.3 (2023-07-21)

15.7.1. Bugfixes

15.7.2. API Changes

15.7.3. Improved Documentation

  • Improve general prose, formatting and code blocks in docs and set line length for .rst files to 80 by Synchon Mandal (#220)

  • Update julearn example under examples by Synchon Mandal (#242)

15.7.4. Enhancements

15.7.5. Features

15.7.6. Miscellaneous

15.8. Junifer 0.0.2 (2023-03-31)

15.8.1. Bugfixes

  • Fix a bug in which relative storage URIs will be computed relative to the CWD and not to the location of the YAML file by Fede Raimondo. (#127)

  • Fix junifer run to respect preprocess step specified in the pipeline by Synchon Mandal (#159)

  • Fix a bug in which only REST1 and REST2 tasks could be accessed in DataladHCP1200 and HCP1200 datagrabbers by Fede Raimondo (#183)

  • Fix a bug in which fitting a marker (e.g. SphereAggregation) on a specific type (e.g.: BOLD) will fail if another non-supported type (e.g.: BOLD_confounds) is present in the data object by Fede Raimondo (#185)

  • Fix ALFFParcels, ALFFSpheres, ReHoSpheres and ReHoParcels pass the extra_input parameter by Fede Raimondo (#187)

  • Fix several markers that did not properly handle the extra_input parameter by Fede Raimondo (#189)

  • Fix a bug in which relative paths in the YAML with directive would be computed relative to the current working directory of the process instead of the location of the YAML file by Fede Raimondo. (#191)

  • Fix an issue with datalad cache and locks in which the user-specific configuration might create a conflict in high throughput systems by Fede Raimondo (#192)

  • Fix a bug in which ParcelAggregation could yield duplicated column names if two or more parcels were used and label names were not unique by Fede Raimondo (#194)

  • Fix a bug in which count() will not be correctly applied across an axis by Fede Raimondo (#195)

  • Fix an issue with datalad cache and locks in which the overridden settings in Junifer were not propagated to subprocesses, resulting in using the default settings by Fede Raimondo (#199)

  • Fix a bug in which get_mask fails for FunctionalConnectivityBase class, because of missing extra_input parameter by Leonard Sasse (#200)

  • Fix the output of RSSETSMarker to be 2D by Synchon Mandal (#215)

15.8.2. API Changes

15.8.3. Improved Documentation

  • Add more documentation on registering parcellations, coordinates, and masks by Leonard Sasse (#166)

  • Migrate and document changelog creation and maintenance via towncrier by Synchon Mandal (#203)

  • Add copy button to documentation code blocks by Synchon Mandal (#205)

  • Add sections starting and help in the documentation by Fede Raimondo (#210)

  • Shorten Sphinx references across code and docs, and add black shield in README by Synchon Mandal (#218)

15.8.4. Enhancements

15.8.5. Features

15.9. Junifer 0.0.1 (2022-12-20)

15.9.1. Bugfixes

15.9.2. API Changes

  • Change the single_output default parameter in storage classes from False to True by Fede Raimondo (#134)

15.9.3. Improved Documentation

15.9.4. Enhancements

15.9.5. Features

15.9.6. Miscellaneous