/*
* 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.fitting;
import java.util.List;
import java.util.Map;
import org.eclipse.january.dataset.DoubleDataset;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import uk.ac.diamond.scisoft.analysis.fitting.functions.CompositeFunction;
import uk.ac.diamond.scisoft.analysis.fitting.functions.Gaussian;
import uk.ac.diamond.scisoft.analysis.fitting.functions.Lorentzian;
import uk.ac.diamond.scisoft.analysis.fitting.functions.PearsonVII;
import uk.ac.diamond.scisoft.analysis.fitting.functions.PseudoVoigt;
import uk.ac.diamond.scisoft.analysis.optimize.IOptimizer;
public abstract class AbstractFittingTestBase {
protected static final String PSEUDO_VOIGT = "PseudoVoigt";
protected static final String PEARSON_VII = "PearsonVII";
protected static final String LORENTZIAN = "Lorentzian";
protected static final String GAUSSIAN = "Gaussian";
static DoubleDataset gaussian;
static DoubleDataset lorentzian;
static DoubleDataset pearsonVII;
static DoubleDataset pseudoVoigt;
static DoubleDataset xAxis;
static double accuracy;
static int smoothing;
static int numPeaks = -1;
static double pos;
static double fwhm;
static double area;
static double delta;
static List<CompositeFunction> fittedGaussian;
static List<CompositeFunction> fittedLorentzian;
static List<CompositeFunction> fittedPearsonVII;
static List<CompositeFunction> fittedPseudoVoigt;
static Map<String, int[]> deltaFactor;
abstract public IOptimizer createOptimizer();
@Before
public void doFitting() {
fittedGaussian = Generic1DFitter.fitPeakFunctions(xAxis, gaussian, Gaussian.class,
createOptimizer(), smoothing, numPeaks);
fittedLorentzian = Generic1DFitter.fitPeakFunctions(xAxis, lorentzian, Lorentzian.class,
createOptimizer(), smoothing, numPeaks);
fittedPearsonVII = Generic1DFitter.fitPeakFunctions(xAxis, pearsonVII, PearsonVII.class,
createOptimizer(), smoothing, numPeaks);
fittedPseudoVoigt = Generic1DFitter.fitPeakFunctions(xAxis, pseudoVoigt, PseudoVoigt.class,
createOptimizer(), smoothing, numPeaks);
}
@BeforeClass
public static void setupTestEnvironment() {
gaussian = Generic1DDatasetCreator.createGaussianDataset();
lorentzian = Generic1DDatasetCreator.createLorentzianDataset();
pearsonVII = Generic1DDatasetCreator.createPearsonVII();
pseudoVoigt = Generic1DDatasetCreator.createPseudoVoigt();
xAxis = Generic1DDatasetCreator.xAxis;
accuracy = Generic1DDatasetCreator.accuracy;
smoothing = Generic1DDatasetCreator.smoothing;
numPeaks = Generic1DDatasetCreator.numPeaks;
pos = Generic1DDatasetCreator.peakPos;
fwhm = Generic1DDatasetCreator.defaultFWHM;
area = Generic1DDatasetCreator.defaultArea;
delta = Generic1DDatasetCreator.delta;
}
@Test
public void testGaussianNumberOfPeaksFound() {
Assert.assertEquals(1, fittedGaussian.size());
}
@Test
public void testGaussianPeakPos() {
checkClose(GAUSSIAN + " pos", pos, fittedGaussian.get(0).getPeak(0).getPosition(), delta);
}
@Test
public void testGaussianFWHM() {
checkClose(GAUSSIAN + " fwhm", fwhm, fittedGaussian.get(0).getPeak(0).getFWHM(), deltaFactor.get(GAUSSIAN)[0]*delta);
}
@Test
public void testGaussianArea() {
checkClose(GAUSSIAN + " area", area, fittedGaussian.get(0).getPeak(0).getArea(), deltaFactor.get(GAUSSIAN)[1]*delta);
}
@Test
public void testLorentzianNumberOfPeaksFound() {
Assert.assertEquals(1, fittedLorentzian.size());
}
@Test
public void testLorentzianPeakPos() {
checkClose(LORENTZIAN + " pos", pos, fittedLorentzian.get(0).getPeak(0).getPosition(), delta);
}
@Test
public void testLorentzianFWHM() {
checkClose(LORENTZIAN + " fwhm", fwhm, fittedLorentzian.get(0).getPeak(0).getFWHM(), deltaFactor.get(LORENTZIAN)[0]*delta);
}
@Test
public void testLorentzianArea() {
checkClose(LORENTZIAN + " area", area, fittedLorentzian.get(0).getPeak(0).getArea(), deltaFactor.get(LORENTZIAN)[1]*delta);
}
@Test
public void testPearsonVIINumberOfPeaksFound() {
Assert.assertEquals(1, fittedPearsonVII.size());
}
@Test
public void testPearsonVIIPeakPos() {
checkClose(PEARSON_VII + " pos", pos, fittedPearsonVII.get(0).getPeak(0).getPosition(), delta);
}
@Test
public void testPearsonVIIFWHM() {
checkClose(PEARSON_VII + " fwhm", fwhm, fittedPearsonVII.get(0).getPeak(0).getFWHM(), deltaFactor.get(PEARSON_VII)[0]*delta);
}
@Test
public void testPearsonVIIArea() {
checkClose(PEARSON_VII + " area", area, fittedPearsonVII.get(0).getPeak(0).getArea(), deltaFactor.get(PEARSON_VII)[1]*delta);
}
@Test
public void testPseudoVoigtNumberOfPeaksFound() {
Assert.assertEquals(1, fittedPseudoVoigt.size());
}
@Test
public void testPseudoVoigtPeakPos() {
checkClose(PSEUDO_VOIGT + " pos", pos, fittedPseudoVoigt.get(0).getPeak(0).getPosition(), delta);
}
@Test
public void testPseudoVoigtFWHM() {
checkClose(PSEUDO_VOIGT + " fwhm", fwhm, fittedPseudoVoigt.get(0).getPeak(0).getFWHM(), deltaFactor.get(PSEUDO_VOIGT)[0]*delta);
}
@Test
public void testPseudoVoigtArea() {
checkClose(PSEUDO_VOIGT + " area", area, fittedPseudoVoigt.get(0).getPeak(0).getArea(), deltaFactor.get(PSEUDO_VOIGT)[1]*delta);
}
boolean verbose = true;
public void checkClose(String msg, double expected, double calculated, double delta) {
if (verbose)
System.out.printf("%s: %.1f%%\n", msg, 100*(expected - calculated)/delta);
Assert.assertEquals(expected, calculated, delta);
}
}