FSL 6.0.7.20, 4th March 2026
- New fsl-fastconfounds, used to generate confounds for large-scale GLM analyses on UK Biobank brain imaging data. For more details, see the preprint at https://www.medrxiv.org/content/10.1101/2025.11.21.25340740v1
- file-tree 1.6.0 -> 1.6.1
- fsleyes 1.16.2 -> 1.17.0
- fsleyes-plugin-mrs 0.1.4 -> 0.1.6
- fslpy 3.24.0 -> 3.27.0
- fsl-avwutils 2209.3 -> 2209.6
- fsl-base 2508.1 -> 2602.1
- fsl-bianca 2209.3 -> 2602.0
- fsl-eddy 2401.2 -> 2602.0
- fsl-eddy_qc v1.4.1 -> v1.4.2
- fsl-fdt 2202.11 -> 2602.1
- fsl-flameo 2111.2 -> 2111.3
- fsl-melodic 2111.3 -> 2601.1
- fsl-misc_c 2111.0 -> 2111.1
- fsl-mist 2111.6 -> 2512.2
- fsl-mmorf-cpu v1.0.0 -> v1.0.1
- fsl_mrs 2.4.10 -> 2.4.12
- fsl-newimage 2501.4 -> 2601.0
- fsl-newmesh 2111.3 -> 2111.4
- fsl-newnifti 4.1.0 -> 5.0.0
- fsl-ptx2 2111.8 -> 2602.0
- fsl-pyfeeds 1.1.0 -> 1.4.0
- fsl-xtract 2.0.7 -> 2.0.8
- fsl-znzlib 2111.0 -> 2511.2
- spec2nii 0.8.* -> 0.8.7
- fsl-cudabasisfield 1.1.2 -> 2.0.0
- fsl-mmorf v1.0.0 -> v1.0.1
file-tree 1.6.0 -> 1.6.1
- Multi version docs
- Install git in actual pages job
- Label master branch as dev in docs
- Make pages deploy again
- Fix issues with multi-version docs
- Fetch each branch individually
- Multi version docs
- Resolve "Fix use of multi-directory placeholders in FileTree glob" Closes #15
- Resolve "Raise warning if mixture of spaces and tabs is detected in file-tree" Closes #14
- Change build backend from hatchling to UV
- Update app table Closes #13
- Formatting/linting update
- Type cleanup
- release v1.6.1
Detailed history
Publish multiple versions of documentationInstall gitAdd stable branch with latest releasePrint stable versionRun command to create stable branchTest run command to create stable branchInstall git in actual pages jobLabel master branch as devInclude all branches in documentation buildInclude all tags in documentation buildGet all branches before running sphinx-multiversionOnly include released tags in sidepanelRemove typo "and"Add origin to remote whitelistOnly consider v1 as releasedFetch all branches and tagsUse older python version to build older versions of documentationMove fetching to seperate taskDo not try git pullMake pages deploy againInstall git before fetch allDo not include remote as source for docsMove apt-get back to scriptremove cacheFetch each branch individuallyFirst fetch, then branchRemove spurious (and broken) git fetchBF: support globbing in paths with placeholders with nested directoriesAdd single_vars back into matches Ensures compatibility with matches before fill_single_placeholders was added.BF: B is filled in before glob calledSupport multiple possible values of nested directories when globbingBF: update linked variables updatingVery minor change in snapshotsAdd warning if file-tree indendation contains mix of tabs and spacesswitch from hatchling to uv for buildRemove __pycache__ from gitUpdate license format in pyproject.tomlUpdate UV versionUpdate pre-commit toolsExplicitly add UV backendSort keys to make rich_line reproducibleAdd keys/path in app and make table interactiveMake file-tree flake8 compliantAlso ignore trailing whitespaceRerun blackSwitch to ruff for lintingRemove outdated config filesDo not reuse variable nameAdd mypy for optional type checkingFix types to use strings rather than TemplateAdd ty for optional type checkingFix some typingrelease v1.6.1
fsleyes 1.16.2 -> 1.17.0
- BF: Fix type overflow on images with fixed-width integer type
The
fsl.data.image.Image.dataRangeproperty returns image minimum/maximum values in the datatype of the image (e.g.np.int16). This could cause overflow issues when calcaluting the image range. All uses of theImage.dataRangehave been updated so that the values are coerced to floating point before any further processing. - MNT: Compatibility fixes for recent
ipykernel/IPythonversions. - CI: Refresh docker images Add Python 3.14 to testing
- ENH: Allow overlays to be hidden from overlay list This MR adds the ability for overlays to be programmatically hidden from the overlay list, which will be used by some FSLeyes plugins.
- ENH: New "copy coordinates" button on location panel, which copies displayed coordinates to system clipboard
Detailed history
CI: Potentially fix zenodo submissionBF: Avoid potential overflow for images with fixed-width integer typesBF: Need to return rangeMNT: Address API changes in recent versions of IPython/ipykernelMNT: Fix stdout/stderr forwarding - outputs should now be forwarded to client, at least for ipykernel >=6.31CI: Refresh docker imagesCI: Add entrypoint script to set up shell environmentCI: Docker alias for network access; no need to create docker config.json or use dind serviceCI: Shouldn't need to adjust FSL_HOSTCI: Build multi-platform imagesCI: Install dcm2niix from conda-forge; install appropriate micromamba for the platformDOC: Optimistic changelogCI: Remove venv calls; tweak SSH configCI: Make sure mesalib is installedadded hideFilter option in OverlayListPanelRF: Adjust elistbox.ApplyFilter usage - function is passed item label and client data, not just client dataBF: Cleanup function was not being called, leading to already registered error the next time the lightbox canvas settings panel was openedMNT: Bump widgets pinMNT: Remove locale workaround - should no longer be an issue on python >= 3.7ENH: New "copy coordinates" button on location panelDOC: Changelog; fix link in readmeCI: Supposedly I need to PUT, not POSTMNT: Address pyparsing deprecation warningsMNT: Update pyparsing pinCI: Pin mesalib at a version which supports offscreen renderingMNT: Pin pandas at 2.x for this releaseMNT: Work around different missing value representations in different pandas versionsMNT: Lazily import pandas in case it is not installedRF: Adjust filetree work around to work with new "MISSING" sentinel value in upcoming filetree release
fsleyes-plugin-mrs 0.1.4 -> 0.1.6
- Spectra colour improvements & general housekeeping
- Updated spectra colour defaults to seaborn['deep'] and "synced" across projections ('pastel' for imaginary, 'dark' for magnitude, 'bright' for phase).
- Wrote integration test for MRSFitTool DirDialog
- Added upper limits on dependencies
- Minor improvements on comments and documentation
- Dim Control panel improvements
- Improved Dim Control Panel layout and functionality.
- Added ability to link the NIfTI-MRS dimensions across spectra.
- Added ability to coil combine the
DIM_COILdimension (iffsl_mrsis installed). - Improved spectra colour defaults to seaborn['deep'] and "synced" across projections.
- Removed non-mrs overlays from MRSView Overlay list.
- Added Python 3.14 and removed Python 3.9 and 3.10 from supported versions.
Detailed history
Spectra colour improvements & general housekeepingDim Control panel improvementshotfix on build codebug fix on toggling MRSView overlaylistupdated version and changelog for release
fslpy 3.24.0 -> 3.27.0
- ENH: New
constrainoption toresampleToReferencefunction. This option constrains the resampling to regions where the source and reference image fields of view overlap. This can be useful, for example, when resampling a high-resolution 2D slice into a lower resolution 3D space. - ENH: Support
.nii.zstand.nii.bz2formats This MR updates theImageclass so that it can load NIfTI images compressed withzstdandbzip2(with.nii.zstandnii.bz2file suffixes). Additionally, this MR: - Adds a new
fsl.wrappers.mmorffunction for themmorfregistration tool. - Fixes a bug in the
fsl.wrappers.eddyfunction. - CI: Test against Python 3.14
- MNT: Update
im*scripts to support.nii.bz2and.nii.zstfiles Also address a warning concerningfsl.utils.idle.TaskThreadthat has started being emitted under Python 3.14 (#382). - ENH: New option to
fsl.utils.run.holdallowing it to be cancelled - ENH: New wrapper functions for
fsl_mrs - New
fsl.wrappers.fsl_mrsandfsl.wrappres.fsl_mrs_procmodules containing forfsl_mrswrapper functions. These require thefsl_mrspackage to be installed. - New
assertIsNiftiMRSandassertIsMRSBasisassertion functions. - New
ensureIsMRSBasisfunction. - New
fileOrBasisfunction which ensures that input/output values arefsl_mrs.core.basis.Basisobjects.
Incorporates !490
- ENH: Move tmpnam and fslchfiletype scripts to fslpy
This MR migrates two FSL commands to fslpy from other FSL projects:
- The
tmpnamcommand was previously a Python script in the fsl/misc_c> project. It has been moved over tofslpyso that it can be called programmatically via the newfsl.wrappers.tmpnamfunction, as well as being called from a shell. - The
fslchfiletypecommand was abashscript in the fsl/avwutils> project. It has been converted to Python for two reasons:- So it can be called programmatically via the new
fsl.wrappers.fslchfiletypefunction in addition to being called as a shell command. - For improved performance -
fslchfiletypeinvokes several other FSL commands which are implemented in Python and which, when called from thebashversion ended up being quite slow. Now that it is implemented in Python, all of the operations run within a single Python process, so runtime is much faster.
- So it can be called programmatically via the new
Wrapper functions for these commands have been added, along with a new wrapper function for the remove_ext command. Some behavioural changes have also been made to the imcp, imln, immv, imrm commands so that they will raise an exception if an error occurs. Previously they just called the underlying command which would return 0 on success, or non-0 on failure.
- MNT: Allow keyword arguments to be passed through to Image.__init__ when loading a warp field with readFnirt
Detailed history
ENH: New "constrain" option to resampleToReference which constrains the resampling to voxels that overlap with the source image FOV. The overlap is calculated by the new fovdistance functionCI: Hopefully fix zenodo submissionTEST: Basic test for resample constrain optionCI: Change image for test pypi buildBF: eddy_cuda not returningENH: Support .nii.zst and .nii.bz2 formatsDOC: Update FSL doc linksDOC: fsldocs ref typeENH: Add mmorf wrapperDOC: MMORF stubDOC: FixesCI: Maybe fix zenodo scriptBF: Fix to mmorf wrapperTEST: mmorf wrapper testTEST: Basic zstd/bz2 testsMNT: pyzstd is required for zstd supportTEST: update immv/imcp tests to check zst/bz2CI: Drop py310, add py314; update docker image usageCI: Remove venv call; shouldn't need to change FSL_HOST anymoreCI: Fix build_pypi_dist.sh; remove upstream configCI: Deps are already installedCI: Remove more venv callsCI: Dark mode for docsCI: Work around su limitationsMNT: Move stop clause to avoid warning on py314TEST: Refresh dcm2niix testsMNT: Update im* scripts to support .nii.zst and .nii.bz2ENH: New option to hold function, allowing the hold to be cancelled.TEST: Test for new hold(cancel) optionMNT: Loosen tolerance in resample testadded fsl-mrs functions to fslpy wrappersadded single dash arguments in svs_segment and mrsi_segmentadded assertIsNiftiMRS methodadded wrappers for fsl_mrs_proc subcommandsadded simple call unit tests for fsl_mrs_procadded fileOrBasis functionalityadded exception messages when fsl_mrs modules not foundimproved indentation on module import errorsDOC: Add fsl_mrs stubsDOC: Address sphinx warningsTEST: Mark mrs testsCI: Install fsl-mrs into test envMNT: tmpnam script, migrated over from misc_cTEST: Unit tests for tmpnamMNT: fslchfiletype script, migrated from avwutilsRF: Adjust tmpnam script so errors will be raised due to improper usage when called programmaticallyTEST: adjust tmpnam testsRF: Adjust fslio functions so that improper usage will cause an exception to be raised - previously, calling the main() entry points just result in an error message being printed, but no exceptionRF: Update fslio wrappersENH: New tempdir.indir functionMNT: Replace use of tempfile.mkstemp with fsl.utils.tempdir.mkstempTEST: Fix tmpnam tests - they were leaving cwd in a directory that was subsequently deleted, causing next tests to breakTEST: fslchfiletype tests - broken at the momenttRF: Make logic clearerENH: wrapper functions for fslchfiletype, remove_ext, and tmpnamTEST: Check fslchfiletype exit statusMNT: entry pointsDOC: fslchfiletype module stubMNT: Avoid circular importTEST: Basic tests for new fslio wrappersDOC: Stub for tmpnam moduleDOC: Changelog, fix some cross-refsMNT: fslchfiletype entrypointMNT: Allow kwargs to be passed through to Image.__init__ when loading a warp field with readFnirt
fsl-avwutils 2209.3 -> 2209.6
- BF: Allow for arbitrary length --vols
- MNT: Update usage of
NiftiIO::saveImagefunction The NIfTI libraries have been updated to support more compression formats, and there have been some small API changes. - MNT:
fslchfiletypescript has been moved tofslpy
Detailed history
BF: Allow for arbitrary length --volsMNT: Update NewNifti::saveImage usageMNT: Remove unused fslchfiletype_exeMNT: Update fslchfiletype usageTEST: Update fslchfiletype test to cover zstd/bzip2MNT: fslchfiletype script has been moved to fslpy
fsl-base 2508.1 -> 2602.1
- RF: Add
-lbz2 -lzstdto default linked libraries Theznzliblibrary has been updated to supportzstdandbzip2. When compiling on macOS, we must specify all dependencies of an executable. Without moving to a more sophisticated build system, this is the easiest means of ensuring thatzstdandbzip2are linked into all executables without having to modify all of the FSL Makefiles. - RF: Adjust
find_cuda_exe- FSL executables are no longer labelled with the CUDA version they were compiled againstfind_cud_exe <name> [<fallback>]will now return$FSLDIR/bin/<name>if it exists, and CUDA is available, otherwise will return an empty string, or$FSLDIR/bin/<fallback>if provided and it exists. - BF: Fix to
find_cuda_exeAccept the fallback executable if there are multiple matches (e.g. in both$FSLDEVDIRand$FSLDIR).
Detailed history
MNT: Add bzip2/zstd to default linked librariesMNT: Comments in shell init scripts r.e. new compression formatsRF: Adjust find_cuda_exe - FSL executables are no longer labelled with the CUDA version they were compiled against, find_cuda_exe has been updated to search for exact matches, and to accept a fallback executable. Old <prefix>X.Y behaviour still available via --prefix flag.TEST: Update find_cuda_exe testsBF: Fix a range of bugs in find_cuda_exeBF: Accept fallback if there are mutiple matches (e.g. in both $FSLDEVDIR and $FSLDIR)TEST: Test that find_cuda_exe handles duplicate fallbacks
fsl-bianca 2209.3 -> 2602.0
Detailed history
STY: Normalise indentationSTY: Fix basic code smells. No "from X import *". No use of mutable values as default arguments.BF: Use of "sum()" refers to "np.sum()"RF: Replace hand-rolled "imgbasename" with fslpy removeExtRF: Replace some of nibabel with fslpy Image, to make code file-format-agnostic, and honour FSLOUTPUTTYPERF: Fix access to nibabel functions. This code should probably be removed, but I'm too scared to touch itRF: use float32; option to change rng seedMNT,RF: Normalise whitespace; remove hard-coded .nii.gz suffixes; replace mv with immv; replace basename with remove_ext; replace "-f <file>" with "imtest <file>", etc.
fsl-eddy 2401.2 -> 2602.0
- Coordinated check of readout time with topup topup used to accept total readout values which were later rejected by eddy, which could be very annoying. Now the checks are the same for topup and eddy.
- MNT: Adjustments to Makefile for compatibility with changes to FSL build system See fsl/base!112
As a result of these changes, it is no longer possible to build/cache object files for separate versions of CUDA.
- MNT: Remove CUDA label from eddy executable
The eddy CUDA executable is now just called eddy_cuda, rather than eddy_cudaX.Y, where X.Y is the version of CUDA that eddy was compiled against. The eddy Python wrapper script has been updated accordingly.
Detailed history
Coordinated check of readout time with topupMNT: Adjustments to Makefile for compatibility with changes to FSL build system. It is no longer possible to build/cache object files for separate versions of CUDA.MNT: Remove CUDA label from eddy executable. Adjust eddy wrapper script accordingly.
fsl-eddy_qc v1.4.1 -> v1.4.2
- BF: Don't assume volumes with a b-value greater than 100 are diffusion-weighted
In !14,
eddy_quadwas modified to use the--b_rangevalue passed toeddyas its threshold for distinguishing between b0 and diffusion-weighted volumes. However there were still a few instances whereeddy_quadwas using a hard-coded value of 100. This should now be fixed.
This MR also makes some changes so that eddy_[s]quad do not assume that all NIfTI files are stored in .nii.gz format.
Closes #2
Detailed history
BF: Use shell_tol instead of assuming volumes with a b-value > 100 are diffusion-weightedRF: Do not assume that all files are in .nii.gz formatMNT: Dependency on fslpy
fsl-fdt 2202.11 -> 2602.1
- Update Dvec after updating eigenvalues Closes #3
- MNT: Remove CUDA label from exes/libraries. No longer any need for
xfibres_gpuwrapper script - Remove
xfibres_gpuscript from SCRIPTS - BF: Remove
${CUDA_VER}suffix from shared library name
Detailed history
Update Dvec after updating eigenvaluesMNT: Remove CUDA label from exes/libraries. No longer any need for xfibres_gpu wrapper scriptRemove xfibres_gpu script from SCRIPTSBF: Remove ${CUDA_VER} suffix from shared library (should have been in last MR)
fsl-flameo 2111.2 -> 2111.3
- BF: Do not normalise by data variance when it is 0
Older versions of
flameowould always variance-normalise the data, this change skips for constant data ( e.g. as generated by the MRS pipeline ). Resulting inference should now be correct ( as lower-level variance is used to estimate population parameters )
Detailed history
BF: Do not normalise by data variance when it is 0
fsl-melodic 2111.3 -> 2601.1
- PANDORA-capable fsl_glm
- PANDORA for RAP This is the PANDORA release for use on the RAP
- ENH: Use Boost conversions to allow long double precision
- MNT: Re-templated webstats
- MNT: Replace
#definedebug macros with functions isolated to theMelodicnamespace This MR replaces a handful of#definemacros withinmelodic.hwith equivalent functions isolated within theMelodicnamespace. The use of#define message(msg)was colliding with regular code from another library that was being#included aftermelodic.h.
This MR also changes the MELODIC_VESRION from being hard-coded at "3.15" to being set from the current state of the git repository the source is being built from.
- BF: Skip Inference
The new webstats library will throw when numerically invalid inputs are provided, this is a problem as the inference ( e.g t->p ) functions are always called ( even if the outputs aren't required ) and scenarios such as stage 1 dual regression will generate p-values outside of the numeric range ( the inference is uninformative ). This fix only calls the inference functions when needed.
- FDR Threshold reporting
This MR adds Bonferroni/FDR threshold reporting to fsl_glm
Detailed history
Working Version 1.0Working WIP: Refactoringf-stats with pinv(CXXC) and contrast rank; minor clean of usingsENH: Confounds working and testedCandidate for RAP deploymentICA_10K option visiblecheck residu sizemap_stream instead of loading ICA maps, updated option descriptions, silent mode for fileExists, cifti-specific outputs/namings, get_residuals flagmajor: implemented parallel map stream for ICA route; minor: contrasts_rank for stats where still missing, get_residuals flag (still needs work), some cleansminor: clean-up code, comments/namingno voxel-space residuals matrix for now; clean up error messages fsl_glmfixed confounds filepaths, adjusted help section, njobs_h5 default back to single-threadedpandora_ instead of _h5-log10p for PANDORAneg. log10(p)check that subset list exists if providedcleanclean / display correct debug dims for map_streamminimal edits to print statementssetting blas threads for SVD, added ldl to makefile, switch from modality subject IDs to IDXs, read support for new global subject IDs file (UKB standard), some minor edits to print statementsENH: Globals path/checkENH: Use utils threadingMNT: Removed includefix add_confounds() to work with new indexingbase folder fix + cifti_mode flag missing fixMNT: Initialise cifti_moderemove unavailable subjects from subset list when adding confoundschange base directory only for RSNs not tfMRIimprove path issues (temporary fix)error when zeros in subset list;require design for PANDORA, filepath checksavert potential bug with confound adding logic when no subset list providedmake indices private membermove no subset row check to loadIDsmissing bracketdon't infer negative contrasts (this was for testing previously)test somethingtestingreplace bugbetter print statementschrono sleepnamessleep longersleep lessslowwriterchange speedtesttest2backback to newline outputs, changed ICA option namings (ICA1K / ICA10K), minor help text changeuse arma::svd directly, back to newline std outputsback to newline outputsfixed typof_statistics update for rank-deficient contrast matrix (separate f_CXXC using SVD(C))-log10p instead of log10p everywhereimplemented contrast deficiency SVD for voxel routeReplace basic_glm::olsfit f-stats across model with f-stats across contrasts as in glm_chunks, made f2z functions in glm_chunks.h static to be usable, added contrast deficiency SVD functionalityupdated usage to reflect f-stats and -log10p changesconvert from natural to log10 basemoved contrasts if statement; removed fullFit variable (now temporary); cleanupdated error messagearma load design matrix to keep nans (before then removing nan rows later)remove nans from design matrix (at correct time) + safe normalizationuse correct tail (fdtr > fdtrc)move print to debug onlyrun F2z_islargef also for single contrastrestore F2z as beforeremoved constexpr log10, add as private member to ChunkedGLMadd glm_chunks.o dependency to mvlm makeBF: new objects required for all users of melhlprfnsbugfix lost voxelMNT: Compilers should automatically include libdlENH: Switched to using Webstats prototype to P and Z conversionENH: Update other t2z call to WebstatsENH: Use Boost conversions to allow long double precisionMNT: Re-templated webstatsRF: Set melodic version from git repoMNT: Replace #define debug macros with functions within the Melodic namespace, so they don't interfere with code included from other libraries.DOC: Added commentBF: Skip inference if outputs not requiredENH: FDRthreshold function addedENH: FDR calculation and reporting
fsl-misc_c 2111.0 -> 2111.1
Detailed history
MNT: tmpnam script has been moved to fslpy
fsl-mist 2111.6 -> 2512.2
- MNT: Identify VTK version at build time rather than hard-coding it
- RF: Re-organise MIST Python code
This MR re-organises the MIST Python code into a Python package. Previously each MIST python script would hack the
sys.pathupon execution, adding${FSLDIR}/python/mist/. Themist_FA_regscript has been converted from bash to Python, and a few small changes have been made so that the code will work with NIfTI files in different formats (.nii,.nii.zstetc). - BF: Wrong project name in
pyproject.toml
Detailed history
MNT: Identify VTK version rather than hard-coding itMNT: Re-organise python stuff into a python packageRF: Various adjustments - Turn scripts into functions, list as entrpoints in pyproject.toml - Convert mist_FA_reg from bash to python - Fix module imports, don't hack sys.path - Use fsl.data.image imstead of nibabel for file extension auto completion - Use imtest instead of op.exists - Use fslpy removeExt instead of hand-rolled version - Use fsl_sub wrapper function instead of sp.run('$FSLDIR/bin/fsl_sub ...') - Don't hard-code .nii.gz suffixBF: Use FSLDEVDIR instead of PREFIX (which is only defined in conda builds)BF: Fix entrypointsMNT: Call $FSLDIR/bin/mist_script rather than assuming it's on $PATHBF: mist_script entry pointBF: String formatting bugBF: extract job ID from fsl_sub return valBF: Wrong project name
fsl-mmorf-cpu v1.0.0 -> v1.0.1
- MNT: Remove CUDA label from mmorf executable
The MMORF CUDA executable is now simply called
mmorf_cuda, instead ofmmorf_cudaX.Y(whereX.Yis the CUDA version MMORF was compiled against). ThemmorfPython script will callmmorf_cudaormmorf_cpudepending on whether a GPU is available.
Detailed history
MNT: Remove CUDA label from mmorf executable. Adjust mmorf wrapper script accordingly.MNT: Don't print the output of find_cuda_exeMNT: Only install wrapper script with CPU exe
fsl_mrs 2.4.10 -> 2.4.12
- Enh/python versions
- Added Python 3.14 on supported versions
- Extended CI tests to Python 3.10 - 3.14
- Transferred results_to_spectrum into fsl_mrs functionality
- Added seed in syntheticFID as argument to be used on certain tests
- Updates on Windows installation instructions
- Added OS-specific messages for missing FSL packages
- Bf: summarise numpy errors
- Fixed unnecessary warnings in
fsl_mrs_summariseterminal output when viewing MH results. - Added mean baseline and residual traces to average plot in
fsl_mrs_summarise. - BF: fmrs stats inputs
- Fixed bug in
fmrs_statsfor explicit group mean contrast (and other 1x1 matrices). - Fixed bug in
fmrs_statsto allow list of directories to be passed rather than files. - bug fix on fsl_mrs_proc.mrsi-lipid argument type
- updated changelog file [skip-tests]
- ENH: runmode option for flameo wrapper
Detailed history
Bf: summarise numpy errorsBF: fmrs stats inputsEnh/python versionsbug fix on fsl_mrs_proc.mrsi-lipid argument typeupdated changelog file [skip-tests]ENH: runmode option for flameo wrapper
fsl-newimage 2501.4 -> 2601.0
- ENH: Support new compression formats
This MR updates newimage to support reading/writing
.nii.zstand.nii.bz2files, along with a small amount of code clean up. - Nothing in the code base uses the
fileFormatsclass, so it has been removed. - Replace
#define FSL_TYPE_<X>withenum fslType, and similar for the orientation codes. - Add a new
fslZnzFormatfunction which converts between FSL file type codes and the ZNZ file format.
Detailed history
MNT: Normalise indentationRF: Replace #defines with enums. Remove the fileFormats list - it doesnt appear to be used by anythingENH: Update generalio code to support new .nii.zst and .nii.bz2 compression formatsMNT: Expose fslZnzFormat functionMNT: Break on first hitTEST: Add a bunch of fundamental FSLOUTPUTTYPE testsRF: Change SUBSET from a #define to a const int. Move EXTENSIONS list into header, rename to fileExtensions
fsl-newmesh 2111.3 -> 2111.4
Detailed history
MNT: Remove spurious/unnecessary call to srand
fsl-newnifti 4.1.0 -> 5.0.0
- MNT: Remove unnecessary
constqualifier to placate compiler - ENH: Update NewNifti to use new znzlib API
znzlibis being updated to support more compression formats (see fsl/znzlib!3) - as part of this there are some minor API changes. This MR updatesNewNiftiaccordingly.
There are some minor API changes, but there are very few direct users of NewNifti so updating the rest of the code base should be straightforward:
- NiftiIO::fileIO::fileIO() bool use_compression parameter replaced with znz::znzFormat format.
- NiftiIO::saveImage bool useCompression parameter replaced with znz::znzFormat format.
- NiftiIO::fileIO::operator= changed from accepting a fileIO instance by value to accepting a fileIO rvalue
Detailed history
MNT: remove unnecessary const qualifier to placate compilerMNT: Remove pre-C++11 compatibility kludgeMNT: Update NewNifti to use new znzFile interfaceRF: Change assignment operator to accept an rvalue of another instance rather than a copyBF: Change saveImage argument to be of znzFormat typeRF: Default to auto-selecting output format based on filename.MNT: Remove another C++11 compatibility kludgeRF: Move hdr/img replacement to a separate function. Adjust loadHeader/ loadExtensions/loadImage/saveIamge to work regardless of whether .img or .hdr file providedTEST: Basic unit testsTEST: Use a dedicated Makefile for tests (needed for pyfeeds test directory isolation)DOC: Update inline comments
fsl-ptx2 2111.8 -> 2602.0
- BF: Fix
probtrackx2bug which causes it to crash when given an image with unsetsformmatrix Thenewimagevox2mm_matfunction should be used instead of blindly using eitherqform_matorsform_mat, either of which may be unset/invalid. - MNT: Remove CUDA label from exes/libraries. No longer any need for
probtrackx2_gpuwrapper script
Detailed history
BF: Use newimagevox2mm_mat instead of blindly using either qform or sform (either of which may be unset/invalid)MNT: Remove CUDA label from exes/libraries. No longer any need for probtrackx2_gpu wrapper script
fsl-pyfeeds 1.1.0 -> 1.4.0
- RF: Fix logging under Python 3.14
The logging configuration was broken under Python 3.14 -
multiprocessingnow uses the'forkserver'startup method by default, whereas I was relying on the previous default of'fork', which propagated theSocketHandlerobjects to the child processes via memory inheritance.a Handlers are now re-created in child processes both when running tests locally and remotely.
This MR also adds a few new small utility functions:
- indir - a context manager which temporarily changes into a directory
- runcmd - A function which runs a shell command and returns its standard output
- ENH: New --exportEnv option for ensuring that environment variables get passed through to submitted functions.
The --exportEnv option can be used in conjunction with --fslsub to ensure that certain environment variables are passed to submitted jobs.
Pyfeeds has also been updated so that, when run with --fslsub, and the pyfeeds process is killed via CTRL+C, any submitted jobs that are still running are cancelled.
- Print updates to standard output as each test completes
Also don't bother searching for tests in a directory if it matches any of the --excludeTests wildcards.
- BF,RF: Fix bug where pyfeeds would not fail a test if an output file was missing
Also adjust the evaluation logic so that pyfeeds will compare benchmark/output image files which are stored in different formats (e.g. image.nii vs image.nii.gz).
- Fix a small bug preventing use of the pyfeeds compare sub-command
- ENH: New routine for comparing gifti vertex data.
* New evalGiftiVertexData function, which can be used to compare e.g. .func.gii files.
* The pyfeeds.submit module has been reworked to eliminate the possibility of pickling errors.
* The way that evaluation routines are loaded has been changed so that routines for the first matching file pattern are used.
Detailed history
RF: Logging has been broken in Python 3.14 when running locally - multiprocessing now defaults to forkserver startup, whereas I was relying on fork, which propagated the SocketHandler objects to the separate processes. Handlers are now re-created both when running tests locally and remotely.ENH: Some new utility functions for use by testsCI: Drop py310, add py314TEST: Dummy log configENH: New option for ensuring that env vars get passed through to submitted functions. Logic not yet implemented.ENH: --exportEnv option implementedTEST: Add exportEnv to unit testMNT: Cancel submitteb jobs if pyfeeds is killedBF: Missing import, bug in cancelJob funcMNT: Disable nested fsl_subbing.MNT: Move FSLSUB_NESTED defRF: Print table to both stdout and to log fileRF: Rework pending job cancellation - a single atexit function which cancels all jobs are registered. Completed jobs are cleared.BF: Bugs in cluster submissionRF,BF: Make output niceer; submitToCluster returning values in wrong orderBF: submitfunc args/kwargs need to be passed as individual arguments, not expandedBF: Fix cancel job outputBF: Another fix to submit callRF: More tweaks to outputRF: Do not submit more than one job concurrently. Call test_job blocking function to ensure that its job ID is popped from the list of submitted jobs.BF: indentMNT: Save logFile value so test functions know whether a log file is being usedBF: Don't clobber envvars that have been explicitly setRF: Cluster stuff moved into a separate module. When pyfeeds is killed, instruct all test threads to end. Use a newly added fslpy "hold(cancel)" feature to do this.MNT: Minor tweaksBF: TypoRF: Check for cancellation just before submission, as the thread may block for some time while waiting to acquire the submission lockRF: Store threads by job ID, as each thread submits multiple jobs. Acquire lock when waiting for threads to die, in case of interrupt after submitfunc has returned, but before jid/thread savedBF: Wrongreturn typeCI: Install dev version of fslpy for testsRF: Short-circuit test discovery for directories that match any --excludeTestsENH: Print updates to stdout while u waitBF: Indent error was causing mp.Pool to be cleared before tests finishedTEST: Run mock tests in parallelBF: Tests were not failing on missing filesRF: Don't search for tests in sandbox directoryRF: Allow benchmark/test images to be compared if they are stored in a different formatMNT: Allow the cache to be cleared. Using for testingRF: Simplify final result logic in compareAllFilesTEST: Test for compareAllFiles. Test comparing images in different formatsTEST: new mock testTEST: Fix hashbang in mock test; make sure pyzstd is installed in test envTEST: Set eval routinesMNT: Turns out the multiproc changes in py314 have broken mocking in some circumstancesBF: fslsubOption will not be present for pyfeeds compare sub-commandENH: New routine for comparing gifti vertex data. Explicitly use the first set of evaluation routines that match the filename.RF: Don't search for tests when running compare commandBF: Add empty tests attributeBF: Rework submit module to avoid pickling errors.RF: Up-weight missing file failuresRF: Change how evalroutines/tolerances are parsed - not sure why they reversed, as this would cause entries defined lower in the config file to take precedence over earlier rules
fsl-xtract 2.0.7 -> 2.0.8
Detailed history
Merge pull request #11 from SPMIC-UoN/xpyadded -in_native flag for protocols already in native space
fsl-znzlib 2111.0 -> 2511.2
- ENH: Support more compression formats
This MR adds support for the
bzip2andzstdcompression formats. As part of this work, the code has been converted from C to C++, and substantially refactored - adding new compression formats in the future will be very straightforward.
The API has been changed, but there are very few direct users of the znzlib library, so updating the rest of the code base won't require too much work, and a full rebuild of all projects won't be needed.
- All symbols are now located in a znz C++ namespace.
- znzFile is now a C++ class rather than a pointer to a struct.
- znz* functions are called on a znzFile instance, rather than being standalone functions into which a znzFile pointer is passed:
- znzopen -> znzFile / znzFile.open
- znzread -> znzFile.read
- znzwrite -> znzFile.write
- znzseek -> znzFile.seek
- znzrewind -> znzFile.rewind
- znzeof -> znzFile.eof
- znztell -> Removed (no use in codebase)
- znzputs -> Removed (no use in codebase)
- znzgets -> Removed (no use in codebase)
- znzprintf -> Removed (no use in codebase)
- znzclose() -> znzFile.close() (file is closed automatically upon destruction)
- When creating a znzFile, rather than a boolean use_compression flag, a znzFormat value may be passed, specifying the compression format.
- When creating a znzFile for reading, the default behaviour is to guess the compression format from the file contents.
- When creating a znzFile for writing, the default behaviour is to guess the compression format from the file suffix.
- RF: Handle a couple of edge cases
Fix a couple of edge cases:
- NewNifti will attempt to read from files that are already at EOF, but the bzip2 API will return an error code on attempts to do so. The bzip2Plugin::read function has been adjusted to check for EOF before attempting to read any more data.
- NewNifti may create an empty file, and then close/re-open it for writing. To accommodate this, the guessFormat function has been adjusted so that, if the file is empty, it falls back to guessing the format from the file extension.
- BF: Fix bug in zstd writer
When compressing data with length an exact multiple of the input buffer size, the ZSTD_e_end flag was not being passed to end the frame, resulting in a corrupt file. Incidentally, the pyzstd library reads these files without complaining (as all of the compressed data is actually present), but zstd -d would bork.
Detailed history
ENH: New znzguessformat function which infers format from magic bytes. New znzFormat enum to be used for multi-format supportMNT: Adjust includesTEST: Re-write test program to support in/out from any to any format (obviously only raw/gzip supported at the moment)RF: Convert to C++ module - will allow use of safer coding conventions. - znzFile is now a class. - All functions now accept a reference rather than a pointer. - znzopen returns new znzFile by value instead of mallocing - removed unnecessary XznzcloseRF: Turn standalone functions into znzFile class member functionsRF: Rename private members; adjust ctr/open to accept znzFormatMNT: Remove unused functionsRF: Only support SEEK_SETRF: Simply read/write signatures - specify number of bytes instead of size/nmemb.RF: Rename file pointer members to be clearer/more extensibleRF,ENH: znzlib rewritten to use plugin architecture - different formats implemented as separate plugins. zstd read implemented, write to comeTEST: Let the znzFile auto-guess the formatRF: Rename to znz_reader - writer will be in separate moduleENH: Scaffolding for zstd write supportENH: zstd write supportRF: Adjust znzFile interface to match plugin interfaceTEST: Install testznz because whynot. Adjust to use c++ printingBF: Need to check output buffer when testing for eofTEST: Working on test scriptTEST: Use option parser; add option to read segments, so we can test seek functionalityRF: Rename gz* to gzip*ENH,RF: Support for reading bzip2 files. Change zstdWriter so it doesn't support seekingENH: bzip2 write supportTEST: Add bzip2 to testsRF, ENH: Support SEEK_SET and SEEK_CURENH: New format() function and move constructor/assignment operator.TEST: Test relative seekingRF: Don't bother returning offset from seekMNT: compression lib linking is done by build systemMNT: Need to provide destructor in base classMNT: If given an empty file, don't throw an error, but instead fallback to guessing the format from the file suffixBF: Don't try and decompress if already at EOF - bzRead returns an error code on attempts to do soRF: Handle empty file a bit more robustlyBF: Logic error meaning that e_end was not being passed to end the curent compression frame.TEST: Add test which checks generated file integrity; specifically testing conditions that triggered the zstd bugMNT: Make comparison more explicit
spec2nii 0.8.* -> 0.8.7
Detailed history
Fix issue with anonymised params (#171)Update CHANGELOG.mdUpdates for Siemens HYPER/ISTHMUS for HBCD to ./Siemens/twixfunction.py (#159)GE P-file reader: adaptive character encoding (#156)REL: 0.8.5 (#155)MNT: Scipy version (#154)ENH: Special case dkd_svs_mslaser_msspnav DICOM (#152)This should be the final update for GE hbcd (#150)Pydicom compatibility (#149)Update CHANGELOG.mdUpdates for GE HBCD Sequence (#147)Missed a PSD in ge_read_pfile.py - adding in for hbcd2 (#145)Update CHANGELOG.mdPSD name was changed - adding in new name as an optionRelease hotfixUpdated list of PSDs to correctly enter _process_hbcd()
fsl-cudabasisfield 1.1.2 -> 2.0.0
Detailed history
MNT: Remove CUDA label from cudabasisfield library
fsl-mmorf v1.0.0 -> v1.0.1
- MNT: Remove CUDA label from mmorf executable
The MMORF CUDA executable is now simply called
mmorf_cuda, instead ofmmorf_cudaX.Y(whereX.Yis the CUDA version MMORF was compiled against). ThemmorfPython script will callmmorf_cudaormmorf_cpudepending on whether a GPU is available.
Detailed history
MNT: Remove CUDA label from mmorf executable. Adjust mmorf wrapper script accordingly.MNT: Don't print the output of find_cuda_exeMNT: Only install wrapper script with CPU exe