/*
* Copyright (c) 2012 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package uk.ac.diamond.scisoft.analysis.io;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.File;
import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DatasetUtils;
import org.eclipse.january.dataset.SliceND;
import org.eclipse.january.dataset.StringDataset;
import org.junit.Before;
import org.junit.Test;
import uk.ac.diamond.scisoft.analysis.IOTestUtils;
public class ImageStackLoaderTest {
static final int sizex = 10, sizey = 20, range = sizex * sizey;
static final double abserr = 2.0; // maximum permitted absolute error (remember that JPEGs are lossy)
@Before
public void setUp() {
}
@SuppressWarnings("unused")
@Test
public void testInvalidArguments() throws Exception {
try {
new ImageStackLoader(null, (String[]) null);
fail();
} catch (IllegalArgumentException ex) {
}
String testScratchDirectoryName = IOTestUtils.setUpTest(ImageStackLoaderTest.class, "testInvalid", true);
int[] multipliers= new int[]{2,3};
String[] imageFilenames = makeFiles(testScratchDirectoryName, multipliers);
int[] dimensions = new int[] { imageFilenames.length };
ImageStackLoader loader = new ImageStackLoader(dimensions, imageFilenames);
int[] step = null;
int[] shape = loader.getShape();
int[] stop = null;
int[] start = shape.clone();
Dataset d = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertEquals(0, d.getSize());
}
private void makeFile(String filePath, int multiplier) throws ScanFileHolderException {
Dataset data;
DataHolder dha = new DataHolder();
data = DatasetUtils.eye(sizex, sizey, 0, Dataset.INT16);
data.setShape(sizex, sizey);
data.imultiply(multiplier);
dha.addDataset("testing data", data);
new TIFFImageSaver(filePath,16,false).saveFile(dha);
}
@Test
public void testSingleFile() throws Exception {
String testScratchDirectoryName = IOTestUtils.setUpTest(ImageStackLoaderTest.class, "testSingleFile", true);
int[] multipliers= new int[]{7};
String[] imageFilenames = makeFiles(testScratchDirectoryName, multipliers);
int[] dimensions = new int[] { };
StringDataset strings = DatasetFactory.createFromObject(StringDataset.class, imageFilenames, dimensions);
strings.squeeze(true);
ImageStackLoader loader = new ImageStackLoader(strings, null);
assertEquals(Dataset.INT32, loader.getDType());
int[] shape = loader.getShape();
assertArrayEquals(new int[] { sizex, sizey }, shape);
//extract each image
for( int i=0; i< multipliers.length;i++)
{
int[] step = null;
int[] stop = new int[] { sizex, sizey };
int[] start = new int[] { 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { sizex, sizey }, dataset.getShape());
int int2 = dataset.getInt(sizex-1, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[i], int2);
}
//extract slice of bottom row from images
for( int i=0; i< multipliers.length;i++)
{
int[] step = null;
int[] stop = new int[] { sizex, sizey };
int[] start = new int[] { sizex-1, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { 1, sizey }, dataset.getShape());
int int2 = dataset.getInt(0, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[i], int2);
}
}
@Test
public void test1DFiles() throws Exception {
String testScratchDirectoryName = IOTestUtils.setUpTest(ImageStackLoaderTest.class, "test1DFiles", true);
int[] multipliers= new int[]{2,3};
String[] imageFilenames = makeFiles(testScratchDirectoryName, multipliers);
int[] dimensions = new int[] { imageFilenames.length };
ImageStackLoader loader = new ImageStackLoader(dimensions, imageFilenames);
assertEquals(Dataset.INT32, loader.getDType());
int[] shape = loader.getShape();
assertArrayEquals(new int[] { 2, sizex, sizey }, shape);
//extract each image
for( int i=0; i< multipliers.length;i++)
{
int[] step = null;
int[] stop = new int[] { i+1, sizex, sizey };
int[] start = new int[] { i, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { 1, sizex, sizey }, dataset.getShape());
int int2 = dataset.getInt(0, sizex-1, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[i], int2);
}
//extract slice of bottom row from images
for( int i=0; i< multipliers.length;i++)
{
int[] step = null;
int[] stop = new int[] { i+1, sizex, sizey };
int[] start = new int[] { i, sizex-1, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { 1, 1, sizey }, dataset.getShape());
int int2 = dataset.getInt(0, 0, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[i], int2);
}
}
@Test
public void test1DFilesSliceAcrossFiles() throws Exception {
String testScratchDirectoryName = IOTestUtils.setUpTest(ImageStackLoaderTest.class, "test1DFilesSliceAcrossFiles", true);
int[] multipliers= new int[]{2,3,4,5,6};
String[] imageFilenames = makeFiles(testScratchDirectoryName, multipliers);
int[] dimensions = new int[] { imageFilenames.length };
ImageStackLoader loader = new ImageStackLoader(dimensions, imageFilenames);
assertEquals(Dataset.INT32, loader.getDType());
int[] shape = loader.getShape();
assertArrayEquals(new int[] { multipliers.length, sizex, sizey }, shape);
//extract all data
{
int[] step = null;
int[] stop = new int[] { multipliers.length, sizex, sizey };
int[] start = new int[] { 0, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(stop, dataset.getShape());
int int2 = dataset.getInt(0, sizex-1, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[0], int2);
int int3 = dataset.getInt(multipliers.length-1, sizex-1, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[multipliers.length-1], int3);
}
//extract all data - step 2 in y
{
int[] step = new int[] { 1, 1, 2 };
int[] stop = new int[] { multipliers.length, sizex, sizey };
int[] start = new int[] { 0, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { multipliers.length, sizex, sizey/2 }, dataset.getShape());
int int2 = dataset.getInt(0, sizex-2, (sizex-1)/2); //eye sets data along diagonal
assertEquals(multipliers[0], int2);
int int3 = dataset.getInt( multipliers.length-1, sizex-2, (sizex-1)/2); //eye sets data along diagonal
assertEquals(multipliers[multipliers.length-1], int3);
}
//extract all data - step 2 in x
{
int[] step = new int[] { 1, 2, 1 };
int[] stop = new int[] { multipliers.length, sizex, sizey };
int[] start = new int[] { 0, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { multipliers.length, sizex/2, sizey }, dataset.getShape());
int int2 = dataset.getInt(0, sizex/2-1, sizex-2); //eye sets data along diagonal
assertEquals(multipliers[0], int2);
int int3 = dataset.getInt(multipliers.length-1,sizex/2-1, sizex-2); //eye sets data along diagonal
assertEquals(multipliers[multipliers.length-1], int3);
}
//extract sizex, sizey point from each
{
int[] step = null;
int[] stop = new int[] { multipliers.length, sizex, sizex };
int[] start = new int[] { 0, sizex-1, sizex-1 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { multipliers.length, 1, 1 }, dataset.getShape());
for( int i=0; i< multipliers.length;i++){
int int2 = dataset.getInt(i, 0, 0); //eye sets data along diagonal
assertEquals(multipliers[i], int2);
}
}
}
String [] makeFiles(String testScratchDirectoryName, int[] multipliers) throws ScanFileHolderException{
String [] filePaths = new String[multipliers.length];
for( int i =0 ; i< multipliers.length;i++){
filePaths[i] = testScratchDirectoryName + File.separatorChar + "test" + i + ".tif";
makeFile(filePaths[i], multipliers[i]);
}
return filePaths;
}
@Test
public void test2DFiles() throws Exception {
String testScratchDirectoryName = IOTestUtils.setUpTest(ImageStackLoaderTest.class, "test2DFiles", true);
final int firstDim=2, secondDim=3;
int[] multipliers= new int[]{1,2,3,4,5,6};
String[] imageFilenames = makeFiles(testScratchDirectoryName, multipliers);
int[] dimensions = new int[] { firstDim,secondDim };
ImageStackLoader loader = new ImageStackLoader(dimensions, imageFilenames);
assertEquals(Dataset.INT32, loader.getDType());
int[] shape = loader.getShape();
assertArrayEquals(new int[] { firstDim, secondDim, sizex, sizey }, shape);
//extract each images
for( int i=0; i< firstDim; i++)
{
for( int j=0; j< secondDim; j++){
int[] step = null;
int[] stop = new int[] { i+1, j+1, sizex, sizey };
int[] start = new int[] { i, j, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { 1, 1, sizex, sizey }, dataset.getShape());
int int2 = dataset.getInt(0, 0,sizex-1, sizex-1); //eye sets data along diagonal
assertEquals("Check value for image i:" + i + " j:" +j,multipliers[i*3+j], int2);
}
}
//extract slice of bottom row from images
for( int i=0; i< firstDim; i++)
{
for( int j=0; j< secondDim; j++){
int[] step = null;
int[] stop = new int[] { i+1, j+1, sizex, sizey };
int[] start = new int[] { i, j, sizex-1, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { 1, 1, 1, sizey }, dataset.getShape());
int int2 = dataset.getInt(0, 0, 0, sizex-1); //eye sets data along diagonal
assertEquals("Check value for image i:" + i + " j:" +j,multipliers[i*3+j], int2);
}
}
//extract all data
{
int[] step = null;
int[] stop = new int[] { firstDim, secondDim, sizex, sizey };
int[] start = new int[] { 0, 0, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(stop, dataset.getShape());
int int2 = dataset.getInt( 0, 0,sizex-1, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[0], int2);
int int3 = dataset.getInt( firstDim-1, secondDim-1,sizex-1, sizex-1); //eye sets data along diagonal
assertEquals(multipliers[multipliers.length-1], int3);
}
//extract all data - step 2 in y
{
int[] step = new int[] { 1, 1, 1, 2 };
int[] stop = new int[] { firstDim, secondDim, sizex, sizey };
int[] start = new int[] { 0, 0, 0, 0 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] { firstDim, secondDim, sizex, sizey/2 }, dataset.getShape());
int int2 = dataset.getInt( 0, 0,sizex-2, (sizex-1)/2); //eye sets data along diagonal
assertEquals(multipliers[0], int2);
int int3 = dataset.getInt( firstDim-1, secondDim-1,sizex-2, (sizex-1)/2); //eye sets data along diagonal
assertEquals(multipliers[multipliers.length-1], int3);
}
//extract sizex, sizey point from each
{
int[] step = null;
int[] stop = new int[] {firstDim, secondDim, sizex, sizex };
int[] start = new int[] { 0,0, sizex-1, sizex-1 };
Dataset dataset = loader.getDataset(null, new SliceND(shape, start, stop, step));
assertArrayEquals(new int[] {firstDim, secondDim, 1, 1 }, dataset.getShape());
for( int i=0; i< firstDim; i++)
{
for( int j=0; j< secondDim; j++){
int int2 = dataset.getInt( i,j,0, 0); //eye sets data along diagonal
assertEquals(multipliers[i*secondDim +j], int2);
}
}
}
}
}