teichmann@5831: package org.dive4elements.river.exports.fixings; raimund@3169: raimund@3169: import java.awt.BasicStroke; raimund@3169: import java.awt.Color; 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; christian@3770: import org.w3c.dom.Document; sascha@3612: teichmann@5831: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriod; teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.QWD; teichmann@5831: import org.dive4elements.river.exports.ChartGenerator; teichmann@5831: import org.dive4elements.river.exports.process.KMIndexProcessor; teichmann@5831: import org.dive4elements.river.exports.process.Processor; teichmann@5831: import org.dive4elements.river.jfree.FLYSAnnotation; teichmann@5831: import org.dive4elements.river.jfree.StyledAreaSeriesCollection; teichmann@5831: import org.dive4elements.river.jfree.StyledXYSeries; teichmann@5831: import org.dive4elements.river.utils.KMIndex; raimund@3169: raimund@3169: public class FixLongitudinalSectionGenerator bjoern@4446: extends FixChartGenerator raimund@3169: implements FacetTypes raimund@3169: { raimund@3169: private static Logger logger = christian@3770: Logger.getLogger(FixLongitudinalSectionGenerator.class); raimund@3169: raimund@3169: public static final String I18N_CHART_TITLE = christian@3770: "chart.fixings.longitudinalsection.title"; raimund@3169: raimund@3169: public static final String I18N_CHART_SUBTITLE = christian@3770: "chart.fixings.longitudinalsection.subtitle"; raimund@3169: raimund@3169: public static final String I18N_XAXIS_LABEL = christian@3770: "chart.fixings.longitudinalsection.xaxis.label"; raimund@3169: raimund@3169: public static final String I18N_CHART_TITLE_DEFAULT = christian@3770: "Fixierungsanalyse"; raimund@3169: raimund@3169: public static final String I18N_XAXIS_LABEL_DEFAULT = christian@3770: "[km]"; raimund@3169: bjoern@4446: public static final String I18N_DW_YAXIS_LABEL_DEFAULT = bjoern@4446: "delta W [cm]"; bjoern@4446: bjoern@4446: public static final String I18N_DW_YAXIS_LABEL = bjoern@4446: "chart.fixings.longitudinalsection.yaxis.label"; 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: bjoern@4446: Processor processor = new KMIndexProcessor(); raimund@3169: if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) { raimund@3169: doSectorAverageDeviationOut(aaf, doc, visible); raimund@3169: } bjoern@4446: else if (processor.canHandle(name)) { bjoern@4446: processor.doOut(this, aaf, doc, visible, YAXIS.dW.idx); 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( christian@3770: (FLYSAnnotation) aaf.getData(context), christian@3770: aaf, christian@3770: doc, christian@3770: visible); christian@3770: } christian@3770: else if (FacetTypes.IS.MANUALPOINTS(name)) { christian@3770: doPoints (aaf.getData(context), christian@3770: aaf, christian@3770: doc, visible, YAXIS.dW.idx); felix@3579: } raimund@3169: else { raimund@3169: logger.warn("Unknown facet name " + name); raimund@3169: } raimund@3169: } raimund@3169: christian@3286: @SuppressWarnings("unchecked") raimund@3169: protected void doSectorAverageDeviationOut( christian@3770: ArtifactAndFacet aaf, christian@3770: Document doc, christian@3770: 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 = christian@3770: (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 = christian@3770: new StyledXYSeries(aaf.getFacetDescription(), false, doc); raimund@3169: XYSeries lower = christian@3770: new StyledXYSeries(aaf.getFacetDescription() + " ", false, 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@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( christian@3770: ArtifactAndFacet aaf, christian@3770: Document doc, christian@3770: boolean visible) raimund@3169: { raimund@3169: logger.debug("doReferenceOut"); raimund@3169: raimund@3169: KMIndex kms = christian@3770: (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 = christian@3770: new StyledXYSeries(aaf.getFacetDescription(), false, doc); raimund@3169: XYSeries lower = christian@3770: 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: 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) { bjoern@4377: return msg(I18N_DW_YAXIS_LABEL, I18N_DW_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 christian@3770: 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 :