latex.LatexTableQuality.java Source code

Java tutorial

Introduction

Here is the source code for latex.LatexTableQuality.java

Source

/*
 * Copyright 2014 Fraunhofer IGD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package latex;

import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STRawGroupDir;
import org.stringtemplate.v4.misc.ErrorManager;

import algorithms.quality.ColorDivergenceQuantile;
import algorithms.quality.ColorDynamicDistBlack;
import algorithms.quality.ColorDynamicDistWhite;
import algorithms.quality.ColorDynamicWhiteContrast;
import algorithms.quality.ColorExploitation;
import algorithms.quality.ColormapQuality;
import algorithms.quality.JndRegionSize;
import algorithms.sampling.CircularSampling;
import algorithms.sampling.SamplingStrategy;
import colormaps.Colormap2D;
import colormaps.transformed.SimpleFilteredColormap2D.ViewType;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Range;

/**
 * Generates LaTeX table output for a list of colormaps 
 * @author Martin Steiger
 */
public final class LatexTableQuality {
    private LatexTableQuality() {
        // private
    }

    public static File generateTable(List<Colormap2D> colormaps, File outputFolder) throws IOException {
        STRawGroupDir templateDir = new STRawGroupDir("src/main/resources/latex");
        templateDir.delimiterStartChar = '$';
        templateDir.delimiterStopChar = '$';

        Map<Colormap2D, MetricColormap> mcms = Maps.newHashMap();

        for (Colormap2D cm : colormaps) {
            String fname = cm.getName() + "_" + ViewType.REAL.toString();
            String relativePath = "images/" + toFilename(fname);

            MetricColormap mcm = new MetricColormap(cm, relativePath);
            mcms.put(cm, mcm);
        }

        SamplingStrategy sampling = new CircularSampling(50);

        List<ColormapQuality> measures = Lists.newArrayList();
        measures.add(new ColorExploitation(sampling));
        measures.add(new JndRegionSize(sampling));
        measures.add(new ColorDynamicDistBlack(sampling));
        measures.add(new ColorDynamicDistWhite(sampling));
        measures.add(new ColorDynamicWhiteContrast(sampling));
        measures.add(new ColorDivergenceQuantile(0.5));
        measures.add(new ColorDivergenceQuantile(0.1));
        measures.add(new ColorDivergenceQuantile(0.9));

        for (ColormapQuality measure : measures) {
            Map<Colormap2D, Double> mapQualities = computeQuality(colormaps, measure);
            Map<Colormap2D, Integer> mapPoints = computePoints(mapQualities);

            for (Colormap2D cm : colormaps) {
                double quality = mapQualities.get(cm);
                Integer points = mapPoints.get(cm);
                mcms.get(cm).addMetric(measure, quality, points);
            }
        }

        ST st = templateDir.getInstanceOf("MetricTable");
        st.add("metrics", measures);
        st.add("colors", createColorDefs());
        st.add("colormaps", mcms.values());

        File texFile = new File(outputFolder, "metric_table.tex");
        st.write(texFile, ErrorManager.DEFAULT_ERROR_LISTENER);

        return texFile;
    }

    private static List<LatexColor> createColorDefs() {
        List<LatexColor> colors = Lists.newArrayList();
        ColorRamp colorramp = new ColorRamp();

        for (int i = 0; i <= 100; i++) {
            double val = 1.0 - i / 100d;
            Color col = colorramp.getColor(val);

            colors.add(new LatexColor(col, "quality" + i));
        }

        return colors;
    }

    private static Map<Colormap2D, Double> computeQuality(List<Colormap2D> colormaps, ColormapQuality measure) {
        Map<Colormap2D, Double> qualityMap = Maps.newHashMap();
        for (Colormap2D cm : colormaps) {
            double quality = measure.getQuality(cm);
            qualityMap.put(cm, Double.valueOf(quality));
        }

        return qualityMap;
    }

    private static Range<Double> getMinMax(Collection<Double> quals) {
        double min = Double.MAX_VALUE;
        double max = Double.MIN_VALUE;

        for (Double quality : quals) {
            if (quality > max)
                max = quality;

            if (quality < min)
                min = quality;
        }

        return Range.closed(min, max);
    }

    private static Map<Colormap2D, Integer> computePoints(Map<Colormap2D, Double> qualityMap) {
        Map<Colormap2D, Integer> result = Maps.newHashMap();

        Range<Double> range = getMinMax(qualityMap.values());

        double span = range.upperEndpoint() - range.lowerEndpoint();
        for (Colormap2D cm : qualityMap.keySet()) {
            double val = qualityMap.get(cm);
            double frac = (val - range.lowerEndpoint()) / span;
            int percent = (int) (frac * 100d);
            result.put(cm, Integer.valueOf(percent));
        }

        return result;
    }

    private static String toFilename(String name) {
        return name.replaceAll("\\.", "").replaceAll(":", "").replaceAll("\\W", "_") // NOT a number, letter or underscore 
                + ".png";
    }
}