Compressed Dataset .BRIK Files
==============================
AFNI now supports the use of compressed .BRIK files.  The routines
that open and read these files detect the compression mode using
the filename suffix, and will use the correct decompression program
to read them in from disk.  The character 'z' is added to the end
of a dataset's listing in the AFNI menus if the .BRIK is compressed;
for example, "elvis [epan]z".

No other files used by AFNI can be compressed and still be readable
by the software.  This includes the .HEAD files, timeseries (.1D)
files, etc.  Note also that the programs 2swap and 4swap don't
do compression or decompression, so that if you need to do byte
swapping on a compressed .BRIK file, you must manually decompress
it, swap the bytes, and (optionally) recompress the file.

How to Compress
===============
You can compress the .BRIK files manually.  The following 3 programs
are supported:

  Name      Suffix  Compression Command  Uncompress Command
  --------  ------  -------------------  -------------------
  compress   .Z     compress -v *.BRIK   uncompress *.BRIK.Z
  gzip       .gz    gzip -1v *.BRIK      gzip -d *.BRIK.gz
  bzip2      .bz2   bzip2 -1v *.BRIK     bzip2 -d *.BRIK.bz2

  "compress" is available on almost all Unix systems.
  "gzip" is available on many Unix systems, and can also be
     ftp-ed from the AFNI distribution site.
  "bzip2" is included in the AFNI distribution.  It generally
     compresses more than the other two programs, but is much
     slower at both compression and uncompression.  (See the
     file README.bzip2 for details about this program.)

For large MR image datasets, "compress" and "gzip" have about the
same compression factor and take about the same CPU time (at least
in the samples I've tried here.)

Do NOT compress the .HEAD files!  AFNI will not be able to read them.

Automatic Compression
=====================
If you set the environment variable AFNI_COMPRESSOR to one of
the strings "COMPRESS", "GZIP", or "BZIP2", then most programs
will automatically pass .BRIK data through the appropriate
compression program as it is written to disk.  Note that this
will slow down dataset write operations.

Penalties for Using Compression
===============================
Datasets must be uncompressed when they are read into AFNI (or other
programs), which takes time.  In AFNI itself, a dataset .BRIK file
is only read into the program when its values are actually needed
-- when an image or graph window is opened.  When this happens, or
when you "Switch" to a compressed dataset, there can be a noticeable
delay.  For "compress" and "gzip", this may be a few seconds.  For
"bzip2", the delays will generally be longer.

The speed penalty means that it is probably best to keep the
datasets you are actively using in uncompressed form.  This can
be done by compressing datasets manually, and avoiding the use
of AFNI_COMPRESSOR (which will compress all .BRIKs).  Datasets
that you want to keep on disk, but don't think you will use
often, can be compressed.  They can still be viewed when the
need arises without manual decompression.

Large .BRIK files are normally directly mapped to memory.  This
technique saves system swap space, but isn't useful with compressed
files.  Compressed .BRIK files are read into "malloc" allocated
memory, which will take up swap space.  This may limit the number
of datasets that can be used at once.  AFNI will try to purge unused
datasets from memory if a problem arises, but it may not succeed.
If necessary, the "-purge" option can be used when starting AFNI.

Very large datasets (larger than the amount of RAM on your system)
should not be compressed, since it will be impossible to read such
an object into memory in its entirety.  It is better to rely on
the memory mapping facility in such cases.

Effect on Plugins and Other Programs
====================================
If you use the AFNI supplied routines to read in a dataset, then
everything should work well with compressed .BRIK files.  You can
tell if a dataset is compressed after you open it by using the
DSET_COMPRESSED(dset) macro -- it returns 1 if "dset" is compressed,
0 otherwise.

How it Works
============
Using Unix pipes.  Files are opened with COMRESS_fopen_read or
COMPRESS_fopen_write, and closed with COMPRESS_fclose.  The code
is in files thd_compress.[ch], if you want to have fun.  If you
have a better compression utility that can operate as a filter,
let me know and I can easily include it in the AFNI package.

=================================
| Robert W. Cox, PhD            |
| Biophysics Research Institute |
| Medical College of Wisconsin  |
=================================
