@Override protected Stx computeStxImpl(int level, ProgressMonitor pm) { final IndexCoding indexCoding = getIndexCoding(); if (indexCoding == null) { return super.computeStxImpl(level, pm); } final int sampleCount = indexCoding.getSampleCount(); int minSample = Integer.MAX_VALUE; int maxSample = Integer.MIN_VALUE; for (int i = 0; i < sampleCount; i++) { final int sample = indexCoding.getSampleValue(i); minSample = Math.min(minSample, sample); maxSample = Math.max(maxSample, sample); } final int binCount = maxSample - minSample + 1; final double min = minSample; final double max = maxSample; return new StxFactory() .withResolutionLevel(level) .withHistogramBinCount(binCount) .withMinimum(min) .withMaximum(max).create(this, pm); }
.withMaximum(max) .withMean(mean) .withStandardDeviation(stdDev)
factory.withMaximum(Stx.LOG10_SCALING.scaleInverse(max)); } else { factory.withMaximum(max);
private Stx createStx() { return new StxFactory() .withMinimum(-0.2) .withMaximum(3) .withMean(5.5) .withStandardDeviation(3.67) .withHistogramBins(new int[]{4, 5, 4, 7, 5, 8}) .create(); }
private static Stx createStx(Band band, Element bandStatisticsElem) { final Double minSample = getElemDouble(bandStatisticsElem, DimapProductConstants.TAG_STX_MIN); final Double maxSample = getElemDouble(bandStatisticsElem, DimapProductConstants.TAG_STX_MAX); final Double mean = getElemDouble(bandStatisticsElem, DimapProductConstants.TAG_STX_MEAN); final Double stdDev = getElemDouble(bandStatisticsElem, DimapProductConstants.TAG_STX_STDDEV); final Integer level = getElemInt(bandStatisticsElem, DimapProductConstants.TAG_STX_LEVEL); final int[] bins = getHistogramBins(bandStatisticsElem); boolean intHistogram = !ProductData.isFloatingPointType(band.getGeophysicalDataType()); if (minSample != null && maxSample != null) { return new StxFactory() .withMinimum(minSample) .withMaximum(maxSample) .withMean(mean) .withStandardDeviation(stdDev) .withIntHistogram(intHistogram) .withHistogramBins(bins == null ? new int[0] : bins) .withResolutionLevel(level).create(); } return null; }
@Test public void testMinMaxBinsLogHistogram() throws Exception { StxFactory factory = new StxFactory(); factory .withMinimum(0.1) .withMaximum(10) .withLogHistogram(true) .withHistogramBins(new int[]{1, 2, 3, 6, 6, 3, 2, 1}); Stx stx = factory.create(); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(0.1, stx.getMinimum(), 1e-10); assertEquals(10, stx.getMaximum(), 1e-10); assertEquals(Math.pow(10.0, stx.getHistogram().getMean()[0]), stx.getMean(), 1e-3); assertEquals(Math.pow(10.0, 0), stx.getMedian(), 1e-3); assertEquals(-1.0, stx.getHistogram().getLowValue(0), 1e-10); assertEquals(1.0, stx.getHistogram().getHighValue(0), 1e-10); assertArrayEquals(new int[]{1, 2, 3, 6, 6, 3, 2, 1}, stx.getHistogramBins()); }
@Test public void testMinMaxBins() throws Exception { StxFactory factory = new StxFactory(); factory .withMinimum(-1.0) .withMaximum(1.0) .withHistogramBins(new int[]{1, 2, 3, 6, 6, 3, 2, 1}); Stx stx = factory.create(); assertEquals(-1.0, stx.getMinimum(), 1e-10); assertEquals(1.0, stx.getMaximum(), 1e-10); assertEquals(-0.125, stx.getMean(), 1e-10); assertEquals(0.0, stx.getMedian(), 1e-10); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(-1.0, stx.getHistogram().getLowValue(0), 1e-10); assertEquals(1.0, stx.getHistogram().getHighValue(0), 1e-10); assertArrayEquals(new int[]{1, 2, 3, 6, 6, 3, 2, 1}, stx.getHistogramBins()); }
@Test public void testMinMaxBinsLogHistogramWithNegativeMinimum() throws Exception { StxFactory factory = new StxFactory(); factory .withMinimum(-10) .withMaximum(+10) .withLogHistogram(true) .withHistogramBins(new int[]{1, 2, 3, 6, 6, 3, 2, 1}); Stx stx = factory.create(); assertEquals(-10, stx.getMinimum(), 1e-10); assertEquals(+10, stx.getMaximum(), 1e-10); assertEquals(0.0, stx.getMean(), 1e-3); assertEquals(0.0, stx.getMedian(), 1e-3); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(-9.0, stx.getHistogram().getLowValue(0), 1e-10); // 1E-9 is the max value we handle assertEquals(1.0, stx.getHistogram().getHighValue(0), 1e-10); assertArrayEquals(new int[]{1, 2, 3, 6, 6, 3, 2, 1}, stx.getHistogramBins()); }
@Test public void testMinMaxBinsIntHistogram() throws Exception { StxFactory factory = new StxFactory(); factory .withMinimum(1) .withMaximum(100) .withIntHistogram(true) .withHistogramBins(new int[]{1, 2, 3, 6, 6, 3, 2, 1}); Stx stx = factory.create(); assertEquals(1, stx.getMinimum(), 1e-10); assertEquals(100, stx.getMaximum(), 1e-10); assertEquals(44.75, stx.getMean(), 1e-10); assertEquals(51.0, stx.getMedian(), 1e-10); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(1, stx.getHistogram().getLowValue(0), 1e-10); assertEquals(101, stx.getHistogram().getHighValue(0), 1e-10); assertArrayEquals(new int[]{1, 2, 3, 6, 6, 3, 2, 1}, stx.getHistogramBins()); }
@Test public void testMinIsMax() throws Exception { StxFactory factory = new StxFactory(); factory .withMinimum(0) .withMaximum(0) .withHistogramBins(new int[]{1000, 0, 0, 0, 0, 0, 0, 0}); Stx stx = factory.create(); assertEquals(0, stx.getMinimum(), 1e-10); assertEquals(0, stx.getMaximum(), 1e-10); assertEquals(0, stx.getMean(), 1e-10); assertEquals(0, stx.getMedian(), 1e-10); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(0, stx.getHistogram().getLowValue(0), 1E-10); assertEquals(1.0E-10, stx.getHistogram().getHighValue(0), 1E-10); assertTrue(stx.getHistogram().getLowValue(0) < stx.getHistogram().getHighValue(0)); assertArrayEquals(new int[]{1000, 0, 0, 0, 0, 0, 0, 0}, stx.getHistogramBins()); }
@Test public void testMinAndMaxAreTheSameVeryLargePositiveValue() throws Exception { double aLargePositiveValue = Double.MAX_VALUE; double aSlightlySmallerValue = Math.nextAfter(aLargePositiveValue, Double.NEGATIVE_INFINITY); StxFactory factory = new StxFactory(); factory .withMinimum(aLargePositiveValue) .withMaximum(aLargePositiveValue) .withHistogramBins(new int[]{1000, 0, 0, 0, 0, 0, 0, 0}); Stx stx = factory.create(); assertEquals(aLargePositiveValue, stx.getMinimum(), 1e-10); assertEquals(aLargePositiveValue, stx.getMaximum(), 1e-10); assertEquals(aLargePositiveValue, stx.getMean(), 1e-10); assertEquals(aLargePositiveValue, stx.getMedian(), 1e-10); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(aSlightlySmallerValue, stx.getHistogram().getLowValue(0), 1E-10); assertEquals(aLargePositiveValue, stx.getHistogram().getHighValue(0), 1E-10); assertTrue(stx.getHistogram().getLowValue(0) < stx.getHistogram().getHighValue(0)); assertArrayEquals(new int[]{1000, 0, 0, 0, 0, 0, 0, 0}, stx.getHistogramBins()); }
@Test public void testMinAndMaxAreTheSameVeryLargeNegativeValue() throws Exception { double aLargeNegativeValue = -Double.MAX_VALUE; double aSlightlyLargerValue = Math.nextUp(aLargeNegativeValue); StxFactory factory = new StxFactory(); factory .withMinimum(aLargeNegativeValue) .withMaximum(aLargeNegativeValue) .withHistogramBins(new int[]{1000, 0, 0, 0, 0, 0, 0, 0}); Stx stx = factory.create(); assertEquals(aLargeNegativeValue, stx.getMinimum(), 1e-10); assertEquals(aLargeNegativeValue, stx.getMaximum(), 1e-10); assertEquals(aLargeNegativeValue, stx.getMean(), 1e-10); assertEquals(aLargeNegativeValue, stx.getMedian(), 1e-10); assertNotNull(stx.getHistogram()); assertEquals(1, stx.getHistogram().getNumBands()); assertEquals(8, stx.getHistogram().getNumBins()[0]); assertEquals(aLargeNegativeValue, stx.getHistogram().getLowValue(0), 1E-10); assertEquals(aSlightlyLargerValue, stx.getHistogram().getHighValue(0), 1E-10); assertTrue(stx.getHistogram().getLowValue(0) < stx.getHistogram().getHighValue(0)); assertArrayEquals(new int[]{1000, 0, 0, 0, 0, 0, 0, 0}, stx.getHistogramBins()); }