From jharlap at bic.mni.mcgill.ca Mon May 1 15:01:49 2006 From: jharlap at bic.mni.mcgill.ca (Jonathan HARLAP) Date: Mon, 01 May 2006 15:01:49 -0400 Subject: [MINC-development] swig wrappers for minc2 In-Reply-To: <44218F28.4000201@stanford.edu> References: <44210335.8070801@stanford.edu> <1143042148.24657.3.camel@localhost.localdomain> <44218F28.4000201@stanford.edu> Message-ID: <44565B1D.9010608@bic.mni.mcgill.ca> Hi Jonathan, I took a look at your swig minc2 interface file, and it seems to be a good start, although, as you mentioned, not quite complete. I've been thinking that this would be pretty useful for both python and java users, as swig can also create java JNI wrappers... Before I get into filling out the swig interface files for minc2, I was just wondering if you've done any more work on it, in the hope of minimizing duplicated effort. Cheers, J Jonathan Taylor wrote: > hello leila, > > the wrapper is probably not very functional -- it was my first attempt > at swig. now that i've read a little more swig documentation i might do > a better job. > > i would like to try testing it out on some minc2.0 images, too. > > as i was a student at mcgill, i actually still have an MNI account. can > you point me to a few example files? > > -- jonathan > > Leila Baghdadi wrote: > >>Hello Jonathan, >> >>Thanks very much for doing this, I am sure there is plenty of interest. >> >>I will check your code see if I use it with minc2.0 images. >> >>will let you know >> >>Leila >> >>On Tue, 2006-21-03 at 23:56 -0800, Jonathan Taylor wrote: >> >> >>>hi, >>> >>>i don't know how much interest there is in this (i am interested at >>>least), but i used swig to generate >>>python wrappers for minc2. they compile (and import) fine, but i have >>>nothing to test them with. >>> >>>in theory, the swig file could be used to generate wrappers for other >>>languages.... >>> >>>attached is the minc2.i i used, and here are the commands i used to >>>build the python module.... from the >>>minc-2.0.05 main directory: >>> >>>make distclean >>>./configure --prefix=/home/jtaylo/tmp >>> make >>>make install >>>cd libsrc2 >>> swig -python minc2.i >>> gcc -c *.c -I/usr/include/python2.4 >>> gcc -shared *.o -L/home/jtaylo/tmp/lib -lminc2 -lhdf5 -lnetcdf -o >>>_minc2.so >>> python -c "import minc2" >>> >>>got a few warnings: >>>hyper.c: In function 'mirw_hyperslab_raw': >>>hyper.c:420: warning: pointer targets in passing argument 3 of >>>'H5Sselect_hyperslab' differ in signedness >>>m2util.c: In function 'miinit': >>>m2util.c:938: warning: passing argument 5 of 'H5Tregister' from >>>incompatible pointer type >>>m2util.c:941: warning: passing argument 5 of 'H5Tregister' from >>>incompatible pointer type >>>m2util.c: In function 'miinit_enum': >>>m2util.c:979: warning: passing argument 5 of 'H5Tregister' from >>>incompatible pointer type >>>m2util.c:981: warning: passing argument 5 of 'H5Tregister' from >>>incompatible pointer type >>>m2util.c:983: warning: passing argument 5 of 'H5Tregister' from >>>incompatible pointer type >>>m2util.c:985: warning: passing argument 5 of 'H5Tregister' from >>>incompatible pointer type >>>m2util.c: In function 'minc_update_thumbnail': >>>m2util.c:1343: warning: pointer targets in passing argument 3 of >>>'H5Sselect_hyperslab' differ in signedness >>>m2util.c:1361: warning: pointer targets in passing argument 3 of >>>'H5Sselect_hyperslab' differ in signedness >>>m2util.c:1372: warning: passing argument 4 of 'H5Sselect_elements' from >>>incompatible pointer type >>>slice.c: In function 'mirw_slice_minmax': >>>slice.c:80: warning: passing argument 4 of 'H5Sselect_elements' from >>>incompatible pointer type >>> >>>best, >>> >>>jonathan >>> >>> >>>plain text document attachment (minc2.i) >>>%module minc2 >>>%{ >>>#include "minc2.h" >>>%} >>> >>>/* ATTRIBUTE/GROUP FUNCTIONS */ >>> >>>extern int micreate_group(mihandle_t vol, const char *path, const char *name); >>>extern int midelete_attr(mihandle_t vol, const char *path, const char *name); >>>extern int midelete_group(mihandle_t vol, const char *path, const char *name); >>>extern int miget_attr_length(mihandle_t vol, const char *path, >>> const char *name, int *length); >>>extern int miget_attr_type(mihandle_t vol, const char *path, const char *name, >>> mitype_t *data_type); >>>extern int miget_attr_values(mihandle_t vol, mitype_t data_type, >>> const char *path, const char *name, >>> int length, void *values); >>>extern int miset_attr_values(mihandle_t vol, mitype_t data_type, >>> const char *path, const char *name, int length, >>> const void *values); >>> >>>/* FREE FUNCTIONS */ >>>extern int mifree_name(char *name_ptr); >>>extern int mifree_names(char **name_pptr); >>> >>>/* DATA TYPE/SPACE FUNCTIONS */ >>>extern int miget_data_class(mihandle_t vol, miclass_t *volume_class); >>>extern int miget_data_type(mihandle_t vol, mitype_t *volume_data_type); >>>extern int miget_data_type_size(mihandle_t vol, misize_t *voxel_size); >>>extern int miget_space_name(mihandle_t vol, char **name); >>>extern int miset_space_name(mihandle_t vol, const char *name); >>> >>>/* DIMENSION FUNCTIONS */ >>>extern int miget_volume_from_dimension(midimhandle_t dimension, mihandle_t *volume); >>>extern int micopy_dimension(midimhandle_t dim_ptr, midimhandle_t *new_dim_ptr); >>>extern int micreate_dimension(const char *name, midimclass_t dimclass, midimattr_t attr, >>> unsigned long length, midimhandle_t *new_dim_ptr); >>>extern int mifree_dimension_handle(midimhandle_t dim_ptr); >>>extern int miget_volume_dimensions(mihandle_t volume, midimclass_t dimclass, midimattr_t attr, >>> miorder_t order, int array_length, >>> midimhandle_t dimensions[]); >>>extern int miset_apparent_dimension_order(mihandle_t volume, int array_length, midimhandle_t dimensions[]); >>>extern int miset_apparent_dimension_order_by_name(mihandle_t volume, int array_length, char **names); >>>extern int miset_apparent_record_dimension_flag(mihandle_t volume, int record_flag); >>>extern int miget_dimension_apparent_voxel_order(midimhandle_t dimension, miflipping_t *file_order, >>> miflipping_t *sign); >>>extern int miset_dimension_apparent_voxel_order(midimhandle_t dimension, miflipping_t flipping_order); >>>extern int miget_dimension_class(midimhandle_t dimension, midimclass_t *dimclass); >>>extern int miset_dimension_class(midimhandle_t dimension, midimclass_t dimclass); >>>extern int miget_dimension_cosines(midimhandle_t dimension, >>> double direction_cosines[3]); >>>extern int miset_dimension_cosines(midimhandle_t dimension, >>> const double direction_cosines[3]); >>>extern int miset_dimension_description(midimhandle_t dimension, const char *comments); >>>extern int miget_dimension_description(midimhandle_t dimension, char **comments_ptr); >>>extern int miget_dimension_name(midimhandle_t dimension, char **name_ptr); >>>extern int miset_dimension_name(midimhandle_t dimension, const char *name); >>>extern int miget_dimension_offsets(midimhandle_t dimension, unsigned long array_length, >>> unsigned long start_position, double offsets[]); >>>extern int miset_dimension_offsets(midimhandle_t dimension, unsigned long array_length, >>> unsigned long start_position, const double offsets[]); >>>extern int miget_dimension_sampling_flag(midimhandle_t dimension, BOOLEAN *sampling_flag); >>>extern int miset_dimension_sampling_flag(midimhandle_t dimension, BOOLEAN sampling_flag); >>>extern int miget_dimension_separation(midimhandle_t dimension, mivoxel_order_t voxel_order, >>> double *separation_ptr); >>>extern int miset_dimension_separation(midimhandle_t dimension, double separation); >>>extern int miget_dimension_separations(const midimhandle_t dimensions[], >>> mivoxel_order_t voxel_order, int array_length, >>> double separations[]); >>>extern int miset_dimension_separations(const midimhandle_t dimensions[], int array_length, >>> const double separations[]); >>>extern int miget_dimension_size(midimhandle_t dimension, unsigned long *size_ptr); >>>extern int miset_dimension_size(midimhandle_t dimension, unsigned long size); >>>extern int miget_dimension_sizes(const midimhandle_t dimensions[], int array_length, >>> unsigned long sizes[]); >>>extern int miget_dimension_start(midimhandle_t dimension, mivoxel_order_t voxel_order, >>> double *start_ptr); >>>extern int miset_dimension_start(midimhandle_t dimension, double start_ptr); >>>extern int miget_dimension_starts(const midimhandle_t dimensions[], mivoxel_order_t voxel_order, >>> int array_length, double starts[]); >>>extern int miset_dimension_starts(const midimhandle_t dimensions[], int array_length, >>> const double starts[]); >>>extern int miget_dimension_units(midimhandle_t dimension, char **units_ptr); >>>extern int miset_dimension_units(midimhandle_t dimension, const char *units); >>>extern int miget_dimension_width(midimhandle_t dimension, double *width_ptr); >>>extern int miset_dimension_width(midimhandle_t dimension, double width_ptr); >>>extern int miget_dimension_widths(midimhandle_t dimension, mivoxel_order_t voxel_order, >>> unsigned long array_length, unsigned long start_position, >>> double widths[]); >>>extern int miset_dimension_widths(midimhandle_t dimension, unsigned long array_length, >>> unsigned long start_position, const double widths[]); >>> >>> >>>/* VOLUME FUNCTIONS */ >>>extern int micreate_volume(const char *filename, int number_of_dimensions, >>> midimhandle_t dimensions[], >>> mitype_t volume_type, >>> miclass_t volume_class, >>> mivolumeprops_t create_props, >>> mihandle_t *volume); >>>extern int micreate_volume_image(mihandle_t volume); >>>extern int miget_volume_dimension_count(mihandle_t volume, midimclass_t dimclass, >>> midimattr_t attr, int *number_of_dimensions); >>>extern int miget_volume_voxel_count(mihandle_t volume, int *number_of_voxels); >>>extern int miopen_volume(const char *filename, int mode, mihandle_t *volume); >>>extern int miclose_volume(mihandle_t volume); >>> >>>extern int miget_slice_scaling_flag(mihandle_t volume, >>> BOOLEAN *slice_scaling_flag); >>>extern int miset_slice_scaling_flag(mihandle_t volume, >>> BOOLEAN slice_scaling_flag); >>> >>>/* VOLUME PROPERTIES FUNCTIONS */ >>>extern int minew_volume_props(mivolumeprops_t *props); >>>extern int mifree_volume_props(mivolumeprops_t props); >>>extern int miget_volume_props(mihandle_t vol, mivolumeprops_t *props); >>>extern int miset_props_multi_resolution(mivolumeprops_t props, BOOLEAN enable_flag, >>> int depth); >>>extern int miget_props_multi_resolution(mivolumeprops_t props, BOOLEAN *enable_flag, >>> int *depth); >>>extern int miselect_resolution(mihandle_t volume, int depth); >>>extern int miflush_from_resolution(mihandle_t volume, int depth); >>>extern int miset_props_compression_type(mivolumeprops_t props, micompression_t compression_type); >>>extern int miget_props_compression_type(mivolumeprops_t props, micompression_t *compression_type); >>>extern int miset_props_zlib_compression(mivolumeprops_t props, int zlib_level); >>>extern int miget_props_zlib_compression(mivolumeprops_t props, int *zlib_level); >>>extern int miset_props_blocking(mivolumeprops_t props, int edge_count, const int *edge_lengths); >>>extern int miget_props_blocking(mivolumeprops_t props, int *edge_count, int *edge_lengths, >>> int max_lengths); >>>extern int miset_props_record(mivolumeprops_t props, long record_length, char *record_name); >>>extern int miset_props_template(mivolumeprops_t props, int template_flag); >>> >>>/* SLICE/VOLUME SCALE FUNCTIONS */ >>>extern int miget_slice_max(mihandle_t volume, >>> const unsigned long start_positions[], >>> int array_length, double *slice_max); >>>extern int miset_slice_max(mihandle_t volume, >>> const unsigned long start_positions[], >>> int array_length, double slice_max); >>>extern int miget_slice_min(mihandle_t volume, >>> const unsigned long start_positions[], >>> int array_length, double *slice_min); >>>extern int miset_slice_min(mihandle_t volume, >>> const unsigned long start_positions[], >>> int array_length, double slice_min); >>>extern int miget_slice_range(mihandle_t volume, >>> const unsigned long start_positions[], >>> int array_length, double *slice_max, >>> double *slice_min); >>>extern int miset_slice_range(mihandle_t volume, >>> const unsigned long start_positions[], >>> int array_length, double slice_max, >>> double slice_min); >>>extern int miget_volume_max(mihandle_t volume, double *slice_max); >>>extern int miset_volume_max(mihandle_t volume, double slice_max); >>>extern int miget_volume_min(mihandle_t volume, double *slice_min); >>>extern int miset_volume_min(mihandle_t volume, double slice_min); >>>extern int miget_volume_range(mihandle_t volume, double *slice_max, >>> double *slice_min); >>>extern int miset_volume_range(mihandle_t volume, double slice_max, >>> double slice_min); >>>/* HYPERSLAB FUNCTIONS */ >>> >>>extern int miget_real_value_hyperslab(mihandle_t volume, >>> mitype_t buffer_data_type, >>> const unsigned long start[], >>> const unsigned long count[], >>> void *buffer); >>> >>>extern int miset_real_value_hyperslab(mihandle_t volume, >>> mitype_t buffer_data_type, >>> const unsigned long start[], >>> const unsigned long count[], >>> const void *buffer); >>> >>>extern int miget_voxel_value_hyperslab(mihandle_t volume, >>> mitype_t buffer_data_type, >>> const unsigned long start[], >>> const unsigned long count[], >>> void *buffer); >>> >>>extern int miset_voxel_value_hyperslab(mihandle_t volume, >>> mitype_t buffer_data_type, >>> const unsigned long start[], >>> const unsigned long count[], >>> const void *buffer); >>> >>>extern int miget_hyperslab_normalized(mihandle_t volume, >>> mitype_t buffer_data_type, >>> const unsigned long start[], >>> const unsigned long count[], >>> double min, >>> double max, >>> void *buffer); >>> >>>/* CONVERT FUNCTIONS */ >>>extern int miconvert_real_to_voxel(mihandle_t volume, >>> const unsigned long coords[], >>> int ncoords, >>> double real_value, >>> double *voxel_value_ptr); >>> >>>extern int miconvert_voxel_to_real(mihandle_t volume, >>> const unsigned long coords[], >>> int ncoords, >>> double voxel_value, >>> double *real_value_ptr); >>> >>>extern int miconvert_3D_voxel_to_world(mihandle_t volume, >>> const double voxel[], >>> double world[]); >>> >>>extern int miconvert_3D_world_to_voxel(mihandle_t volume, >>> const double world[], >>> double voxel[]); >>> >>>extern int miget_real_value(mihandle_t volume, >>> const unsigned long coords[], >>> int ndims, >>> double *value_ptr); >>> >>>extern int miset_real_value(mihandle_t volume, >>> const unsigned long coords[], >>> int ndims, >>> double value); >>>extern int miget_voxel_value(mihandle_t volume, >>> const unsigned long coords[], >>> int ndims, >>> double *voxel_ptr); >>> >>>extern int miset_voxel_value(mihandle_t volume, >>> const unsigned long coords[], >>> int ndims, >>> double voxel); >>> >>>extern int miget_volume_real_range(mihandle_t volume, double real_range[2]); >>> >>>/* VALID functions */ >>>extern int miget_volume_valid_max(mihandle_t volume, double *valid_max); >>>extern int miset_volume_valid_max(mihandle_t volume, double valid_max); >>>extern int miget_volume_valid_min(mihandle_t volume, double *valid_min); >>>extern int miset_volume_valid_min(mihandle_t volume, double valid_min); >>>extern int miget_volume_valid_range(mihandle_t volume, >>> double *valid_max, double *valid_min); >>>extern int miset_volume_valid_range(mihandle_t volume, >>> double valid_max, double valid_min); >>> >>>/* RECORD functions */ >>>extern int miget_record_name(mihandle_t volume, char **name); >>>extern int miget_record_length(mihandle_t volume, int *length); >>>extern int miget_record_field_name(mihandle_t volume, int index, char **name); >>>extern int miset_record_field_name(mihandle_t volume, int index, >>> const char *name); >>> >>>/* LABEL functions */ >>>extern int midefine_label(mihandle_t volume, int value, const char *name); >>>extern int miget_label_name(mihandle_t volume, int value, char **name); >>>extern int miget_label_value(mihandle_t volume, const char *name, int *value); >>> >>>_______________________________________________ >>>MINC-development mailing list >>>MINC-development at bic.mni.mcgill.ca >>>http://www.bic.mni.mcgill.ca/mailman/listinfo/minc-development >>> >>> >> >>_______________________________________________ >>MINC-development mailing list >>MINC-development at bic.mni.mcgill.ca >>http://www.bic.mni.mcgill.ca/mailman/listinfo/minc-developmen >> >> > > -- > ------------------------------------------------------------------------ > I'm part of the Team in Training: please support our efforts for the > Leukemia and Lymphoma Society! > > http://www.active.com/donate/tntsvmb/tntsvmbJTaylor > > GO TEAM !!! > > ------------------------------------------------------------------------ > Jonathan Taylor Tel: 650.723.9230 > Dept. of Statistics Fax: 650.725.8977 > Sequoia Hall, 137 www-stat.stanford.edu/~jtaylo > 390 Serra Mall > Stanford, CA 94305 > > _______________________________________________ > MINC-development mailing list > MINC-development at bic.mni.mcgill.ca > http://www.bic.mni.mcgill.ca/mailman/listinfo/minc-development From jharlap at bic.mni.mcgill.ca Wed May 31 10:34:13 2006 From: jharlap at bic.mni.mcgill.ca (Jonathan HARLAP) Date: Wed, 31 May 2006 10:34:13 -0400 Subject: [MINC-development] default file type (HDF5 vs NetCDF) Message-ID: <447DA965.3070100@bic.mni.mcgill.ca> Heylas, I know I've raised this before, but now that I understand what's going on a little better I'd like to propose a small change: In libsrc/netcdf_convenience.c the function micreatex reads: if ((cmode & MI2_CREATE_V1) != 0) { fd = nccreate(path, cmode); } else if (miget_cfg_bool(MICFG_FORCE_V2) || (cmode & MI2_CREATE_V2) != 0) { fd = hdf_create(path, cmode, opts_ptr); } else { if (mi_nc_files == 0 && mi_h5_files != 0) { /* Create an HDF5 file. */ fd = hdf_create(path, cmode, opts_ptr); } else { /* Create a NetCDF file. */ fd = nccreate(path, cmode); } } I propose changing the line "if (mi_nc_files == 0 && mi_h5_files != 0)" to read " if (mi_nc_files == 0)" The reason is that currently the code will default to creating HDF5 files only if a program has already opened an HDF5 file. The change proposed would make it such that the library will only create CDF files if a program has already opened a CDF file. This won't influence any of the minc tools normally used on a day-to-day basis, but will change the default output of file format converters that don't read any minc files before creating an output file. I didn't put this in CVS yet as I don't know what your process is for getting this kind of functionality change into the library. Cheers, J From bert at bic.mni.mcgill.ca Wed May 31 11:00:37 2006 From: bert at bic.mni.mcgill.ca (Robert VINCENT) Date: Wed, 31 May 2006 11:00:37 -0400 Subject: [MINC-development] default file type (HDF5 vs NetCDF) In-Reply-To: <447DA965.3070100@bic.mni.mcgill.ca> Message-ID: Hi, I had coded it this way specifically to avoid having programs like rawtominc default to MINC 2.0 format. My intent was that a user would have to make the decision to change all of their files to MINC 2.0 format, and then all subsequent tools would automatically honor this decision. But I didn't want a user to get a MINC 2.0 file without knowing they'd asked for it. If the general feeling is that MINC 2.0 is working for people, then I don't object to this change. I just didn't want to force the new format onto the world, especially in environments where MINC 2.0 format support might be incomplete. -bert If people feel that On Wed, 31 May 2006, Jonathan HARLAP wrote: > Heylas, > > I know I've raised this before, but now that I understand what's going > on a little better I'd like to propose a small change: > > In libsrc/netcdf_convenience.c the function micreatex reads: > > if ((cmode & MI2_CREATE_V1) != 0) { > fd = nccreate(path, cmode); > } > else if (miget_cfg_bool(MICFG_FORCE_V2) || (cmode & MI2_CREATE_V2) > != 0) { > fd = hdf_create(path, cmode, opts_ptr); > } > else { > if (mi_nc_files == 0 && mi_h5_files != 0) { > /* Create an HDF5 file. */ > fd = hdf_create(path, cmode, opts_ptr); > } > else { > /* Create a NetCDF file. */ > fd = nccreate(path, cmode); > } > } > > > I propose changing the line "if (mi_nc_files == 0 && mi_h5_files != 0)" > to read " if (mi_nc_files == 0)" > > The reason is that currently the code will default to creating HDF5 > files only if a program has already opened an HDF5 file. The change > proposed would make it such that the library will only create CDF files > if a program has already opened a CDF file. This won't influence any of > the minc tools normally used on a day-to-day basis, but will change the > default output of file format converters that don't read any minc files > before creating an output file. > > I didn't put this in CVS yet as I don't know what your process is for > getting this kind of functionality change into the library. > > Cheers, > J > _______________________________________________ > MINC-development mailing list > MINC-development at bic.mni.mcgill.ca > http://www.bic.mni.mcgill.ca/mailman/listinfo/minc-development > From jharlap at bic.mni.mcgill.ca Wed May 31 11:41:53 2006 From: jharlap at bic.mni.mcgill.ca (Jonathan HARLAP) Date: Wed, 31 May 2006 11:41:53 -0400 Subject: [MINC-development] default file type (HDF5 vs NetCDF) In-Reply-To: References: Message-ID: <447DB941.6050501@bic.mni.mcgill.ca> I'd say that people who install MINC 2 probably should get MINC 2 files... But that's just my naive expectation that when I download, compile and install MINC 2 then when I run format conversions and processing tools they'd start using the MINC 2 format. So I'd vote to make the change. However - if others are opposed, then I suggest an alternate change: add a -2 option to dcm2mnc and rawtominc. J Robert VINCENT wrote: > Hi, > > I had coded it this way specifically to avoid having programs like > rawtominc default to MINC 2.0 format. My intent was that a user would have > to make the decision to change all of their files to MINC 2.0 format, and > then all subsequent tools would automatically honor this decision. But I > didn't want a user to get a MINC 2.0 file without knowing they'd asked for > it. > > If the general feeling is that MINC 2.0 is working for people, then I > don't object to this change. I just didn't want to force the new format > onto the world, especially in environments where MINC 2.0 format support > might be incomplete. > > -bert > > If people feel that > On Wed, 31 May 2006, Jonathan HARLAP wrote: > > >>Heylas, >> >>I know I've raised this before, but now that I understand what's going >>on a little better I'd like to propose a small change: >> >>In libsrc/netcdf_convenience.c the function micreatex reads: >> >> if ((cmode & MI2_CREATE_V1) != 0) { >> fd = nccreate(path, cmode); >> } >> else if (miget_cfg_bool(MICFG_FORCE_V2) || (cmode & MI2_CREATE_V2) >>!= 0) { >> fd = hdf_create(path, cmode, opts_ptr); >> } >> else { >> if (mi_nc_files == 0 && mi_h5_files != 0) { >> /* Create an HDF5 file. */ >> fd = hdf_create(path, cmode, opts_ptr); >> } >> else { >> /* Create a NetCDF file. */ >> fd = nccreate(path, cmode); >> } >> } >> >> >>I propose changing the line "if (mi_nc_files == 0 && mi_h5_files != 0)" >>to read " if (mi_nc_files == 0)" >> >>The reason is that currently the code will default to creating HDF5 >>files only if a program has already opened an HDF5 file. The change >>proposed would make it such that the library will only create CDF files >>if a program has already opened a CDF file. This won't influence any of >>the minc tools normally used on a day-to-day basis, but will change the >>default output of file format converters that don't read any minc files >>before creating an output file. >> >>I didn't put this in CVS yet as I don't know what your process is for >>getting this kind of functionality change into the library. >> >>Cheers, >>J >>_______________________________________________ >>MINC-development mailing list >>MINC-development at bic.mni.mcgill.ca >>http://www.bic.mni.mcgill.ca/mailman/listinfo/minc-development >> > > > _______________________________________________ > MINC-development mailing list > MINC-development at bic.mni.mcgill.ca > http://www.bic.mni.mcgill.ca/mailman/listinfo/minc-development