raimund@3169: package de.intevation.flys.exports.fixings; raimund@3169: raimund@3169: import java.util.List; raimund@3169: import java.util.ArrayList; raimund@3169: raimund@3169: import java.awt.BasicStroke; raimund@3169: import java.awt.Color; raimund@3169: raimund@3169: import de.intevation.artifactdatabase.state.ArtifactAndFacet; raimund@3169: raimund@3169: import de.intevation.flys.artifacts.model.FacetTypes; raimund@3169: raimund@3169: import de.intevation.flys.artifacts.model.fixings.DateRange; raimund@3169: import de.intevation.flys.artifacts.model.fixings.FixFunction; raimund@3169: import de.intevation.flys.artifacts.model.fixings.FixWQCurveFacet; raimund@3169: import de.intevation.flys.artifacts.model.fixings.QW; raimund@3169: import de.intevation.flys.artifacts.model.fixings.QWD; raimund@3169: import de.intevation.flys.artifacts.model.fixings.AnalysisPeriod; raimund@3169: raimund@3169: import de.intevation.flys.exports.ChartGenerator; raimund@3169: import de.intevation.flys.exports.XYChartGenerator; raimund@3169: raimund@3169: import de.intevation.flys.jfree.Function2DAdapter; raimund@3169: import de.intevation.flys.jfree.StyledXYSeries; raimund@3169: import de.intevation.flys.jfree.StyledAreaSeriesCollection; raimund@3169: raimund@3169: import de.intevation.flys.utils.KMIndex; raimund@3169: raimund@3169: import org.apache.log4j.Logger; raimund@3169: raimund@3169: import org.jfree.data.general.DatasetUtilities; raimund@3169: raimund@3169: import org.jfree.data.xy.XYSeries; raimund@3169: import org.jfree.chart.plot.Marker; raimund@3169: import org.jfree.chart.plot.ValueMarker; raimund@3169: import org.jfree.data.xy.XYSeriesCollection; raimund@3169: raimund@3169: import org.w3c.dom.Document; raimund@3169: raimund@3169: public class FixLongitudinalSectionGenerator raimund@3169: extends XYChartGenerator 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 = raimund@3169: "[m]"; 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(); raimund@3169: logger.debug("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: } raimund@3169: else { raimund@3169: logger.warn("Unknown facet name " + name); raimund@3169: return; raimund@3169: } raimund@3169: } raimund@3169: 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: int periodNdx = index >> 2; 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: XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), doc); raimund@3169: raimund@3169: for (KMIndex.Entry entry: kms) { raimund@3169: double km = entry.getKm(); raimund@3169: AnalysisPeriod[] ap = entry.getValue(); raimund@3169: QWD qwd = ap[periodNdx].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: 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: int periodNdx = index >> 2; 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: AnalysisPeriod[] ap = entry.getValue(); raimund@3169: QWD qwd = ap[periodNdx].getQSectorAverages()[sectorNdx]; raimund@3169: double dev = ap[periodNdx].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: 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; 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: 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: 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: int index = aaf.getFacet().getIndex(); raimund@3169: int sectorNdx = index & 3; raimund@3169: int periodNdx = index >> 2; 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: XYSeriesCollection col = new XYSeriesCollection(); raimund@3169: raimund@3169: List series = new ArrayList(); raimund@3169: raimund@3169: for (KMIndex.Entry entry: kms) { raimund@3169: double km = entry.getKm(); raimund@3169: AnalysisPeriod[] ap = entry.getValue(); raimund@3169: QWD[] qwds = ap[periodNdx].getQWDs(); raimund@3169: raimund@3169: String space = ""; raimund@3169: for (int i = 0; i < qwds.length; i++) { raimund@3169: if (series.size() <= i && qwds.length > i) { raimund@3169: StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc); raimund@3169: series.add (s); raimund@3169: } raimund@3169: StyledXYSeries s = series.get(i); raimund@3169: s.add(km, qwds[i].getDeltaW()); raimund@3169: space+= " "; raimund@3169: } raimund@3169: } raimund@3169: for (StyledXYSeries s: series) { raimund@3169: col.addSeries(s); raimund@3169: } raimund@3169: raimund@3169: addAxisDataset(col, 0, visible); raimund@3169: } raimund@3169: 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@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: XYSeriesCollection col = new XYSeriesCollection(); raimund@3169: raimund@3169: List series = new ArrayList(); raimund@3169: raimund@3169: for (KMIndex.Entry entry: kms) { raimund@3169: double km = entry.getKm(); raimund@3169: QWD[] qwds = entry.getValue(); raimund@3169: raimund@3169: String space = ""; raimund@3169: for (int i = 0; i < qwds.length; i++) { raimund@3169: if (series.size() <= i && qwds.length > i) { raimund@3169: StyledXYSeries s = new StyledXYSeries(aaf.getFacetDescription() + space, false, doc); raimund@3169: series.add (s); raimund@3169: } raimund@3169: StyledXYSeries s = series.get(i); raimund@3169: s.add(km, qwds[i].getDeltaW()); raimund@3169: space += " "; raimund@3169: } raimund@3169: } raimund@3169: for (StyledXYSeries s: series) { raimund@3169: col.addSeries(s); raimund@3169: } 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 :