package uk.ac.diamond.scisoft.analysis.peakfinding.peakfinders;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.dawnsci.analysis.api.peakfinding.IPeakFinder;
import org.eclipse.dawnsci.analysis.api.peakfinding.IPeakFinderParameter;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DoubleDataset;
import org.junit.Assert;
import org.junit.Test;
/**
* //TODO: stress tests on widths
*
* @author Dean P. Ottewell
*
*/
public class WaveletTransformPeakFindsTest {
// Example Data Tests
@Test
public void exampleDataTest(){
WaveletTransformPeakFinds wave = new WaveletTransformPeakFinds();
ExamplePeakData peaks = new ExamplePeakData();
DoubleDataset xData = (DoubleDataset) peaks.getxData();
DoubleDataset yData = (DoubleDataset) peaks.getyData();
TreeMap<Integer, Double> foundPeaks = (TreeMap<Integer, Double>) wave.findPeaks(xData, yData, null);
List<Double> expectedPeaks = peaks.expectedPeakValues();
//Check gets similar amount of peaks first - Degree of size might detect couple extra peaks
assertEquals(expectedPeaks.size(), foundPeaks.size(), 3);
//Expects the peaks to be arrange from the first to last one
//TODO: difficulties in a assuming complete matches...
// int pos = 0;
// for(Entry<Integer, Double> peak : foundPeaks.entrySet()){
// if (pos < expectedPeaks.size())
// assertEquals(expectedPeaks.get(pos++), peak.getKey(), 2);
// }
//
}
@Test
public void multipleWidthGeneralParamChangingTest(){
WaveletTransformPeakFinds wave = new WaveletTransformPeakFinds();
ExamplePeakData peaks = new ExamplePeakData();
DoubleDataset xData = (DoubleDataset) peaks.getxData();
DoubleDataset yData = (DoubleDataset) peaks.getyData();
//Generally expecting some difference between widths.
//It should decrease with significant higher numbers
double lastPeakSz = 1000;
int widthRange = 40;
int faliureCount = 0;
for (int width = 1; width < widthRange+1; width+=10){
wave.setWidthParam(width);
TreeMap<Integer, Double> foundPeaks = (TreeMap<Integer, Double>) wave.findPeaks(xData, yData, null);
//assertTrue(lastPeakSz > foundPeaks.size());
faliureCount++;
lastPeakSz = foundPeaks.size();
}
//Generally
Assert.assertTrue(faliureCount < 5);
}
@Test
public void nameCheck() {
IPeakFinder cwt = new WaveletTransformPeakFinds();
assertEquals("WaveletTransformPeaks", cwt.getName());
}
@Test
public void parametersCheck() throws Exception {
//width/window for wavelet convolve
IPeakFinder cwt = new WaveletTransformPeakFinds();
Map<String, IPeakFinderParameter> paramSet = cwt.getParameters();
//Size 1 for peaks
Assert.assertEquals(5, paramSet.size());
assertTrue(paramSet.containsKey("Conolve Width Size"));
assertTrue(paramSet.containsKey("Minimum signal to noise ratio"));
assertTrue(paramSet.containsKey("Noise percentile"));
assertTrue(paramSet.containsKey("Minimum ridge length"));
assertTrue(paramSet.containsKey("Gap threshold"));
}
@Test
public void plateauDataTest() {
//TODO: python version just detect one value as a peak...
WaveletTransformPeakFinds wave = new WaveletTransformPeakFinds();
int dataSz = 100;
Dataset xData = DatasetFactory.createRange(dataSz, Dataset.INT64);
Dataset yData = DatasetFactory.ones(dataSz);
TreeMap<Integer, Double> foundPeaks = (TreeMap<Integer, Double>) wave.findPeaks(xData, yData, null);
//XXX: detects in plataue situation. Would need to check before runs algorithm.
//It should find only 1 peak as a result of this algorithm
assertTrue(foundPeaks.size() <= 1); // Check no peaks were found
}
}