/*- * Copyright 2016 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.processing.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.eclipse.dawnsci.analysis.api.processing.OperationRank; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceFromSeriesMetadata; import org.eclipse.dawnsci.analysis.dataset.slicer.SourceInformation; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.DatasetUtils; import org.eclipse.january.dataset.DoubleDataset; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.IndexIterator; import org.eclipse.january.metadata.MaskMetadata; import org.junit.Test; import uk.ac.diamond.scisoft.analysis.diffraction.powder.PixelIntegrationUtils; import uk.ac.diamond.scisoft.analysis.io.DiffractionMetadata; import uk.ac.diamond.scisoft.analysis.processing.operations.mask.CoordinateMaskModel; import uk.ac.diamond.scisoft.analysis.processing.operations.mask.CoordinateMaskOperation; import uk.ac.diamond.scisoft.analysis.processing.operations.mask.CoordinateMaskOperation.MaskAxis; import uk.ac.diamond.scisoft.analysis.processing.operations.twod.DiffractionMetadataImportModel; import uk.ac.diamond.scisoft.analysis.processing.operations.twod.DiffractionMetadataImportOperation; public class CoordinateMaskingTest { @Test public void testProcessOutside() { final double lowerLimit = 0.1, upperLimit = 25.0; Dataset data = DatasetFactory.zeros(DoubleDataset.class, 2048, 2048); data.setMetadata(new SliceFromSeriesMetadata(new SourceInformation("/dev/null", "", null))); IDataset[] iDSArray = setDiffraction(data); Dataset qData = DatasetUtils.convertToDataset(iDSArray[0]), intermediateData = DatasetUtils.convertToDataset(iDSArray[1]); CoordinateMaskModel model = new CoordinateMaskModel(); model.setCoordinateType(MaskAxis.Q); model.setCoordinateRange(new double[] {lowerLimit, upperLimit}); Dataset mask = DatasetUtils.convertToDataset(getMask(intermediateData, model)); model.setMaskedInside(true); Dataset maskInside = DatasetUtils.convertToDataset(getMask(intermediateData, model)); // Test the masks against the q array IndexIterator it = qData.getIterator(); while (it.hasNext()) { double q = qData.getElementDoubleAbs(it.index); assertEquals("Q value masking incorrect, inside mask. q = " + q, !(q<upperLimit && q>lowerLimit), (boolean) maskInside.getObjectAbs(it.index)); assertEquals("Q value masking incorrect, outside mask. q = " + q, !(q>upperLimit || q<lowerLimit), (boolean) mask.getObjectAbs(it.index)); } } @Test public void testGetId() { assertEquals("Coordinate masking Operation ID String not as expected", "uk.ac.diamond.scisoft.analysis.processing.operations.CoordinateMaskOperation", new CoordinateMaskOperation().getId()); } @Test public void testGetInputRank() { assertEquals("Coordinate masking Operation input rank not as expected:", OperationRank.TWO, new CoordinateMaskOperation().getInputRank()); } @Test public void testGetOutputRank() { assertEquals("Coordinate masking Operation output rank not as expected:", OperationRank.TWO, new CoordinateMaskOperation().getOutputRank()); } @Test public void testMetadatalessPixelMasking() { final double lowerLimit = 400, upperLimit = 800; final int size = 2048, halfSize = size/2; double sqrt2 = 1.4142135623730951; Dataset data = DatasetFactory.zeros(DoubleDataset.class, size, size); data.setMetadata(new SliceFromSeriesMetadata(new SourceInformation("/dev/null", "", null))); CoordinateMaskModel model = new CoordinateMaskModel(); model.setCoordinateType(MaskAxis.PIXEL); model.setCoordinateRange(new double[] {lowerLimit, upperLimit}); model.setMaskedInside(true); Dataset ringMask = DatasetUtils.convertToDataset(getMask(data, model)); // Test some points assertTrue("Central pixel incorrectly masked", getMaskRelativeToCentre(ringMask, 0, 0, halfSize)); assertTrue("Inner edge pixel incorrectly masked", getMaskRelativeToCentre(ringMask, (int) lowerLimit-1, 0, halfSize)); assertTrue("Inner edge pixel incorrectly masked", getMaskRelativeToCentre(ringMask, (int) (lowerLimit/sqrt2), (int) (lowerLimit/sqrt2), halfSize)); assertTrue("Inner edge pixel incorrectly unmasked", !getMaskRelativeToCentre(ringMask, (int) lowerLimit+1, 0, halfSize)); assertTrue("Inner edge pixel incorrectly unmasked", !getMaskRelativeToCentre(ringMask, (int) (lowerLimit/sqrt2) + 1, (int) (lowerLimit/sqrt2) + 1, halfSize)); assertTrue("Outer edge pixel incorrectly masked", !getMaskRelativeToCentre(ringMask, (int) upperLimit-1, 0, halfSize)); assertTrue("Outer edge pixel incorrectly masked", !getMaskRelativeToCentre(ringMask, (int) (upperLimit/sqrt2), (int) (upperLimit/sqrt2), halfSize)); assertTrue("Outer edge pixel incorrectly unmasked", getMaskRelativeToCentre(ringMask, (int) (upperLimit+1), 0, halfSize)); assertTrue("Outer edge pixel incorrectly unmasked", getMaskRelativeToCentre(ringMask, (int) (upperLimit/sqrt2 + 1), (int) (upperLimit/sqrt2 + 1), halfSize)); } private boolean getMaskRelativeToCentre(IDataset mask, int iCentre, int jCentre, int halfsize) { return mask.getBoolean(iCentre + halfsize, jCentre + halfsize); } // sets diffraction metadata, gets the q array (element 0) and the data to pass on (element 1) private IDataset[] setDiffraction(Dataset data) { // Add the XPDF detector calibration to the data DiffractionMetadataImportOperation dMIO = new DiffractionMetadataImportOperation(); DiffractionMetadataImportModel dMIM = new DiffractionMetadataImportModel(); dMIM.setFilePath("/dls/science/groups/das/ExampleData/i15-1/integration/CeO2_NIST_8s_19slices_averaged_fixedE_calibration.nxs"); dMIO.setModel(dMIM); IDataset intermediateData = dMIO.execute(data, null).getData(); // get the diffraction metadata produced DiffractionMetadata dM; try { dM = intermediateData.getMetadata(DiffractionMetadata.class).get(0); } catch (Exception e) { fail("Diffraction metadata not found"); return null; } Dataset q = PixelIntegrationUtils.generateQArray(dM); return new IDataset[] {q, intermediateData}; } private IDataset getMask(IDataset intermediateData, CoordinateMaskModel model) { CoordinateMaskOperation op = new CoordinateMaskOperation(); op.setModel(model); IDataset maskedData = op.execute(intermediateData, null).getData(); // Get the mask produced MaskMetadata maskMD; try { maskMD = maskedData.getMetadata(MaskMetadata.class).get(0); } catch (Exception e) { fail("Mask metadata not found."); return null; } return maskMD.getMask(); } }