/*-
* Copyright (c) 2015 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.functions;
import org.eclipse.january.asserts.TestUtils;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.junit.Assert;
import org.junit.Test;
public class VoigtTest {
private static final double ABS_TOL = 1e-7;
private static final double REL_TOL = 1e-15;
@Test
public void testFunction() {
Voigt f = new Voigt();
Assert.assertEquals(4, f.getNoOfParameters());
f.setParameterValues(23., 2., 1.2, 2.3);
Assert.assertArrayEquals(new double[] {23., 2., 1.2, 2.3}, f.getParameterValues(), ABS_TOL);
double h = f.getHeight();
Assert.assertEquals(h, f.val(23.), ABS_TOL);
// check half-maximum intersections
h *= 0.5;
double dx = 1.77;
Assert.assertTrue(f.val(23. - dx - 0.01) < h && f.val(23. - dx) > h);
Assert.assertTrue(f.val(23. + dx) > h && f.val(23. + dx + 0.01) < h);
// check area
Dataset x = DatasetFactory.createLinearSpace(-20+23, 20+23, 401, Dataset.FLOAT64);
Dataset v = f.calculateValues(x);
double s = ((Number) v.sum()).doubleValue() * Math.abs(x.getDouble(0) - x.getDouble(1));
Assert.assertEquals(1.2, s, 1e-1);
}
@Test
public void testExtremes() {
Dataset x = DatasetFactory.createLinearSpace(-20+23, 20+23, 401, Dataset.FLOAT64);
Voigt v = new Voigt();
v.setParameterValues(23., 2., 1.2, 0);
Dataset pl = v.calculateValues(x);
v.setParameterValues(23., 0, 1.2, 2.3);
Dataset pg = v.calculateValues(x);
Lorentzian lf = new Lorentzian();
lf.setParameterValues(23., 2., 1.2);
Dataset l = lf.calculateValues(x);
TestUtils.assertDatasetEquals(l, pl, REL_TOL, ABS_TOL);
Gaussian gf = new Gaussian();
gf.setParameterValues(23., 2.3, 1.2);
Dataset g = gf.calculateValues(x);
TestUtils.assertDatasetEquals(g, pg, REL_TOL, ABS_TOL);
}
}