raimund@3169: package de.intevation.flys.exports.fixings; raimund@3169: christian@3286: import de.intevation.artifactdatabase.state.ArtifactAndFacet; christian@3286: import de.intevation.flys.artifacts.model.FacetTypes; christian@3286: import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod; christian@3286: import de.intevation.flys.artifacts.model.fixings.QWD; christian@3286: import de.intevation.flys.exports.ChartGenerator; felix@3579: import de.intevation.flys.jfree.FLYSAnnotation; christian@3286: import de.intevation.flys.jfree.StyledAreaSeriesCollection; christian@3286: import de.intevation.flys.jfree.StyledXYSeries; christian@3286: import de.intevation.flys.utils.KMIndex; raimund@3169: raimund@3169: import java.awt.BasicStroke; raimund@3169: import java.awt.Color; christian@3286: import java.util.ArrayList; christian@3286: import java.util.List; raimund@3169: raimund@3169: import org.apache.log4j.Logger; raimund@3169: import org.jfree.chart.plot.Marker; raimund@3169: import org.jfree.chart.plot.ValueMarker; christian@3286: import org.jfree.data.xy.XYSeries; raimund@3169: import org.jfree.data.xy.XYSeriesCollection; raimund@3169: import org.w3c.dom.Document; raimund@3169: raimund@3169: public class FixLongitudinalSectionGenerator christian@3406: extends FixChartGenerator raimund@3169: implements FacetTypes raimund@3169: { raimund@3169: private static Logger logger = raimund@3169: Logger.getLogger(FixLongitudinalSectionGenerator.class); raimund@3169: raimund@3169: public static final String I18N_CHART_TITLE = raimund@3169: "chart.fixings.longitudinalsection.title"; raimund@3169: raimund@3169: public static final String I18N_CHART_SUBTITLE = raimund@3169: "chart.fixings.longitudinalsection.subtitle"; raimund@3169: raimund@3169: public static final String I18N_XAXIS_LABEL = raimund@3169: "chart.fixings.longitudinalsection.xaxis.label"; raimund@3169: raimund@3169: public static final String I18N_YAXIS_LABEL = raimund@3169: "chart.fixings.longitudinalsection.yaxis.label"; raimund@3169: raimund@3169: public static final String I18N_CHART_TITLE_DEFAULT = raimund@3169: "Fixierungsanalyse"; raimund@3169: raimund@3169: public static final String I18N_XAXIS_LABEL_DEFAULT = christian@3406: "[km]"; raimund@3169: raimund@3169: public static final String I18N_YAXIS_LABEL_DEFAULT = raimund@3169: "delta W [cm]"; raimund@3169: raimund@3169: public static enum YAXIS { raimund@3169: dW(0); raimund@3169: public int idx; raimund@3169: private YAXIS(int c) { raimund@3169: idx = c; raimund@3169: } raimund@3169: } raimund@3169: raimund@3169: @Override raimund@3169: public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) { raimund@3169: String name = aaf.getFacetName(); felix@3579: logger.debug("FixLongitudinalSectionGenerator: doOut: " + name); raimund@3169: raimund@3169: if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) { raimund@3169: doSectorAverageDeviationOut(aaf, doc, visible); raimund@3169: } raimund@3169: else if (name.contains(FIX_SECTOR_AVERAGE_LS)) { raimund@3169: doSectorAverageOut(aaf, doc, visible); raimund@3169: } raimund@3169: else if (name.equals(FIX_REFERENCE_EVENTS_LS)) { raimund@3169: doReferenceEventsOut(aaf, doc, visible); raimund@3169: } raimund@3169: else if (name.equals(FIX_ANALYSIS_EVENTS_LS)) { raimund@3169: doAnalysisEventsOut(aaf, doc, visible); raimund@3169: } raimund@3169: else if (name.equals(FIX_DEVIATION_LS)) { raimund@3169: doReferenceDeviationOut(aaf, doc, visible); raimund@3169: } felix@3579: else if (name.equals(LONGITUDINAL_ANNOTATION)) { felix@3579: doAnnotations( felix@3579: (FLYSAnnotation) aaf.getData(context), felix@3579: aaf, felix@3579: doc, felix@3579: visible); felix@3579: } raimund@3169: else { raimund@3169: logger.warn("Unknown facet name " + name); raimund@3169: return; raimund@3169: } raimund@3169: } raimund@3169: christian@3286: @SuppressWarnings("unchecked") raimund@3169: protected void doSectorAverageOut( raimund@3169: ArtifactAndFacet aaf, raimund@3169: Document doc, raimund@3169: boolean visible) raimund@3169: { raimund@3169: logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex()); raimund@3169: raimund@3169: int index = aaf.getFacet().getIndex(); raimund@3169: int sectorNdx = index & 3; raimund@3169: raimund@3610: KMIndex kms = raimund@3610: (KMIndex)aaf.getData(context); raimund@3169: raimund@3169: if(kms == null) { raimund@3169: return; raimund@3169: } raimund@3169: raimund@3169: XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), doc); raimund@3169: raimund@3610: for (KMIndex.Entry entry: kms) { raimund@3169: double km = entry.getKm(); raimund@3610: AnalysisPeriod ap = entry.getValue(); raimund@3610: QWD qwd = ap.getQSectorAverages()[sectorNdx]; raimund@3169: if (qwd == null) { raimund@3169: continue; raimund@3169: } raimund@3169: double deltaW = qwd.getDeltaW(); raimund@3169: series.add(km, deltaW); raimund@3169: } raimund@3169: raimund@3169: addAxisSeries(series, 0, visible); raimund@3169: raimund@3169: } raimund@3169: raimund@3169: christian@3286: @SuppressWarnings("unchecked") raimund@3169: protected void doSectorAverageDeviationOut( raimund@3169: ArtifactAndFacet aaf, raimund@3169: Document doc, raimund@3169: boolean visible) raimund@3169: { raimund@3169: logger.debug("doSectorAverageOut" + aaf.getFacet().getIndex()); raimund@3169: raimund@3169: int index = aaf.getFacet().getIndex(); raimund@3169: int sectorNdx = index & 3; raimund@3169: raimund@3610: KMIndex kms = raimund@3610: (KMIndex)aaf.getData(context); raimund@3169: raimund@3169: if(kms == null) { raimund@3169: return; raimund@3169: } raimund@3169: raimund@3169: StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); raimund@3169: XYSeries upper = raimund@3169: new StyledXYSeries(aaf.getFacetDescription(), false, doc); raimund@3169: XYSeries lower = raimund@3169: new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc); raimund@3169: raimund@3169: raimund@3610: for (KMIndex.Entry entry: kms) { raimund@3169: double km = entry.getKm(); raimund@3610: AnalysisPeriod ap = entry.getValue(); raimund@3610: QWD qwd = ap.getQSectorAverages()[sectorNdx]; raimund@3610: double dev = ap.getQSectorStdDev(sectorNdx); raimund@3169: logger.debug("std-dev: " + dev); raimund@3169: if (qwd == null) { raimund@3169: continue; raimund@3169: } raimund@3169: double deltaW = qwd.getDeltaW(); raimund@3169: double up = deltaW + dev; raimund@3169: double lo = deltaW - dev; raimund@3169: upper.add(km, up); raimund@3169: lower.add(km, lo); raimund@3169: } raimund@3169: area.addSeries(upper); raimund@3169: area.addSeries(lower); raimund@3169: raimund@3169: addAreaSeries(area, 0, visible); raimund@3169: } raimund@3169: raimund@3169: christian@3286: @SuppressWarnings("unchecked") raimund@3169: protected void doReferenceDeviationOut( raimund@3169: ArtifactAndFacet aaf, raimund@3169: Document doc, raimund@3169: boolean visible) raimund@3169: { raimund@3169: logger.debug("doReferenceOut"); raimund@3169: raimund@3169: KMIndex kms = raimund@3169: (KMIndex)aaf.getData(context); raimund@3169: raimund@3169: if(kms == null) { raimund@3169: return; raimund@3169: } raimund@3169: raimund@3169: StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(doc); raimund@3169: XYSeries upper = raimund@3169: new StyledXYSeries(aaf.getFacetDescription(), false, doc); raimund@3169: XYSeries lower = raimund@3169: new StyledXYSeries(aaf.getFacetDescription() + " ", false, doc); raimund@3169: raimund@3169: raimund@3169: for (KMIndex.Entry entry: kms) { raimund@3169: double km = entry.getKm(); raimund@3169: double[] devArray = entry.getValue(); raimund@3169: if (devArray == null) { raimund@3169: continue; raimund@3169: } raimund@3169: double dev = devArray[0]; raimund@3169: double up = dev; raimund@3169: double lo = -dev; sascha@3215: upper.add(km, up, false); sascha@3215: lower.add(km, lo, false); raimund@3169: } raimund@3169: area.addSeries(upper); raimund@3169: area.addSeries(lower); raimund@3169: raimund@3169: Marker marker = new ValueMarker(0); raimund@3169: marker.setStroke(new BasicStroke(2)); raimund@3169: marker.setPaint(Color.BLACK); raimund@3169: addValueMarker(marker); raimund@3169: addAreaSeries(area, 0, visible); raimund@3169: } raimund@3169: christian@3286: @SuppressWarnings("unchecked") raimund@3169: protected void doAnalysisEventsOut( raimund@3169: ArtifactAndFacet aaf, raimund@3169: Document doc, raimund@3169: boolean visible) raimund@3169: { raimund@3169: logger.debug("doAnalysisEventsOut"); raimund@3169: raimund@3610: KMIndex kms = raimund@3610: (KMIndex)aaf.getData(context); raimund@3169: raimund@3169: if(kms == null) { raimund@3169: return; raimund@3169: } raimund@3169: raimund@3169: XYSeriesCollection col = new XYSeriesCollection(); raimund@3169: raimund@3610: StyledXYSeries series = new StyledXYSeries(aaf.getFacetDescription(), false, doc); raimund@3169: raimund@3610: for (KMIndex.Entry entry: kms) { raimund@3610: double km = entry.getKm(); raimund@3610: QWD qwd = entry.getValue(); raimund@3610: raimund@3610: series.add(km, qwd.getDeltaW()); raimund@3169: } raimund@3610: col.addSeries(series); raimund@3169: raimund@3169: addAxisDataset(col, 0, visible); raimund@3169: } raimund@3169: christian@3286: @SuppressWarnings("unchecked") raimund@3169: protected void doReferenceEventsOut( raimund@3169: ArtifactAndFacet aaf, raimund@3169: Document doc, raimund@3169: boolean visible) raimund@3169: { raimund@3169: logger.debug("doReferenceEventOut"); raimund@3169: raimund@3610: KMIndex kms = raimund@3610: (KMIndex)aaf.getData(context); raimund@3169: raimund@3169: if(kms == null) { raimund@3169: return; raimund@3169: } raimund@3169: raimund@3169: XYSeriesCollection col = new XYSeriesCollection(); raimund@3169: raimund@3610: StyledXYSeries series = new StyledXYSeries(aaf.getFacetDescription(), false, doc); raimund@3169: raimund@3610: for (KMIndex.Entry entry: kms) { raimund@3610: double km = entry.getKm(); raimund@3610: QWD qwd = entry.getValue(); raimund@3610: raimund@3610: series.add(km, qwd.getDeltaW()); raimund@3169: } raimund@3610: col.addSeries(series); raimund@3169: raimund@3169: addAxisDataset(col, 0, visible); raimund@3169: } raimund@3169: raimund@3169: raimund@3169: @Override raimund@3169: protected String getDefaultChartTitle() { raimund@3169: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); raimund@3169: } raimund@3169: raimund@3169: @Override raimund@3169: protected String getDefaultXAxisLabel() { raimund@3169: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); raimund@3169: } raimund@3169: raimund@3169: @Override raimund@3169: protected String getDefaultYAxisLabel(int pos) { raimund@3169: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); raimund@3169: } raimund@3169: raimund@3169: @Override raimund@3169: protected ChartGenerator.YAxisWalker getYAxisWalker() { raimund@3169: return new YAxisWalker() { raimund@3169: @Override raimund@3169: public int length() { raimund@3169: return YAXIS.values().length; raimund@3169: } raimund@3169: raimund@3169: @Override raimund@3169: public String getId(int idx) { raimund@3169: YAXIS[] yaxes = YAXIS.values(); raimund@3169: return yaxes[idx].toString(); raimund@3169: } raimund@3169: }; raimund@3169: } raimund@3169: } raimund@3169: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :