/*-
* 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.diffraction.powder;
import java.util.List;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.dawnsci.analysis.api.metadata.IDiffractionMetadata;
import org.junit.Assert;
import org.junit.Test;
import uk.ac.diamond.scisoft.analysis.roi.XAxis;
public class PixelSplittingIntegrationTest extends AbstractPixelIntegrationTestBase {
@Test
public void testPixelSplittingAzimuthal() {
IDataset data = getData();
if (data == null) {
Assert.fail("Could not load test data");
return;
}
IDiffractionMetadata meta = getDiffractionMetadata();
int[] shape = new int[]{meta.getDetector2DProperties().getPy(), meta.getDetector2DProperties().getPx()};
int binTest = AbstractPixelIntegration.calculateNumberOfBins(meta.getDetector2DProperties().getBeamCentreCoords(), shape);
Assert.assertEquals(binTest,1592);
PixelSplittingIntegration npsi = new PixelSplittingIntegration(meta, 1592);
//first pass
double firstTime = testWholeImageAzimuthal(data,npsi);
//second pass
double secondTime = testWholeImageAzimuthal(data,npsi);
if (firstTime < secondTime) {
Assert.fail("Whole image: second run should be faster due to caching, something odd is afoot");
}
npsi.setAzimuthalRange(new double[]{-180,-170});
//first pass
firstTime =testSectionImageAzimuthal(data,npsi);
//first pass
secondTime =testSectionImageAzimuthal(data,npsi);
if (firstTime < secondTime) {
Assert.fail("Sector: Second run should be faster due to caching, something odd is afoot");
}
npsi.setRadialRange(new double[]{1,5});
//first pass
firstTime =testSectionLimitedImageAzimuthal(data,npsi);
//second pass
secondTime =testSectionLimitedImageAzimuthal(data,npsi);
//probably should take a similar time
npsi.setRadialRange(null);
npsi.setAzimuthalRange(null);
Dataset mask = getMask(data.getShape());
npsi.setMask(mask);
firstTime =testMask(data,npsi);
secondTime =testMask(data,npsi);
}
@Test
public void testPixelSplittingRadial() {
IDataset data = getData();
if (data == null) {
Assert.fail("Could not load test data");
return;
}
IDiffractionMetadata meta = getDiffractionMetadata();
PixelSplittingIntegration npsi = new PixelSplittingIntegration(meta, 1592);
npsi.setAzimuthalIntegration(false);
//first pass
double firstTime = testWholeImageRadial(data,npsi);
//second pass
double secondTime = testWholeImageRadial(data,npsi);
if (firstTime < secondTime) {
Assert.fail("Whole image: second run should be faster due to caching, something odd is afoot");
}
npsi.setRadialRange(new double[]{1,5});
//first pass
firstTime =testLimitedRadial(data,npsi);
//first pass
secondTime =testLimitedRadial(data,npsi);
if (firstTime < secondTime) {
Assert.fail("Sector: Second run should be faster due to caching, something odd is afoot");
}
npsi.setAzimuthalRange(new double[]{-180,-170});
//first pass
firstTime =testSectorLimitedRadial(data,npsi);
//second pass
secondTime =testSectorLimitedRadial(data,npsi);
//probably should take a similar time
}
@Test
public void testPixelSplittingBinSetting() {
IDataset data = getData();
if (data == null) {
Assert.fail("Could not load test data");
return;
}
IDiffractionMetadata meta = getDiffractionMetadata();
PixelSplittingIntegration npsi = new PixelSplittingIntegration(meta);
testWholeImageAzimuthal(data,npsi);
npsi.setNumberOfBins(1000);
testWholeImageAzimuthal1000Bins(data,npsi);
}
@Test
public void testPixelSplittingAxis() {
IDataset data = getData();
if (data == null) {
Assert.fail("Could not load test data");
return;
}
IDiffractionMetadata meta = getDiffractionMetadata();
PixelSplittingIntegration npsi = new PixelSplittingIntegration(meta, 1592);
//2theta
npsi.setAxisType(XAxis.ANGLE);
List<Dataset> out = npsi.integrate(data);
npsi.setRadialRange(new double[]{10,30});
out = npsi.integrate(data);
Assert.assertEquals(30, out.get(0).getDouble(1591),0.00001);
npsi.setRadialRange(null);
//q
npsi.setAxisType(XAxis.Q);
out = npsi.integrate(data);
Assert.assertEquals(10.402591860873361, out.get(0).getDouble(1591),0.00001);
npsi.setRadialRange(new double[]{1,5});
out = npsi.integrate(data);
Assert.assertEquals(5, out.get(0).getDouble(1591),0.00001);
npsi.setRadialRange(null);
//d-spacing
npsi.setAxisType(XAxis.RESOLUTION);
out = npsi.integrate(data);
Assert.assertEquals(0.6040019056031748, out.get(0).getDouble(1591),0.00001);
npsi.setRadialRange(new double[]{0.6,4});
out = npsi.integrate(data);
Assert.assertEquals(0.6, out.get(0).getDouble(1591),0.00001);
npsi.setRadialRange(null);
//pixel
npsi.setAxisType(XAxis.PIXEL);
out = npsi.integrate(data);
Assert.assertEquals(1591.823246256255, out.get(0).getDouble(1591),0.00001);
npsi.setRadialRange(new double[]{100,300});
out = npsi.integrate(data);
Assert.assertEquals(300, out.get(0).getDouble(1591),0.00001);
}
private double testWholeImageAzimuthal(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("pixel splitting (full) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(356896.1287301564, max,0.00001);
Assert.assertEquals(136.58182845762153, min,0.00001);
Assert.assertEquals(10.402591860873361, maxq,0.00001);
Assert.assertEquals(0.007293853017842496, minq,0.00001);
return after-before;
}
private double testSectionImageAzimuthal(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("pixel splitting (section) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(336830.76975107513, max,0.00001);
Assert.assertEquals(0, min,0.00001);
Assert.assertEquals(10.402591860873361, maxq,0.00001);
Assert.assertEquals(0.007293853017842496, minq,0.00001);
return after-before;
}
private double testSectionLimitedImageAzimuthal(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("pixel splitting (section, limited q) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(370268.363719988, max,0.00001);
Assert.assertEquals(834.8830331973187, min,0.00001);
Assert.assertEquals(5, maxq,0.00001);
Assert.assertEquals(1, minq,0.00001);
return after-before;
}
private double testWholeImageRadial(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("pixel splitting (radial full) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(4003.5619624141973, max,0.00001);
Assert.assertEquals(2004.8229765125104, min,0.00001);
Assert.assertEquals(179.86865947533707, maxq,0.00001);
Assert.assertEquals(-179.88694041486792, minq,0.00001);
return after-before;
}
private double testLimitedRadial(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("pixel splitting (radial limited) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(5346.04087202132, max,0.00001);
Assert.assertEquals(3801.9952775754186, min,0.00001);
Assert.assertEquals(179.86865947533707, maxq,0.00001);
Assert.assertEquals(-179.88694041486792, minq,0.00001);
return after-before;
}
private double testSectorLimitedRadial(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("pixel splitting (radial limited sector) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(5488.909329548431, max,0.00001);
Assert.assertEquals(3902.7255524746024, min,0.00001);
Assert.assertEquals(-170, maxq,0.00001);
Assert.assertEquals(-180, minq,0.00001);
return after-before;
}
private double testMask(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("Non pixel splitting (radial limited sector) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(360487.4588376416, max,0.00001);
Assert.assertEquals(379.16319775495685, min,0.00001);
Assert.assertEquals(9.45343800073416, maxq,0.00001);
Assert.assertEquals(1.5247317269098923, minq,0.00001);
return after-before;
}
private double testWholeImageAzimuthal1000Bins(IDataset data, AbstractPixelIntegration integrator) {
long before = System.currentTimeMillis();
List<Dataset> out = integrator.integrate(data);
long after = System.currentTimeMillis();
System.out.println("Non pixel splitting (1000 bins) in "+(after-before));
if (out.size() != 2) {
Assert.fail("Incorrect number of datasets returned");
}
if (out.get(0).getSize() != 1000) {
Assert.fail("Incorrect number of points");
}
double max = out.get(1).max().doubleValue();
double min = out.get(1).min().doubleValue();
double maxq = out.get(0).max().doubleValue();
double minq = out.get(0).min().doubleValue();
Assert.assertEquals(255619.6554727802, max,0.00001);
Assert.assertEquals(142.85434233832973, min,0.00001);
Assert.assertEquals(10.400657851941666, maxq,0.00001);
Assert.assertEquals(0.009227861949536547, minq,0.00001);
return after-before;
}
}