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: 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; 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: import org.w3c.dom.Document; 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: 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: 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, ingo@3077: Document attr, ingo@3077: boolean visible ingo@3077: ) { ingo@3077: logger.debug("doOut"); ingo@3077: 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, ingo@3077: Document 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, ingo@3077: Document 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 :