# HG changeset patch # User Andre Heinecke # Date 1380040375 -7200 # Node ID d13398318b1143bfb4a644cdd609da381fa68674 # Parent 988dde49ae654f58a78d36d831112ba93b1380eb Add DeltaWProcessor to process data for a delta W axis. This is basically a copy of the KMIndexProcessor with some added Facets ands with the new doOut interface. The KM Processor will be removed after the bed* diagrams no longer use it. diff -r 988dde49ae65 -r d13398318b11 artifacts/src/main/java/org/dive4elements/river/exports/process/DeltaWProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/DeltaWProcessor.java Tue Sep 24 18:32:55 2013 +0200 @@ -0,0 +1,263 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +package org.dive4elements.river.exports.process; + +import org.apache.log4j.Logger; + +import java.awt.BasicStroke; +import java.awt.Color; + +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; + +import org.jfree.chart.plot.Marker; +import org.jfree.chart.plot.ValueMarker; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriod; +import org.dive4elements.river.artifacts.model.fixings.QWD; +import org.dive4elements.river.exports.DiagramGenerator; +import org.dive4elements.river.jfree.StyledXYSeries; +import org.dive4elements.river.jfree.StyledAreaSeriesCollection; +import org.dive4elements.river.themes.ThemeDocument; +import org.dive4elements.river.utils.KMIndex; + +public class DeltaWProcessor extends DefaultProcessor { + /* This is basically a collection of different processors. The + * historic reason for this is that they have in common that they + * work on deltaW data from the fixing analysis. */ + + private static final Logger logger = Logger.getLogger(DeltaWProcessor.class); + + public static final String I18N_DW_YAXIS_LABEL_DEFAULT = + "delta W [cm]"; + + public static final String I18N_DW_YAXIS_LABEL = + "chart.fixings.longitudinalsection.yaxis.label"; + + @Override + public void doOut( + DiagramGenerator generator, + ArtifactAndFacet bundle, + ThemeDocument theme, + boolean visible) { + String facettype = bundle.getFacetName(); + if (!visible) { + return; + } + logger.debug("Doing out for: " + bundle.getFacetName()); + if (facettype.equals(FacetTypes.FIX_REFERENCE_EVENTS_LS)) { + doReferenceEventsOut(generator, bundle, theme, visible); + } else if (facettype.equals(FacetTypes.FIX_ANALYSIS_EVENTS_LS)) { + doAnalysisEventsOut(generator, bundle, theme, visible); + } else if (facettype.startsWith(FacetTypes.FIX_SECTOR_AVERAGE_LS_DEVIATION)) { + doSectorAverageDeviationOut(generator, bundle, theme, visible); + } else if (facettype.equals(FacetTypes.FIX_DEVIATION_LS)) { + doReferenceDeviationOut(generator, bundle, theme, visible); + } else if (facettype.startsWith(FacetTypes.FIX_SECTOR_AVERAGE_LS)) { + doSectorAverageOut(generator, bundle, theme, visible); + } else { + logger.error("Could not handle: " + facettype); + } + } + + @Override + public boolean canHandle(String facettype) { + if (facettype == null) { + return false; + } + + if (facettype.startsWith(FacetTypes.FIX_SECTOR_AVERAGE_LS) + || facettype.equals(FacetTypes.FIX_REFERENCE_EVENTS_LS) + || facettype.equals(FacetTypes.FIX_ANALYSIS_EVENTS_LS) + || facettype.equals(FacetTypes.FIX_DEVIATION_LS)) { + return true; + } + return false; + } + + private void doSectorAverageOut(DiagramGenerator generator, + ArtifactAndFacet bundle, + ThemeDocument doc, boolean visible) { + CallContext context = generator.getCallContext(); + int index = bundle.getFacet().getIndex(); + int sectorNdx = index & 3; + + KMIndex kms = + (KMIndex)bundle.getData(context); + + if(kms == null) { + return; + } + + XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), doc); + + for (KMIndex.Entry 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); + } + + generator.addAxisSeries(series, axisName, visible); + } + + private void doReferenceEventsOut(DiagramGenerator generator, + ArtifactAndFacet bundle, ThemeDocument doc, boolean visible) { + CallContext context = generator.getCallContext(); + + KMIndex kms = + (KMIndex)bundle.getData(context); + + if(kms == null) { + return; + } + + XYSeriesCollection col = new XYSeriesCollection(); + + StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), false, + doc); + + for (KMIndex.Entry entry: kms) { + double km = entry.getKm(); + QWD qwd = entry.getValue(); + + series.add(km, qwd.getDeltaW()); + } + col.addSeries(series); + + generator.addAxisDataset(col, axisName, visible); + } + + private void doAnalysisEventsOut( + DiagramGenerator generator, + ArtifactAndFacet bundle, + ThemeDocument doc, + boolean visible) { + CallContext context = generator.getCallContext(); + + KMIndex kms = + (KMIndex)bundle.getData(context); + + if(kms == null) { + return; + } + + XYSeriesCollection col = new XYSeriesCollection(); + + StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), false, doc); + + for (KMIndex.Entry entry: kms) { + double km = entry.getKm(); + QWD qwd = entry.getValue(); + + series.add(km, qwd.getDeltaW()); + } + col.addSeries(series); + + generator.addAxisDataset(col, axisName, visible); + } + + protected void doSectorAverageDeviationOut( + DiagramGenerator generator, + ArtifactAndFacet bundle, + ThemeDocument doc, + boolean visible) { + CallContext context = generator.getCallContext(); + + int index = bundle.getFacet().getIndex(); + int sectorNdx = index & 3; + + KMIndex kms = + (KMIndex)bundle.getData(context); + + if(kms == null) { + return; + } + + StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); + XYSeries upper = + new StyledXYSeries(bundle.getFacetDescription(), false, doc); + XYSeries lower = + new StyledXYSeries(bundle.getFacetDescription() + " ", false, doc); + + for (KMIndex.Entry entry: kms) { + double km = entry.getKm(); + AnalysisPeriod ap = entry.getValue(); + QWD qwd = ap.getQSectorAverages()[sectorNdx]; + double dev = ap.getQSectorStdDev(sectorNdx); + 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); + + generator.addAreaSeries(area, axisName, visible); + } + + protected void doReferenceDeviationOut( + DiagramGenerator generator, + ArtifactAndFacet bundle, + ThemeDocument doc, + boolean visible) { + CallContext context = generator.getCallContext(); + + KMIndex kms = + (KMIndex)bundle.getData(context); + + if(kms == null) { + return; + } + + StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); + XYSeries upper = + new StyledXYSeries(bundle.getFacetDescription(), false, doc); + XYSeries lower = + new StyledXYSeries(bundle.getFacetDescription() + " ", false, doc); + + for (KMIndex.Entry 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); + generator.addValueMarker(marker); + generator.addAreaSeries(area, axisName, visible); + } + + @Override + public String getAxisLabel(DiagramGenerator generator) { + return generator.msg(I18N_DW_YAXIS_LABEL, I18N_DW_YAXIS_LABEL_DEFAULT); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :