view flys-artifacts/src/main/java/de/intevation/flys/exports/fixings/FixLongitudinalSectionGenerator.java @ 3610:66f539df4e8b

Issue 716. FixA: Spilt reference and analysis period themes into one theme for each event. flys-artifacts/trunk@5239 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Thu, 23 Aug 2012 08:49:37 +0000
parents accb64be866c
children f3fc8d49d741
line wrap: on
line source
package de.intevation.flys.exports.fixings;

import de.intevation.artifactdatabase.state.ArtifactAndFacet;
import de.intevation.flys.artifacts.model.FacetTypes;
import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod;
import de.intevation.flys.artifacts.model.fixings.QWD;
import de.intevation.flys.exports.ChartGenerator;
import de.intevation.flys.jfree.FLYSAnnotation;
import de.intevation.flys.jfree.StyledAreaSeriesCollection;
import de.intevation.flys.jfree.StyledXYSeries;
import de.intevation.flys.utils.KMIndex;

import java.awt.BasicStroke;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.w3c.dom.Document;

public class FixLongitudinalSectionGenerator
extends FixChartGenerator
implements FacetTypes
{
    private static Logger logger =
        Logger.getLogger(FixLongitudinalSectionGenerator.class);

    public static final String I18N_CHART_TITLE =
        "chart.fixings.longitudinalsection.title";

    public static final String I18N_CHART_SUBTITLE =
        "chart.fixings.longitudinalsection.subtitle";

    public static final String I18N_XAXIS_LABEL =
        "chart.fixings.longitudinalsection.xaxis.label";

    public static final String I18N_YAXIS_LABEL =
        "chart.fixings.longitudinalsection.yaxis.label";

    public static final String I18N_CHART_TITLE_DEFAULT  =
        "Fixierungsanalyse";

    public static final String I18N_XAXIS_LABEL_DEFAULT  =
        "[km]";

    public static final String I18N_YAXIS_LABEL_DEFAULT  =
        "delta W [cm]";

    public static enum YAXIS {
        dW(0);
        public int idx;
        private YAXIS(int c) {
            idx = c;
        }
    }

    @Override
    public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
        String name = aaf.getFacetName();
        logger.debug("FixLongitudinalSectionGenerator: doOut: " + name);

        if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) {
            doSectorAverageDeviationOut(aaf, doc, visible);
        }
        else if (name.contains(FIX_SECTOR_AVERAGE_LS)) {
            doSectorAverageOut(aaf, doc, visible);
        }
        else if (name.equals(FIX_REFERENCE_EVENTS_LS)) {
            doReferenceEventsOut(aaf, doc, visible);
        }
        else if (name.equals(FIX_ANALYSIS_EVENTS_LS)) {
            doAnalysisEventsOut(aaf, doc, visible);
        }
        else if (name.equals(FIX_DEVIATION_LS)) {
            doReferenceDeviationOut(aaf, doc, visible);
        }
        else if (name.equals(LONGITUDINAL_ANNOTATION)) {
            doAnnotations(
                 (FLYSAnnotation) aaf.getData(context),
                 aaf,
                 doc,
                 visible);
        }
        else {
            logger.warn("Unknown facet name " + name);
            return;
        }
    }

    @SuppressWarnings("unchecked")
    protected void doSectorAverageOut(
        ArtifactAndFacet aaf,
        Document doc,
        boolean visible)
    {
        logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex());

        int index = aaf.getFacet().getIndex();
        int sectorNdx = index & 3;

        KMIndex<AnalysisPeriod> kms =
            (KMIndex<AnalysisPeriod>)aaf.getData(context);

        if(kms == null) {
            return;
        }

        XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), doc);

        for (KMIndex.Entry<AnalysisPeriod> entry: kms) {
            double km = entry.getKm();
            AnalysisPeriod ap = entry.getValue();
            QWD qwd = ap.getQSectorAverages()[sectorNdx];
            if (qwd == null) {
                continue;
            }
            double deltaW = qwd.getDeltaW();
            series.add(km, deltaW);
        }

        addAxisSeries(series, 0, visible);

    }


    @SuppressWarnings("unchecked")
    protected void doSectorAverageDeviationOut(
        ArtifactAndFacet aaf,
        Document doc,
        boolean visible)
    {
        logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex());

        int index = aaf.getFacet().getIndex();
        int sectorNdx = index & 3;

        KMIndex<AnalysisPeriod> kms =
            (KMIndex<AnalysisPeriod>)aaf.getData(context);

        if(kms == null) {
            return;
        }

        StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc);
        XYSeries upper =
            new StyledXYSeries(aaf.getFacetDescription(), false, doc);
        XYSeries lower =
            new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc);


        for (KMIndex.Entry<AnalysisPeriod> entry: kms) {
            double km = entry.getKm();
            AnalysisPeriod ap = entry.getValue();
            QWD qwd = ap.getQSectorAverages()[sectorNdx];
            double dev = ap.getQSectorStdDev(sectorNdx);
            logger.debug("std-dev: " + dev);
            if (qwd == null) {
                continue;
            }
            double deltaW = qwd.getDeltaW();
            double up = deltaW + dev;
            double lo = deltaW - dev;
            upper.add(km, up);
            lower.add(km, lo);
        }
        area.addSeries(upper);
        area.addSeries(lower);

        addAreaSeries(area, 0, visible);
    }


    @SuppressWarnings("unchecked")
    protected void doReferenceDeviationOut(
        ArtifactAndFacet aaf,
        Document doc,
        boolean visible)
    {
        logger.debug("doReferenceOut");

        KMIndex<double[]> kms =
            (KMIndex<double[]>)aaf.getData(context);

        if(kms == null) {
            return;
        }

        StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc);
        XYSeries upper =
            new StyledXYSeries(aaf.getFacetDescription(), false, doc);
        XYSeries lower =
            new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc);


        for (KMIndex.Entry<double[]> entry: kms) {
            double km = entry.getKm();
            double[] devArray = entry.getValue();
            if (devArray == null) {
                continue;
            }
            double dev = devArray[0];
            double up = dev;
            double lo = -dev;
            upper.add(km, up, false);
            lower.add(km, lo, false);
        }
        area.addSeries(upper);
        area.addSeries(lower);

        Marker marker = new ValueMarker(0);
        marker.setStroke(new BasicStroke(2));
        marker.setPaint(Color.BLACK);
        addValueMarker(marker);
        addAreaSeries(area, 0, visible);
    }

    @SuppressWarnings("unchecked")
    protected void doAnalysisEventsOut(
        ArtifactAndFacet aaf,
        Document doc,
        boolean visible)
    {
        logger.debug("doAnalysisEventsOut");

        KMIndex<QWD> kms =
            (KMIndex<QWD>)aaf.getData(context);

        if(kms == null) {
            return;
        }

        XYSeriesCollection col = new XYSeriesCollection();

        StyledXYSeries series = new StyledXYSeries(aaf.getFacetDescription(), false, doc);

        for (KMIndex.Entry<QWD> entry: kms) {
            double km = entry.getKm();
            QWD qwd = entry.getValue();

                series.add(km, qwd.getDeltaW());
        }
        col.addSeries(series);

        addAxisDataset(col, 0, visible);
    }

    @SuppressWarnings("unchecked")
    protected void doReferenceEventsOut(
        ArtifactAndFacet aaf,
        Document doc,
        boolean visible)
    {
        logger.debug("doReferenceEventOut");

        KMIndex<QWD> kms =
            (KMIndex<QWD>)aaf.getData(context);

        if(kms == null) {
            return;
        }

        XYSeriesCollection col = new XYSeriesCollection();

        StyledXYSeries series = new StyledXYSeries(aaf.getFacetDescription(), false, doc);

        for (KMIndex.Entry<QWD> entry: kms) {
            double km = entry.getKm();
            QWD qwd = entry.getValue();

            series.add(km, qwd.getDeltaW());
        }
        col.addSeries(series);

        addAxisDataset(col, 0, visible);
    }


    @Override
    protected String getDefaultChartTitle() {
        return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
    }

    @Override
    protected String getDefaultXAxisLabel() {
        return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT);
    }

    @Override
    protected String getDefaultYAxisLabel(int pos) {
        return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
    }

    @Override
    protected ChartGenerator.YAxisWalker getYAxisWalker() {
        return new YAxisWalker() {
            @Override
            public int length() {
                return YAXIS.values().length;
            }

            @Override
             public String getId(int idx) {
                YAXIS[] yaxes = YAXIS.values();
                return yaxes[idx].toString();
            }
        };
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org