Nov. 20, 2018, Version 4.6.2
- pyaims: added operators **, **=, //, //= to volumes
- cartoLinearComb.py can now convert numpy expressions back to volumes before writing output
Aug. 31, 2018, Version 4.6.1
- 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
Oct. 03, 2017, Version 4.6.0
- 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
Feb. 17, 2016, Version 4.5.0
- 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...
Oct 9th, 2013, Version 4.4.0
- 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:
This new organization is meant to allow other libraries (PTK for instance) to use cartobase and soma-io without depending on cartodata and/or aimsdata, which define specific data structures, whereas soma-io does not.
- 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...
Oct 8th, 2012, Version 4.3.1
- 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.
Sept 6th, 2012, Version 4.3.0
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
February 16th, 2012, Version 4.2.1
- Improved buckets bindings
- Improved bindings to numpy arrays
Feb 3rd, 2012, Version 4.2.0
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).
Sept 14th, 2011, Version 4.1.1
- 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.
May 17th, 2011, Version 4.1.0
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
November 19th, 2010, Version 4.0.2
Fix reading GIFTI files extracted from SPM 8
Fix reading GIFTI mesh+texture files
Fix reading and writing transformations in MINC format
New option in AimsFileConvert: --orient, to specify output disk orientation or flip it
support for MNI .obj mesh format
AimsFoldGraphThickness can now use a pre-built sulci voronoi map (to speed things up)
Forbids to write NIFTI format when volume dimensions do not fit in short ints: NIFTI stores dimensions as short.
AimsLabelSelector can now work in batch mode (-b) without graphical interface.
May 28, 2010, Version 4.0
Improvements and fixes in various IO modules: Dicom, Nifti, Gifti, FDF
Beginning of a SQL database format for graphs (QSlite files for now). This will allow partial reading and queries in large graphs databases. But the module is still experimental and the SQL database schema will probably change, so it should not be used yet to store important graphs. Conversion from and to the .arg format are still possible.
Noticeable API change: the Motion class (for affine spatial transformations) has been renamed AffineTransformation3d in aims namespace, inherits the new Tansformation and Transformation3d classes, and undergoes some methods changes. Motion is still provided as a typedef to avoid breaking existing code, but some changes may be required anyway. See the AffineTransformation3d class documentation for details.
python API: more automatic conversions between reference-counted objects (rc_ptr and Object classes) and their contents when calling wrapped C++ functions
python API: the get() method of rc_ptr and Object classes is replaced by _get() so as not to shadow potential get() methods in the objects under the reference counter. In 4.0 the get() method is still present for backward compatibility and behaves as it did before, but this will be changed in a next release, so programmers are advised to use _get() instead (which is now rarely needed).
January 8, 2010, Version 3.2.1
New global option to Aims commandlines: --debugLevel. It is used instead of the --verbose option to print debug messages, when loading plugins for instance.
Nifti IO: When loading large 4D volumes which need a reorientation in memory, don't duplicate the whole 4D volume when reorienting. This saves temporary memory allocation.
Nifti IO: when no qform/sform/transformations are already in a volume written in nifti, set the origin at the center of the volume, otherwise SPM is lost (normalizaton fails)
September 4, 2009, Version 3.2
Re-organization of sources of aims: aims now regroups aimsdata, aimsalgo, graph, cartobase, cartodata, IO libs (ecat, ecat+, vidaIO), and aims-gpl which is the gui part.
added default_writers option in aimsrc: see the doc for details
the default output volumes format when no extension is specified is now NIFTI1.
GIFTI IO support for meshes and textures
The $SHFJ_SHARED_PATH environment variable is deprecated. It is replaced with the $BRAINVISA_SHARE variable. For now it contains a single directory, but will evolve in a PATH-like behaviour in future versions. $SHFJ_SHARED_PATH still exists as a fallback for backwards compatibility.
If no environment variable is set at all, the share directory is guessed from the $PATH variable.
May 10, 2009, Version 3.1.6
IO: Fix in NIFTI-1 writer when the storage_to_memory matrix is not what it should be
IO: Fix in reading pure 3D NIFTI-1 images (no 4th dimension)
Transformation information is set and maintained in sub-volumes and resampled volumes
A fix in the Quaternion class (apply() function)
IO: support TIFF format on U32 data type
Fix in meshExtract when no index array is needed
AimsFileInfo: correctly display min/max values for U8 and S8 types
November 14, 2009, Version 3.1.5
Correctly save alpha channel of RGBA volumes in Qt formats IO
Correctly use the "output_4d_volumes" option in NIFTI-1 writer
A few more minor fixes
October 24, 2008, Version 3.1.4
New global commandlines option: "output_4d_volumes" (used for NIFTI and SPM), replacing the recent "spm_output_4d_volumes".
Fixes in graph sub-objects IO system.
Fix: file descriptor leak in Tiff reader.
various other minor things
September 24, 2008, Version 3.1.3
various minor things
August 18, 2008, Version 3.1.2
various minor things
August 8, 2008, Version 3.1.1
A serious bug fix in NIFTI writer: Nifti transformations were sometimes wong in the .nii file, event when they were OK in the .minf file.
fixed a recent bug in the volume type converters when using rescaling which could show side effects in various commands
Fixes and improvements in graphs reading when containing data stored as labels volumes. Changed the way anatomist handles them to a much cleaner behaviour.
many other less important fixes
some minor (not user-visible) improvements and additions to the libraries
January 4, 2008, Version 3.1
SPM images IO: ***CAUTION***,
behaviour change: Read this document
for details. The default settings for AIMS is now to behave like SPM2, not like SPM99 anymore.
NIFTI-1 volume format support, by Guillaume Flandin, using niftilib
PLY mesh format support, using the Rply library
Improvements in the Qt4 compatibility
complete reimplementation of the mesh cutting algorithm (used in anatomist). It doesn't crash anymore, but leaves holes or incorrect things on meshes with overlapping triangles
complements and improvements in the IO system and its suppport for various object types
headers were added to data objects which did not have one (Motion, buckets, Hierarchy, Object, ...)
The Quaternion class has been moved from anatomist to aimsdata. Bridges between Quaternions and Motions.
python bindings for a large part of aimsdata API (all data types and IO): see the pyaims project
... far too many changes to possibly list them...
and many many bugfixes
April 27, 2006, Version 3.0.2
Image formats handled via the Qt plugin (png, bmp...) had several bugs that
caused image corruption when saving/reading them. It has been fixed, and support
for int types wider than 8bit has been unregistered (it can't work actually).
Some 3D MINC images got an incorrect value (NaN or infinity) for 4th dimension in Aims
A huge memory leak has been fixed in AimsSubVolume in multiple output files
mode, and some optimizations were done in this case.
The sourcecode now compiles with gcc 4.1
Many other minor bugs were fixed
September 22, 2005 - Version 3.0.1
important bugfix in interpolation code which may affect, especially, all
diffusion tracking algorithms
a few compilation warnings and configuration fixes / cleanups
AimsSubVolume supports a wider range of data types
The gui part is now compatible with Qt 4 - more compatibility headers
Fixed IO type Texture of Point2df which did not appear amongst supported IO types
Fixes in management of Aims objects contained in graphs
Fixed SPM writin of float/double images which were sometimes written
in (short + scale factor) mode when they should not
May 18, 2005 - Version 3.0
Volumes IO: better support for large files. Memory mapping has been automatically
enabled on GIS and SPM volumes when image sizes become large compared to the free
memory size (linux only right now) or to absolute amounts. This is especially useful
when loading large data in Anatomist or for data conversions. Note that not all
volume formats can benefit the same optimization: depending on the disk and memory
format of low-level data, the whole file must be copied to a temporary file in
some situations (always needed for SPM volumes). Prefer GIS format when possible...
SPM volumes of FLOAT data can now be saved as short int + scale factor when it
appears to be possible without precision loss. The drawback right now is that
detecting the possibility of doing it takes some time and it's slower.
Minc format IO support: thanks to Olivier Coliot who wrote the reader/writer classes, there is
now a Minc plugin in Aims. At the moment only 3D files are supported (not 4D) and the datatype
detection may be improved in the future, but the base is here now. The plugin needs the Minc
The Ecat format IO has been ported to Windows
Graphs incompletely loaded (without buckets or meshes, like in the recognition program) and
saved back to disk now load their sub-objects before they are saved, so nothing is lost anymore.
The drawback is that saving them is much longer and consumes far more RAM.
Porting to 64 bit systems: done by Dimitri
Version numbering: all our projects will have the same version number: 3.0 for
Allocators have changed a bit, and their choice has been facilitated by a
helper / factory class.
Porting to 64 bit systems. This port implies some modifications on some programming rules: we
sould avoid using the long type anymore, but always fixed size types:
int32_t, int8_t etc, so AimsData<long> should be replaced
with AimsData<int32_t> in all Aims code.
In cartobase, the generic object API has been rewritten in a cleaner way GenObject
becomes GenericObject. A compatibility interface is provided so code will not break,
but we plan to remove it once we have cleaned all code (maybe in the next version).
Preparations for deep changes in Aims API: some main classes will be re-written in a new
library: cartodata. The first is the 4D volume class (aims::AimsData) which will
become carto::Volume, a newer, cleaner and more powerful implementation.
In this release, AimsData is only a wrapper for Volume.
Compatibility will be preserved. Moreover the wrapping can be disabled by a #define (the
older implementation is still present in the source code).
A Python interface project for Aims has been started: pyaims, at the moment it allows
manipulating volumes (including IO), either under AimsData or Volume shape.
Meshes will be added soon.
Porting to gcc 4.0 compiler
17/11/2004 - Bugfix update 2.13(c)
fixes in SPM IO
little doc on coordinates systems of AIMS and SPM:
fixes on the Windows port, especially the graph writer which could write the .data directory
in the wrong location (in the current directory). This bug affected saving ROI sessions from
Anatomist, for instance.
various other minor fixes
06/07/2004 - Bugfix update 2.13(b)
bucket writer wrote wrong voxel sizes
fix in list repesentations of attributed objects browser, this showed up in Anatomist
vida reader crashed on large files (with more than ~250 slices)
18/02/2004 - Version 2.13
Porting to Windows: the sources can now be compiled on Windows platforms
using either cygwin or MinGW gcc compilers and environments. I guess there will
still be some little glitches but lots of commands now work well on Windows.
Note: Vida and Ecat IO modules don't compile under MinGW because they
use a missing rpc/hdr library.
SPM images IO: ***CAUTION***,
behaviour change: Read this document
for details. There have been a number of fixes, improvements and changes.
Fixes in Dicom reader allowing to still read images with partially incoherent
Beginning of a TIFF format reader (by Vincent Frouin), but it is not finished
yet and apparently only partially working.
Rework of environment variables handling: to access data, several environment
variables were needed: SHFJ_SHARED_PATH, AIMS_PATH,
ANATOMIST_PATH, SIGRAPH_PATH etc.
Now a more standard shared data structure can be adopted and only one environment
variable is needed (SHFJ_SHARED_PATH). The older way (with several variables)
is still supported. Shared data can be organized in $SHFJ_SHARED_PATH/shfj,
$SHFJ_SHARED_PATH/sigraph etc. If SHFJ_SHARED_PATH is set to
/usr/local/share or /usr/share, you just get a completely
Settings files for AIMS, currently used to specify SPM IO conventions. There is
one site-wide settings files (in the shared directory of Aims) and one personal
$HOME/.aimsrc file. See this page for further
Many other things... I can't remember
Utility classes & functions for portably handling files, directories and
filenames (made for windows porting...) [in cartobase library]
Threads: the threading package has moved from aimsalgo library (closed-source)
to cartobase library (GPL). It implements a portable C++ interface to threads, and
will be used in Anatomist now.
Many other things... I can't remember
27/03/2003 - Version 2.12
More explanatory IO error messages
AimsFileConvert can handle RGB/RGBA images
Many many other things I don't remember...
libshfj has been renamed libcartobase (beginning of
Some classes have moved from aims and graph libraries to cartobase,
especially low-level general utility classes. More of them should move in
the future. For now: stream classes, exceptions, GenObject
and associated classes (formerly named DataExchanger),
AttributedObject and IO (including syntax), Python-like IO for
Object, string conversion templates, DataTypeCode
template, basic typedefs...
Some classes still in aims have moved to the new namespace
carto, like OptionParser and related classes
Classes renamings (in cartobase):
Externalization (as plugins) of IO formats that use external libraries
(I mean external to aims, even for libraries made in SHFJ): Vida, Ecat,
Many many other things I don't remember...
- DataExchanger renamed GenObject
- RcExchanger renamed Object
- DataExchangerValue renamed TypedObject
- SyntaxedExchanger renamed SyntaxedObject
31/10/2002 - Version 2.11
Nothing has been recorded...
nothing has been recorded...
09/07/2002 - Version 2.10
beginning of ChangeLog: nothing yet