teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.exports.sq; sascha@3109: teichmann@5831: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; sascha@3109: felix@6869: import org.dive4elements.river.artifacts.D4EArtifact; felix@6869: felix@6869: import org.dive4elements.river.artifacts.access.SQRelationAccess; felix@6869: teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; sascha@3109: teichmann@5831: import org.dive4elements.river.artifacts.model.sq.SQ; teichmann@5831: import org.dive4elements.river.artifacts.model.sq.SQFunction; teichmann@5831: teichmann@5831: import org.dive4elements.river.exports.XYChartGenerator; teichmann@5831: teichmann@5831: import org.dive4elements.river.jfree.JFreeUtil; teichmann@5831: import org.dive4elements.river.jfree.StyledXYSeries; teichmann@6905: import org.dive4elements.river.themes.ThemeDocument; sascha@3109: ingo@3077: import org.apache.log4j.Logger; ingo@3077: ingo@3077: import org.jfree.chart.axis.LogarithmicAxis; ingo@3077: import org.jfree.chart.axis.NumberAxis; sascha@3109: ingo@3079: import org.jfree.data.xy.XYSeries; ingo@3077: ingo@3077: ingo@3077: /** ingo@3077: * An OutGenerator that generates charts for MINFO sq relation. ingo@3077: * ingo@3077: * @author Ingo Weinzierl ingo@3077: */ ingo@3077: public class SQRelationGenerator ingo@3077: extends XYChartGenerator ingo@3077: implements FacetTypes ingo@3077: { ingo@3077: public enum YAXIS { ingo@3077: S(0); ingo@3077: protected int idx; ingo@3077: private YAXIS(int c) { ingo@3077: idx = c; ingo@3077: } ingo@3077: } ingo@3077: ingo@3115: ingo@3115: public static final String I18N_XAXIS_LABEL = ingo@3115: "chart.sq_relation.xaxis.label"; ingo@3115: ingo@3115: public static final String I18N_YAXIS_LABEL = ingo@3115: "chart.sq_relation.yaxis.label"; ingo@3115: felix@6869: public static final String I18N_SUBTITLE = felix@6869: "chart.computed.discharge.curve.subtitle"; felix@6869: felix@6869: /** Needed to access data to create subtitle. */ felix@6869: protected D4EArtifact artifact; ingo@3115: ingo@3077: /** The logger that is used in this generator. */ ingo@3077: private static Logger logger = Logger.getLogger(SQRelationGenerator.class); ingo@3077: ingo@3077: ingo@3077: @Override ingo@3077: protected YAxisWalker getYAxisWalker() { ingo@3077: return new YAxisWalker() { ingo@3077: @Override ingo@3077: public int length() { ingo@3077: return YAXIS.values().length; ingo@3077: } ingo@3077: ingo@3077: @Override ingo@3077: public String getId(int idx) { ingo@3077: YAXIS[] yaxes = YAXIS.values(); ingo@3077: return yaxes[idx].toString(); ingo@3077: } ingo@3077: }; ingo@3077: } ingo@3077: felix@6869: /** felix@6869: * Returns the default subtitle for this chart. felix@6869: * felix@6869: * @return the default subtitle for this chart. felix@6869: */ felix@6869: @Override felix@6869: protected String getDefaultChartSubtitle() { felix@6869: SQRelationAccess sqAccess = new SQRelationAccess(artifact); felix@6869: Object[] args = null; felix@6869: args = new Object[] { felix@6869: sqAccess.getRiver(), felix@6869: sqAccess.getLocation() felix@6869: }; felix@6869: return msg(I18N_SUBTITLE, "", args); felix@6869: } felix@6869: felix@6869: ingo@3077: ingo@3077: @Override ingo@3077: public String getDefaultChartTitle() { ingo@3077: return "TODO: CHART TITLE"; ingo@3077: } ingo@3077: ingo@3077: ingo@3077: @Override ingo@3077: protected String getDefaultXAxisLabel() { ingo@3115: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL); ingo@3077: } ingo@3077: ingo@3077: ingo@3077: @Override ingo@3077: protected String getDefaultYAxisLabel(int index) { ingo@3115: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL); ingo@3077: } ingo@3077: ingo@3077: ingo@3077: @Override ingo@3079: protected NumberAxis createXAxis(String label) { ingo@3079: return new LogarithmicAxis(label); ingo@3079: } ingo@3079: ingo@3079: ingo@3079: @Override ingo@3077: protected NumberAxis createYAxis(int index) { ingo@3115: return new LogarithmicAxis(getDefaultYAxisLabel(index)); ingo@3077: } ingo@3077: ingo@3077: ingo@3077: @Override ingo@3077: public void doOut( ingo@3077: ArtifactAndFacet artifactAndFacet, teichmann@6905: ThemeDocument attr, ingo@3077: boolean visible ingo@3077: ) { ingo@3077: logger.debug("doOut"); ingo@3077: felix@6869: this.artifact = (D4EArtifact) artifactAndFacet.getArtifact(); felix@6869: ingo@3077: Facet facet = artifactAndFacet.getFacet(); ingo@3077: String name = facet != null ? facet.getName() : null; ingo@3077: ingo@3077: if (name == null || name.length() == 0) { ingo@3077: logger.warn("Invalid facet with no name given!"); ingo@3077: return; ingo@3077: } ingo@3077: ingo@3077: if (IS.SQ_CURVE(name)) { ingo@3077: doSQCurveOut(artifactAndFacet, attr, visible); ingo@3077: } ingo@3077: else if (IS.SQ_MEASUREMENT(name)) { ingo@3099: doSQOut(artifactAndFacet, attr, visible); ingo@3077: } ingo@3077: else if (IS.SQ_OUTLIER(name)) { ingo@3099: doSQOut(artifactAndFacet, attr, visible); ingo@3077: } felix@4590: else if (IS.MANUALPOINTS(name)) { felix@4590: doPoints( felix@4590: artifactAndFacet.getData(context), felix@4590: artifactAndFacet, felix@4590: attr, felix@4590: visible, felix@4590: YAXIS.S.idx); felix@4590: } ingo@3077: } ingo@3077: ingo@3077: ingo@3077: protected void doSQCurveOut( ingo@3077: ArtifactAndFacet artifactAndFacet, teichmann@6905: ThemeDocument attr, ingo@3077: boolean visible ingo@3077: ) { ingo@3120: String desc = artifactAndFacet.getFacetDescription(); ingo@3120: logger.debug("doSQCurveOut: " + desc); ingo@3105: ingo@3105: SQFunction func = (SQFunction) artifactAndFacet.getData(context); ingo@3105: sascha@3310: if (func == null) { sascha@3310: return; sascha@3310: } sascha@3310: teichmann@4564: XYSeries series = JFreeUtil.sampleFunction2DPositive( sascha@3109: func.getFunction(), ingo@3105: attr, ingo@3120: desc, sascha@3310: 500, sascha@3311: Math.max(func.getMinQ(), 0.01), sascha@3311: Math.max(func.getMaxQ(), 0.02)); ingo@3105: ingo@3119: if (logger.isDebugEnabled()) { ingo@3120: logger.debug("Series '" + desc + "' has " ingo@3119: + series.getItemCount() + " items."); ingo@3119: ingo@3119: logger.debug(" -> min x = " + series.getMinX()); ingo@3119: logger.debug(" -> max x = " + series.getMaxX()); ingo@3119: logger.debug(" -> min y = " + series.getMinY()); ingo@3119: logger.debug(" -> max y = " + series.getMaxY()); ingo@3119: } ingo@3119: ingo@3105: addAxisSeries(series, YAXIS.S.idx, visible); ingo@3077: } ingo@3077: ingo@3077: ingo@3099: protected void doSQOut( ingo@3077: ArtifactAndFacet artifactAndFacet, teichmann@6905: ThemeDocument attr, ingo@3077: boolean visible ingo@3077: ) { ingo@3120: String desc = artifactAndFacet.getFacetDescription(); ingo@3120: logger.debug("doSQOut: " + desc); ingo@3079: ingo@3079: SQ[] sqs = (SQ[]) artifactAndFacet.getData(context); sascha@3310: if (sqs == null) { sascha@3310: logger.debug("No SQs found for facet"); sascha@3310: return; sascha@3310: } ingo@3120: XYSeries series = new StyledXYSeries(desc, attr); ingo@3079: ingo@3079: for (SQ sq: sqs) { sascha@3312: double q = sq.getQ(); sascha@3312: double s = sq.getS(); sascha@3312: if (s > 0d && q > 0d) { sascha@3312: series.add(q, s, false); sascha@3312: } ingo@3079: } ingo@3079: ingo@3119: if (logger.isDebugEnabled()) { ingo@3120: logger.debug("Series '" + desc + "' has " ingo@3119: + series.getItemCount() + " items."); ingo@3119: ingo@3119: logger.debug(" -> min x = " + series.getMinX()); ingo@3119: logger.debug(" -> max x = " + series.getMaxX()); ingo@3119: logger.debug(" -> min y = " + series.getMinY()); ingo@3119: logger.debug(" -> max y = " + series.getMaxY()); ingo@3119: } ingo@3119: ingo@3079: addAxisSeries(series, YAXIS.S.idx, visible); ingo@3077: } ingo@3077: } ingo@3077: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :