|
| 1 | +#!/usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
| 4 | +from nipype.testing import (assert_equal, example_data) |
| 5 | +from nipype.algorithms.metrics import ErrorMap |
| 6 | +import nibabel as nib |
| 7 | +import numpy as np |
| 8 | +from tempfile import mkdtemp |
| 9 | +import os |
| 10 | + |
| 11 | +def test_errormap(): |
| 12 | + |
| 13 | + tempdir = mkdtemp() |
| 14 | + # Single-Spectual |
| 15 | + # Make two fake 2*2*2 voxel volumes |
| 16 | + volume1 = np.array([[[2.0, 8.0], [1.0, 2.0]], [[1.0, 9.0], [0.0, 3.0]]]) # John von Neumann's birthday |
| 17 | + volume2 = np.array([[[0.0, 7.0], [2.0, 3.0]], [[1.0, 9.0], [1.0, 2.0]]]) # Alan Turing's birthday |
| 18 | + mask = np.array([[[1, 0], [0, 1]], [[1, 0], [0, 1]]]) |
| 19 | + |
| 20 | + img1 = nib.Nifti1Image(volume1, np.eye(4)) |
| 21 | + img2 = nib.Nifti1Image(volume2, np.eye(4)) |
| 22 | + maskimg = nib.Nifti1Image(mask, np.eye(4)) |
| 23 | + |
| 24 | + nib.save(img1, os.path.join(tempdir, 'von.nii.gz')) |
| 25 | + nib.save(img2, os.path.join(tempdir, 'alan.nii.gz')) |
| 26 | + nib.save(maskimg, os.path.join(tempdir, 'mask.nii.gz')) |
| 27 | + |
| 28 | + |
| 29 | + # Default metric |
| 30 | + errmap = ErrorMap() |
| 31 | + errmap.inputs.in_tst = os.path.join(tempdir, 'von.nii.gz') |
| 32 | + errmap.inputs.in_ref = os.path.join(tempdir, 'alan.nii.gz') |
| 33 | + errmap.out_map = os.path.join(tempdir, 'out_map.nii.gz') |
| 34 | + result = errmap.run() |
| 35 | + yield assert_equal, result.outputs.distance, 1.125 |
| 36 | + |
| 37 | + # Square metric |
| 38 | + errmap.inputs.metric = 'sqeuclidean' |
| 39 | + result = errmap.run() |
| 40 | + yield assert_equal, result.outputs.distance, 1.125 |
| 41 | + |
| 42 | + # Linear metric |
| 43 | + errmap.inputs.metric = 'euclidean' |
| 44 | + result = errmap.run() |
| 45 | + yield assert_equal, result.outputs.distance, 0.875 |
| 46 | + |
| 47 | + # Masked |
| 48 | + errmap.inputs.mask = os.path.join(tempdir, 'mask.nii.gz') |
| 49 | + result = errmap.run() |
| 50 | + yield assert_equal, result.outputs.distance, 1.0 |
| 51 | + |
| 52 | + ## Multi-Spectual |
| 53 | + volume3 = np.array([[[1.0, 6.0], [0.0, 3.0]], [[1.0, 9.0], [3.0, 6.0]]]) # Raymond Vahan Damadian's birthday |
| 54 | + |
| 55 | + msvolume1 = np.zeros(shape=(2,2,2,2)) |
| 56 | + msvolume1[:,:,:,0] = volume1 |
| 57 | + msvolume1[:,:,:,1] = volume3 |
| 58 | + msimg1 = nib.Nifti1Image(msvolume1, np.eye(4)) |
| 59 | + |
| 60 | + msvolume2 = np.zeros(shape=(2,2,2,2)) |
| 61 | + msvolume2[:,:,:,0] = volume3 |
| 62 | + msvolume2[:,:,:,1] = volume1 |
| 63 | + msimg2 = nib.Nifti1Image(msvolume2, np.eye(4)) |
| 64 | + |
| 65 | + nib.save(msimg1, os.path.join(tempdir, 'von-ray.nii.gz')) |
| 66 | + nib.save(msimg2, os.path.join(tempdir, 'alan-ray.nii.gz')) |
| 67 | + |
| 68 | + errmap.inputs.in_tst = os.path.join(tempdir, 'von-ray.nii.gz') |
| 69 | + errmap.inputs.in_ref = os.path.join(tempdir, 'alan-ray.nii.gz') |
| 70 | + errmap.inputs.metric = 'sqeuclidean' |
| 71 | + result = errmap.run() |
| 72 | + yield assert_equal, result.outputs.distance, 5.5 |
| 73 | + |
| 74 | + errmap.inputs.metric = 'euclidean' |
| 75 | + result = errmap.run() |
| 76 | + yield assert_equal, result.outputs.distance, np.float32(1.25 * (2**0.5)) |
0 commit comments