- Partial support for GLTF mesh scenes format. Needs additional libraries for full support, which are not included in casa-distro images yet.
- Python bindings and docs complements in image orientation manipulations for image orientations (support "LPI" and similar syntax).
- Fixes in voxels orientations in python bindings and numpy arrays conversions.
- Fix in sparse matrix reading.
- Deprecated pyaims Volume.arraydata().
- Crash in sulci split and deep CNN recognition fixed.
- Support Volume classes with strides on X axis. Strides were present in the volume structure but most functions assumed that voxels were contiguous on the first (X) axis. This forbid for instance bindings to numpy arrays which had a "C" ordering convention. This limitation is now gone in main Volume methods and operator. However many algorithms are still assuming that the first axis is contiguous (and use pointers with ++ incrementation), so these volumes should be reserved for specific and tested uses.
- Volume IO have been updated to support strides.
- PyAims bindings to readers taking existing data as input/output. This allows partial reading views in allocated volumes.
- Huge cleanup in Aimsdata library: the obsolete classes AimsData have been actually marked as obsolete, and their use in the libraries and commands have been drastically reduced (almost removed). A set of classes and functions originally working with AimsData have been moved to Volume API, thus many APIs have changed, normally in a way that is "as compatible as possible", but still require a few changes in client uses.
- Pyaims: AimsData classes have completely be wiped out. They are not needed any longer.
- Improved affine transformations readers: Aims can now read a transformation inside another object format header, using the fake extension ".trmhdr" and possibly options "index" or "target". The "inv" option may be used to invert the transformation (for all readers). Ex: "tutu.nii.trmhdr?index=1&inv=1"
- Improved affine transformations readers: Aims can now read a series of affine transformations and compose them on-the-fly to be read as a single transformation. It uses the fake extension ".trmc", and the "*" composition operator (as in matrix math order). Ex: "toto.trm*tutu.nii.trmhdr.trmc".
- Transformations graph: TransformGraph3d class and IO, allows to load a complete referentials/transformatons graph with automatic composition and path search. Also allows to get a given transformation from a graph via transformations readers.
- General Transformation3d IO (supporting both affine and non-linear transformations).
- New doc explaining coordinates systems.
- Colormaps and labels tables tools improvements for GIFTI textures.
- Fibers / bundles support weighted fibers (MRTrix).
- New command: AimsGraph2Volume.py: convert a graph to a volume according to a nomenclature, with colormap.
- Pyhthon IO plugin in Aims (loaded from C++) allowing python extensions in C++ programs.
- Pyaims functions for label texture cleaning + command AimsTextureCleaning.py.
- Prepare for Qt6 and PyQt6 (not finished in this released).
- Pyaims texturetools.parcels_surface_features(), record area and bouldary length features for surface parcels. New command AimsParcelsSurfaceFeatures.py.
- Added option to pass a transformation in AimsVol2Tex command.
- New command AimsDiff.py which compares several types of neuroimaging files for equality.
- Fixes (significant rework) of sulci split algorithm, which could fail and produce vertices with disconnected voxels when the cut line was very scattered. The new algorithm ensures connected parts. A sulci vertices merge function was also added.
- AimsGraphConvert: when converting a volume to graph, can use a labels table (GIFTI-like) in the volume header, and can also write a custom hierarchy with colors for it.
- Multipe other bug fixes...
- various small fixes (Volume __pow__ functions in pyaims for instance)
- Mesher copies the header of the source volume to keep transformations etc
- Fixed wrong type selected for RGBA jpeg images
- Read transformations in Freesurfer .mgh/.mgz files
- Small build fixes for ubuntu 20/22
- various fixes (in Mesher, AimsRegisterFFDEstimate, AimsTex2Vol, ...)
- added doc about bundles format
- fixes and small improvements in pyaims docs
- added a convenience shortcut to access numpy array of objects with bindings with nuppy: something.np (property)
- Improved IO of FFD (free form deformations, vector fields) and python bindings. FFDs can now be read/written as 5D (or more) NIFTI or any other volume format where the last dimension size is 3 (3D vector).
- Improved bundles formats (.bundles, .trk, .tck) introspection in Finder and BundleReader
- Removed a bunch of obsolete commands:
- AimsLinearCombination classes
- Finally get rid of old getopt (obsolete for almost 20 years...)
- PyAims bindings to numpy arrays are now allowed when items types are not scalar numbers: vectors of Point3Df or of RGB are mapped to array structures.
- pyaims: added operators **, **=, //, //= to volumes
- cartoLinearComb.py can now convert numpy expressions back to volumes before writing output
- Added support for MRTrix .tck tracks format
- Extended the URL query-string-like syntax to all AIMS IO (not only Soma-IO) to pass reading/writing options
- Reading option to fiber tracks formats: "max_filtered_memory" to filter out some tracks and limit memory usage (mainly for visualization in Anatomist)
- SurgaceGenerator new model type: parallelepiped (triangulated)
- new command: AimsApplyTransform which will replace AimsResample, AimsFFDApply and other transform commands. Supports many kinds of objects (volumes, meshes, graphs, buckets), linear and non-linear transforms, and transform chains.
- pyaims: lazy readers for better memory management, used in cartoLinearComb.py for instance
- Python plugin in aims: implements some IO in python language: numpy matrix readoing
- Many more small fixes
- pyaims: finally provide the method get(key, default=None) in dictionary-like GenericObject. Not to be confused with rc_ptr::get(), so for an Object we have to use: something.get().get('key', 'default')
- Fixes in Volume and AllocatedVector copies which caused (in rare cases) copies not to own their data
- Minc plugin has improved, allows to support more than .mnc files when additional formats are supported by libminc (.mgh/.mgz for instance)
- pyaims: more fixes for python3
- Wavefront mesh reader fixed and improved
- Many more small fixes
- Support for Volumes of more than 4 dimensions (currently setup for 8, can be changed by a constant (DIM_MAX) in sources - needs rebuilding). However not all IO formats support them.
- Volume APIs taking dimensions have been extended to take a vector of dimensions.
- Basic support for CIFTI files handling API: CiftiTools class.
- pyaims: improved python bindings, especially allow aims.vector_* and aims.list_* to convert from other types transparently, like aims.vector_PIINT3DF(numpy.array([[1.,2.,3], [4.,5.,6]))
- Porting to Python3. PyAims and the underlying libraries (Soma-Base) have finally been ported to Python 3. They are thus source compatible with with Python 2 series (2.6 and later) and Python 3 (3.4 and later).
- Improvements and fixes in IO and options.
- Lazy partial IO for SparseOrDenseMatrix
- A few more fibers manipulation functions have moved from the former connectomist project (now dead) to AIMS.
- FFD classes (vector field deformations) have been much improved and extended. Any kind of object can be deformed: volumes, meshes, buckets, bundles, graphs, points, and linear interpolation modes have been added. Python bindings have been done in PyAims.
- Points distribution function: electostatic forces models
- Build works with LLVM, C++11, and Win64 (via cross-compilation from Linux)
- Hundreds of fixes and other various improvements
- Major changes in IO system: Soma-IO is being used instead of AIMS IO for major image formats:
- The Soma-IO system has been slightly modified and improved, with a few API changes
- The older AimsData volume classes now get their IO in AIMS via the Volume classes ones, and thus may make use of Soma-IO, which was not the case in AIMS 4.4.
- GIS and NIFTI-1 formats are now primarily handled by Soma-IO. NIFTI has been completely removed from AIMS, whereas GIS is still present at the moment for custom, rare, volume types (volumes of vectors...).
- Formats using Soma-IO now benefit from partial IO, which may be specified in the files URL.
- Basic support for NIFTI-2 images (in soma-IO).
- Experimental support for bvec / bval files coming with NIFTI files converted by dicom2nii (at least). May need coordinates system adjustments.
- Basic support for Wavefront .obj mesh format (in aims)
- Enabled support for IO on textured meshes (used in anatomist, especially to export complex objects to wavefront format).
- Volume classes have been added a few convenience methods to make things easier to handle, and operator functions. The volume source code has been completely reorganized (into several files) for readability.
- Some fibers/bundles utility classes and IO (BundleProducer, BundleListener, BundleReader and bundle/graph conversion) have moved from the old connectomist project to aimsdata. Fibers IO are thus now builtin in aims/anatomist and do not depend on other libs and plugins.
- Support for Trackvis fibers format (for reading).
- More python bindings in pyaims
- Important change in PyAIMS: the surface mesh classes (AimsTimeSurface_<D>) have been extended to textured meshes, thus getting an additional texture type parameter. This has always be so in the C++ classes but python bindings were omitting this second template. The mesh classes are now named AimsTimeSurface_<D>_<DTYPE>. D is the number of vertices per polygon, as it used to be (2, 3 or 4), and DTYPE is the texture type: VOID, FLOT, POINT2DF for now. To maintain compatibility, the untextured meshes classes can still be found and used under their older names: AimsTimeSurface_<D> is then an alias to AimsTimeSurface_<D>_<DTYPE>.
Still for compatibility, in the bugfix branch of aims 4.4, the inverse alias has been introduced, so that AimsTimeSurface_<D>_<DTYPE> will be recognized by this updated branch.
- Support for textured meshes in pyaims
- Function to sort a mesh polygons along a given direction in SurfaceManip: useful to handle transparency in Anatomist.
- Improved python bindings for generic objects / dictionaries.
- JSON format support for generic objects (mainly a variant of minf format).
- aims-qtgui has been cleared from the Qt3Support dependency, and compatibility headers/sources (in aims/qt3compat/...) have been removed.
- And many many other fixes...
- Libraries organization changes: A new library, soma-io has been created as a new IO system for AIMS and possibly other libraries. Libs dependencies are now as follows:
- cartobase is now part of the soma-io subproject. It is still the lowest-level of our libraries. Thus, it has moved from the aims-free subproject to the soma-io subproject.
- soma-io depends on cartobase.
- cartodata depends on soma-io, and is still in the aims-free subproject.
- aimsdata depends on cartodata.
- aimsalgo depends on aimsdata.
- Changes in the IO system: a new IO system (based on the former cartobase one) has been separated in the (new) soma-io library. This lib is meant to be independent from Aims, cartodata and their data structures, to allow stream/array access to IO data in a way which can be independent from actual data structures. Moreover when opossible this infrastructures allows random access for partial IO. Such indepedent implementations will be coded in soma-io, while structure-dependent ones will use them in higher-level layers (cartodata). GIS and OpenSlide formats have been implemented in this new framework. Other formats ares till in the older Aims one for now.
- AimsRGB and AimsRGBA classes have been moved to the soma-io library, with new names: carto::VoxelRGB and carto::VoxelRGBA. Old classes are still available as typedefs.
- The AimsElevationMap command has been moved from the private bioprocessing project to the open-source aims project.
- added a wireframe section in SurfaceGenerator to produce segments meshes. Implemented a parallelepiped.
- Fix in AimsMerge: it was reading the mask as the merged volume.
- new SparseMatrix and SparseOrDenseMatrix classes, with IO, based on boost sparse matrices. Python bindings for such classes.
- Support for Minc2 volumes in the Minc IO plugin.
- Mesher smoothing can use a panel of different algorithms, and the default one is much more accurate than the former.
- IO in Aims have been made "almost" thread-safe. Unfortunately some race conditions still exist and programs sometimes crash when used intensively. It doesn't happen very often, but it happens...
- Some volume IO have been significantly optimized to decrease read/write time. Especially GIS and NIFTI formats are much faster than in aims 4.3.
- Volume with borders handling has changed: it is now using the views system (subvolume in a larger volume) instead of a trick using a _borderWidth attribute in the header.
- pyaims : added possibility do use unallocated volumes.
- pyaims: added access to IO types and formats in Python.
- new command: AimsVolumeToTexture.py, performs the same as anatomist Fusion3D, in the most basic mode (for now).
- And many other fixes...
- aimsalgo: Fixed a sulcal measurements bug in length calculation, when a folds graph node has several disconnected components. Happens rerely, but we have seen it, so it may happen.
This version brings a number of bug fixes, and improvements:
- AimsVoiStat command is now deprecated, AimsRoiFeatures command should be used instead
- It is now possible to use volumes whose size is larger than 32 bits.
- Fix in AimsFoldArgAtt command
- Fix in fold split
- Fix operators on volumes in PyAims
- Improved buckets bindings
- Improved bindings to numpy arrays
This version brings a number of bug fixes, and improvements:
- Implemented native support for volume * T and volume / T with T numeric types, typically long int, calculating in native types rather than casting to double as it used to. This avoids rounding errors when back-casting to int types. Python bindings were adapted too.
- Geodesicpath library update
- Fix in AimsMassCenter averaging.
- DICOM reader fixes for a few header fields, and support for SPECT data.
- FiniteElementSmoothing: removed spurious debug texture writing during smoothing, which caused a hard-coded file /tmp/curv_ss.tex to be written, and participated to a memory leak which could lead (in pathologic cases) to memory overrun.
- Fixed rescaling in volume converters (AimsFileConvert + libs)
- Fixed a bug in SplineResampler: the spline coefficients could be wrong at the boundaries of the volume.
- Fixed a SIP ownership problem which caused some memory leaks (especially when automatically converting a Volume to a AimsData)
- Fixed a reference-counting problem in volume headers (the header could be deleted with the volume even if a header object in python was still existing).
- Fixed an IMPORTANT BUG in Quaternion: the rotationMatrix() had a matrix elements index bug that caused the translation part not to be initialized. By chance it was most of the time 0 on most systems, but not all/always...
- Mesher debug output cleaning
- NIFTI IO: update to nifticlib 2.0.0
- try to setup BRAINVISA_SHARE envar if it is not set, from the path of the python module.
In this version, an important change for the developers should be noted : the build tool used to compile from the source code has changed. We gave up our home-made tool build-config and replace it with the standard tool CMake, a cross-platform, open-source build system.
This version also brings a number of bug fixes, and improvements:
- Add support for RGB/RGBA background in AimsResample
- Bug fix in aims.write when the specified path doesn't exist.
- Helper functions to create the main Aims data types
- Allow additional constructors arguments for volumes and textures (build from another volume, or a numpy array...)
- Big fix in TimeSurface erase function
- DataExchanger renamed GenObject
- RcExchanger renamed Object
- DataExchangerValue renamed TypedObject
- SyntaxedExchanger renamed SyntaxedObject