changeset 9360:ddcd52d239cd

Outliers in fixation calculation are now shown within the other 'B' event themes and get a separate symbol (triangle). Removed old outliers theme. Also consider showpoints property. Also consider pointsize property.
author gernotbelger
date Wed, 01 Aug 2018 17:13:52 +0200 (2018-08-01)
parents df6f1b5806f6
children 2aec052d4088
files artifacts/doc/conf/artifacts/bundu.xml artifacts/doc/conf/artifacts/fixanalysis.xml artifacts/doc/conf/themes.xml artifacts/doc/conf/themes/default.xml artifacts/doc/conf/themes/second.xml artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstState.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/Fitting.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixLongitudinalReferenceFacet.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixOutlierFacet.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixReferenceEventsFacet.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/services/QWSeriesCollection.java artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixAnalysisCompute.java artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java artifacts/src/main/java/org/dive4elements/river/exports/fixings/DeltaWtExporter.java artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixDeltaWtGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/process/FixWQProcessor.java artifacts/src/main/java/org/dive4elements/river/java2d/ShapeUtils.java artifacts/src/main/java/org/dive4elements/river/jfree/StyledTimeSeries.java artifacts/src/main/java/org/dive4elements/river/jfree/XYStyle.java artifacts/src/main/java/org/dive4elements/river/utils/KMIndex.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties
diffstat 29 files changed, 234 insertions(+), 645 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/bundu.xml	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/doc/conf/artifacts/bundu.xml	Wed Aug 01 17:13:52 2018 +0200
@@ -145,7 +145,6 @@
             <facet name="fix_reference_events_wq" description="Raw event values used in the calculation" />
             <facet name="fix_wq_curve" description="WQ curve" />
             <facet name="qsectors" description="qsectors." />
-            <facet name="fix_outlier" description="The outliers" />
             <facet name="other.wqkms.q" description="W-Type of data" />
             <facet name="other.wqkms.w" description="W-Type of data" />
             <facet name="other.wkms" description="facet.other.wkms" />
@@ -262,7 +261,6 @@
             <facet name="fix_analysis_events_wq" description="Raw event values used in the calculation" />
             <facet name="fix_wq_curve" description="WQ curve" />
             <facet name="fix_wq_ls" description="WQ LS curve" />
-            <facet name="fix_outlier" description="The outliers" />
             <facet name="qsectors" description="qsectors." />
             <facet name="fix_events_wqkms" description="WQKMS-Type of data" />
             <facet name="other.wqkms.q" description="W-Type of data" />
--- a/artifacts/doc/conf/artifacts/fixanalysis.xml	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/doc/conf/artifacts/fixanalysis.xml	Wed Aug 01 17:13:52 2018 +0200
@@ -137,7 +137,6 @@
             <facet name="fix_reference_events_wq" description="Raw event values used in the calculation" />
             <facet name="fix_wq_curve" description="WQ curve" />
             <facet name="qsectors" description="qsectors." />
-            <facet name="fix_outlier" description="The outliers" />
             <facet name="other.wqkms.q" description="W-Type of data" />
             <facet name="other.wqkms.w" description="W-Type of data" />
             <facet name="other.wkms" description="facet.other.wkms" />
@@ -254,7 +253,6 @@
             <facet name="fix_analysis_events_wq" description="Raw event values used in the calculation" />
             <facet name="fix_wq_curve" description="WQ curve" />
             <facet name="fix_wq_ls" description="WQ LS curve" />
-            <facet name="fix_outlier" description="The outliers" />
             <facet name="qsectors" description="qsectors." />
             <facet name="fix_events_wqkms" description="WQKMS-Type of data" />
             <facet name="other.wqkms.q" description="W-Type of data" />
--- a/artifacts/doc/conf/themes.xml	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/doc/conf/themes.xml	Wed Aug 01 17:13:52 2018 +0200
@@ -324,7 +324,6 @@
         <mapping from="fix_sector_average_wq_2" to="FixingSectorAverageWQ2" />
         <mapping from="fix_sector_average_wq_3" to="FixingSectorAverageWQ3" />
         <mapping from="fix_analysis_events_wq" to="FixingAnalysisEventsWQ" />
-        <mapping from="fix_outlier" to="FixingOutliers" />
         <mapping from="fix_wq_curve" to="FixingWQCurve" />
         <mapping from="fix_wq_ls" to="FixingCalculatedPoint" />
         <mapping from="fix_reference_events_wq" to="FixingReferenceEvents" />
--- a/artifacts/doc/conf/themes/default.xml	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/doc/conf/themes/default.xml	Wed Aug 01 17:13:52 2018 +0200
@@ -1736,14 +1736,6 @@
     </fields>
   </theme>
 
-  <theme name="FixingOutliers">
-    <inherits>
-      <inherit from="FixPoints" />
-    </inherits>
-    <fields>
-    </fields>
-  </theme>
-
   <theme name="FixingDeltaWtAverage">
     <inherits>
       <inherit from="FixLines" />
--- a/artifacts/doc/conf/themes/second.xml	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/doc/conf/themes/second.xml	Wed Aug 01 17:13:52 2018 +0200
@@ -1736,14 +1736,6 @@
     </fields>
   </theme>
 
-  <theme name="FixingOutliers">
-    <inherits>
-      <inherit from="FixPoints" />
-    </inherits>
-    <fields>
-    </fields>
-  </theme>
-
   <theme name="FixingDeltaWtAverage">
     <inherits>
       <inherit from="FixLines" />
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstState.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstState.java	Wed Aug 01 17:13:52 2018 +0200
@@ -32,9 +32,7 @@
     /** The log used in this class. */
     private static Logger log = Logger.getLogger(BezugswstState.class);
 
-    public static final String I18N_WQ_CURVE = "fix.vollmer.wq.curve";
-
-    public static final String I18N_WQ_OUTLIER = "fix.vollmer.wq.outliers";
+    private static final String I18N_WQ_CURVE = "fix.vollmer.wq.curve";
 
     /**
      * The default constructor that initializes an empty State object.
@@ -131,9 +129,6 @@
         // facets.add(new FixWQCurveFacet(0, Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE) + " (" + access.getFunction()
         // + ")"));
         //
-        // if (access.getPreprocessing()) {
-        // facets.add(new FixOutlierFacet(0, FIX_OUTLIER, Resources.getMsg(meta, I18N_WQ_OUTLIER, I18N_WQ_OUTLIER)));
-        // }
         return compute((BUNDUArtifact) artifact, context, hash, facets, old);
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java	Wed Aug 01 17:13:52 2018 +0200
@@ -406,7 +406,6 @@
 
     String FIX_WQ_CURVE = "fix_wq_curve";
     String FIX_WQ_LS = "fix_wq_ls";
-    String FIX_OUTLIER = "fix_outlier";
 
     String FIX_ANALYSIS_PERIODS_DWT = "fix_analysis_periods_dwt";
     String FIX_ANALYSIS_PERIODS_LS = "fix_analysis_periods_ls";
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/Fitting.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/Fitting.java	Wed Aug 01 17:13:52 2018 +0200
@@ -27,73 +27,44 @@
 
     /** Use instance of this factory to find meta infos for outliers. */
     public interface QWDFactory {
-        QWD create(double q, double w, boolean isOutlier);
+        QWD create(double q, double w, double deltaW, boolean isOutlier);
     }
 
-    private final boolean checkOutliers;
-    
-    private final Function function;
-    
-    private final QWDFactory qwdFactory;
-    
-    private double chiSqr;
-    
-    private double[] parameters;
-    
-    private final List<QWD> removed = new ArrayList<>();
-    
-    private QWD[] referenced;
-    
-    private double standardDeviation;
+    private final double chiSqr;
 
-    public Fitting(Function function, QWDFactory qwdFactory, boolean checkOutliers) {
-        this.function = function;
-        this.qwdFactory = qwdFactory;
-        this.checkOutliers = checkOutliers;
-    }
+    private final double[] parameters;
 
-    public Function getFunction() {
-        return function;
-    }
+    private final double standardDeviation;
 
-    public boolean getCheckOutliers() {
-        return checkOutliers;
+    private final List<QWD> qwds;
+
+    public Fitting(final double[] parameters, final double standardDeviation, final double chiSqr, final List<QWD> qwds) {
+        this.parameters = parameters;
+        this.standardDeviation = standardDeviation;
+        this.chiSqr = chiSqr;
+        this.qwds = qwds;
     }
 
     public double getChiSquare() {
         return chiSqr;
     }
 
-    public void reset() {
-        chiSqr = 0.0;
-        parameters = null;
-        removed.clear();
-        referenced = null;
-        standardDeviation = 0.0;
-    }
-
-    public boolean hasOutliers() {
-        return !removed.isEmpty();
-    }
-
-    public QWD[] outliersToArray() {
-        return removed.toArray(new QWD[removed.size()]);
-    }
-
-    public QWD[] referencedToArray() {
-        return referenced != null ? (QWD[]) referenced.clone() : null;
+    /**
+     * Returns all referenced and outliers as one array.
+     */
+    public QWD[] getFixingsArray() {
+        return qwds.toArray(new QWD[qwds.size()]);
     }
 
     public double getMaxQ() {
         double maxQ = -Double.MAX_VALUE;
-        if (referenced != null) {
-            for (QWI qw : referenced) {
-                double q = qw.getQ();
-                if (q > maxQ) {
-                    maxQ = q;
-                }
-            }
+
+        for (QWD qw : qwds) {
+            final double q = qw.getQ();
+            if (!qw.isOutlier() && q > maxQ)
+                maxQ = q;
         }
+
         return maxQ;
     }
 
@@ -105,10 +76,10 @@
         return standardDeviation;
     }
 
-    public boolean fit(double[] qs, double[] ws) {
+    public static Fitting fit(final Function function, final QWDFactory qwdFactory, final boolean checkOutliers, final double[] qs, final double[] ws) {
 
-        TDoubleArrayList xs = new TDoubleArrayList(qs.length);
-        TDoubleArrayList ys = new TDoubleArrayList(ws.length);
+        final TDoubleArrayList xs = new TDoubleArrayList(qs.length);
+        final TDoubleArrayList ys = new TDoubleArrayList(ws.length);
 
         for (int i = 0; i < qs.length; ++i) {
             if (!Double.isNaN(qs[i]) && !Double.isNaN(ws[i])) {
@@ -119,14 +90,16 @@
 
         if (xs.size() < 2) {
             log.warn("Too less points.");
-            return false;
+            return null;
         }
 
-        List<Double> inputs = new ArrayList<Double>(xs.size());
+        final List<Double> inputs = new ArrayList<>(xs.size());
+        final List<QWD> qwds = new ArrayList<>(xs.size());
+        final List<QWD> outliers = new ArrayList<>(xs.size());
 
         org.dive4elements.river.artifacts.math.Function instance = null;
-
         LevenbergMarquardtOptimizer lmo = null;
+        double[] parameters = null;
 
         for (;;) {
             parameters = null;
@@ -149,10 +122,11 @@
                 }
                 catch (MathException me) {
                     if (log.isDebugEnabled()) {
-                        log.debug("tolerance " + tolerance + " + failed.");
+                        log.debug("tolerance " + tolerance + " + failed.", me);
                     }
                 }
             }
+
             if (parameters == null) {
                 /*
                  * log.debug("Parameters is null");
@@ -160,15 +134,14 @@
                  * log.debug("DATA: " + xs.getQuick(i) + " " + ys.getQuick(i));
                  * }
                  */
-                return false;
+                return null;
             }
 
             // This is the paraterized function for a given km.
             instance = function.instantiate(parameters);
 
-            if (!checkOutliers) {
+            if (!checkOutliers)
                 break;
-            }
 
             inputs.clear();
 
@@ -180,38 +153,46 @@
                 inputs.add(Double.valueOf(ys.getQuick(i) - y));
             }
 
-            Integer outlier = GrubbsOutlier.findOutlier(inputs);
-
-            if (outlier == null) {
+            final Integer outlier = GrubbsOutlier.findOutlier(inputs);
+            if (outlier == null)
                 break;
-            }
 
-            int idx = outlier.intValue();
-            removed.add(qwdFactory.create(xs.getQuick(idx), ys.getQuick(idx), true));
+            final int idx = outlier.intValue();
+            outliers.add(qwdFactory.create(xs.getQuick(idx), ys.getQuick(idx), Double.NaN, true));
             xs.remove(idx);
             ys.remove(idx);
         }
-
-        StandardDeviation stdDev = new StandardDeviation();
-
-        referenced = new QWD[xs.size()];
-        for (int i = 0; i < referenced.length; ++i) {
-            QWD qwd = qwdFactory.create(xs.getQuick(i), ys.getQuick(i), false);
+        
+        for (QWD outlier : outliers) {
+            
+            final double w = outlier.getW();
+            final double q = outlier.getQ();
+            
+            final double dw = (w - instance.value(q)) * 100.0;
 
-            if (qwd == null) {
-                log.warn("QW creation failed!");
-            } else {
-                referenced[i] = qwd;
-                double dw = (qwd.getW() - instance.value(qwd.getQ())) * 100.0;
-                qwd.setDeltaW(dw);
-                stdDev.increment(dw);
-            }
+            outlier.setDeltaW(dw);
+            
+            qwds.add(outlier);
         }
 
-        standardDeviation = stdDev.getResult();
+        final StandardDeviation stdDev = new StandardDeviation();
 
-        chiSqr = lmo.getChiSquare();
+        for (int i = 0; i < xs.size(); ++i) {
 
-        return true;
+            final QWD qwd = qwdFactory.create(xs.getQuick(i), ys.getQuick(i), Double.NaN, false);
+
+            double dw = (qwd.getW() - instance.value(qwd.getQ())) * 100.0;
+            qwd.setDeltaW(dw);
+            
+            qwds.add(qwd);
+            
+            stdDev.increment(dw);
+        }
+
+        final double standardDeviation = stdDev.getResult();
+
+        final double chiSqr = lmo.getChiSquare();
+
+        return new Fitting(parameters, standardDeviation, chiSqr, qwds);
     }
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisCalculation.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisCalculation.java	Wed Aug 01 17:13:52 2018 +0200
@@ -97,8 +97,7 @@
 
         FixAnalysisResult far = new FixAnalysisResult(
             fitResult.getParameters(),
-            fitResult.getReferenced(),
-            fitResult.getOutliers(),
+            fitResult.getFixings(),
             analysisPeriods);
 
         // Workaraound to deal with same dates in data set
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisResult.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisResult.java	Wed Aug 01 17:13:52 2018 +0200
@@ -33,11 +33,10 @@
 
     public FixAnalysisResult(
         Parameters                 parameters,
-        KMIndex<QWD []>            referenced,
-        KMIndex<QWD []>            outliers,
+        KMIndex<QWD []>            fixings,
         KMIndex<AnalysisPeriod []> analysisPeriods
     ) {
-        super(parameters, referenced, outliers);
+        super(parameters, fixings);
         this.analysisPeriods = analysisPeriods;
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixLongitudinalReferenceFacet.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixLongitudinalReferenceFacet.java	Wed Aug 01 17:13:52 2018 +0200
@@ -79,7 +79,7 @@
 
             FixAnalysisResult result = (FixAnalysisResult) res.getData();
 
-            KMIndex<QWD []> kmReference = result.getReferenced();
+            KMIndex<QWD []> kmReference = result.getFixings();
 
             if (kmReference == null) {
                 log.warn("No references found.");
@@ -87,25 +87,25 @@
             }
 
             int qwdNdx = index & 255;
-            KMIndex<QWD> resReference =
-                    new KMIndex<QWD>();
+            
+            final KMIndex<QWD> resReference = new KMIndex<>();
+            
             for (KMIndex.Entry<QWD[]> entry: kmReference) {
                 QWD[] qwds = entry.getValue();
                 for(int i = 0; i < qwds.length; i++) {
-                    if(qwds[i].getIndex() == qwdNdx) {
+                    if(qwds[i].getIndex() == qwdNdx && !qwds[i].isOutlier() ) {
                         resReference.add(entry.getKm(), qwds[i]);
                     }
                 }
             }
+
             return resReference;
         }
-        else {
-            log.warn("Artifact is no instance of D4EArtifact.");
-            return null;
-        }
+        
+        log.warn("Artifact is no instance of D4EArtifact.");
+        return null;
     }
 
-
     /**
      * Create a deep copy of this Facet.
      * @return a deep copy.
@@ -117,5 +117,4 @@
         copy.set(this);
         return copy;
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixOutlierFacet.java	Wed Aug 01 13:21:34 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
- * Software engineering by Intevation GmbH
- *
- * This file is Free Software under the GNU AGPL (>=v3)
- * and comes with ABSOLUTELY NO WARRANTY! Check out the
- * documentation coming with Dive4Elements River for details.
- */
-
-package org.dive4elements.river.artifacts.model.fixings;
-
-import org.apache.log4j.Logger;
-
-import org.dive4elements.artifacts.Artifact;
-import org.dive4elements.artifacts.CallContext;
-import org.dive4elements.river.artifacts.D4EArtifact;
-import org.dive4elements.river.artifacts.model.CalculationResult;
-import org.dive4elements.river.artifacts.model.FacetTypes;
-import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
-import org.dive4elements.river.utils.KMIndex;
-
-/**
- * Facet to show the outliers in a fix calculation.
- *
- * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
- */
-public class FixOutlierFacet
-extends      FixingsFacet
-implements   FacetTypes {
-
-    /** House log. */
-    private static Logger log = Logger.getLogger(FixOutlierFacet.class);
-
-    /** Trivial Constructor. */
-    public FixOutlierFacet() {
-    }
-
-
-    /**
-     * @param name
-     */
-    public FixOutlierFacet(String name, String description) {
-        super(0, name, description, ComputeType.ADVANCE, null, null);
-    }
-
-    public FixOutlierFacet(int index, String name, String description) {
-        super(index, name, description, ComputeType.ADVANCE, null, null);
-    }
-
-
-    /**
-     * Returns the data this facet requires.
-     *
-     * @param artifact the owner artifact; needs to be a D4EArtifact.
-     * @param context  the CallContext; required to retrieve the value of
-     * <i>currentKm</i>.
-     *
-     * @return an array of QW objects or null.
-     */
-    @Override
-    public Object getData(Artifact artifact, CallContext context) {
-        log.debug("FixOutlierFacet.getData");
-
-        if (artifact instanceof D4EArtifact) {
-            D4EArtifact flys = (D4EArtifact)artifact;
-
-            CalculationResult res =
-                (CalculationResult) flys.compute(context,
-                                                 ComputeType.ADVANCE,
-                                                 false);
-
-            FixResult result = (FixResult) res.getData();
-            double currentKm = getCurrentKm(context);
-
-            KMIndex<QWD []>       kmQWs    = result.getOutliers();
-            KMIndex.Entry<QWD []> qwsEntry = kmQWs.binarySearch(currentKm);
-
-            QWI [] qws = null;
-            if (qwsEntry != null) {
-                qws = qwsEntry.getValue();
-
-                if (log.isDebugEnabled()) {
-                    log.debug("Found " + (qws != null ? qws.length : 0)
-                        + " KMIndex.Entry for km " + currentKm);
-                }
-            }
-            else {
-                log.debug("Found no KMIndex.Entry for km " + currentKm);
-            }
-
-            return qws;
-        }
-
-        log.warn("Not an instance of D4EArtifact.");
-        return null;
-    }
-
-
-    /**
-     * Create a deep copy of this Facet.
-     * @return a deep copy.
-     */
-    @Override
-    public FixOutlierFacet deepCopy() {
-        FixOutlierFacet copy = new FixOutlierFacet();
-        copy.set(this);
-        return copy;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java	Wed Aug 01 17:13:52 2018 +0200
@@ -133,15 +133,10 @@
         }
 
         // Name the curves.
-        for (int i = 0; i < results.length; ++i) {
+        for (int i = 0; i < results.length; ++i)
             results[i].setName(createName(i));
-        }
 
-        FixRealizingResult frr = new FixRealizingResult(
-            parameters,
-            fitResult.getReferenced(),
-            fitResult.getOutliers(),
-            results);
+        final FixRealizingResult frr = new FixRealizingResult( parameters, fitResult.getFixings(), results);
 
         return new CalculationResult(frr, this);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingResult.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingResult.java	Wed Aug 01 17:13:52 2018 +0200
@@ -27,11 +27,10 @@
 
     public FixRealizingResult(
         Parameters      parameters,
-        KMIndex<QWD []> referenced,
-        KMIndex<QWD []> outliers,
+        KMIndex<QWD []> fixings,
         WQKms []        wqkms
     ) {
-        super(parameters, referenced, outliers);
+        super(parameters, fixings);
         this.wqkms = wqkms;
     }
 
@@ -43,5 +42,4 @@
     public void setWQKms(WQKms [] wqkms) {
         this.wqkms = wqkms;
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixReferenceEventsFacet.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixReferenceEventsFacet.java	Wed Aug 01 17:13:52 2018 +0200
@@ -61,24 +61,12 @@
         final FixResult result = (FixResult) res.getData();
         final double currentKm = getCurrentKm(context);
 
-        if (log.isDebugEnabled()) {
+        if (log.isDebugEnabled())
             log.debug("current km in FRE: " + currentKm);
-        }
 
         /* first search in referenced */
-        final KMIndex<QWD[]> referenced = result.getReferenced();
-        final QWD foundReferenced = find(referenced, currentKm);
-        if (foundReferenced != null)
-            return foundReferenced;
-
-        // FIXME
-//        /* also search in outliers, should be mutually exclusive, because outliers got removed from referenced */
-//        final KMIndex<QWD[]> outliers = result.getOutliers();
-//        final QWD foundOutlier = find(outliers, currentKm);
-//        if (foundOutlier != null)
-//            return foundOutlier;
-
-        return null;
+        final KMIndex<QWD[]> referenced = result.getFixings();
+        return find(referenced, currentKm);
     }
 
     private QWD find(final KMIndex<QWD[]> kmQWs, final double currentKm) {
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixResult.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixResult.java	Wed Aug 01 17:13:52 2018 +0200
@@ -8,11 +8,6 @@
 
 package org.dive4elements.river.artifacts.model.fixings;
 
-import org.apache.log4j.Logger;
-import org.dive4elements.river.artifacts.model.Parameters;
-
-import org.dive4elements.river.utils.KMIndex;
-
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Date;
@@ -20,117 +15,72 @@
 import java.util.TreeMap;
 import java.util.TreeSet;
 
-public class FixResult
-implements   Serializable
+import org.dive4elements.river.artifacts.model.Parameters;
+import org.dive4elements.river.utils.KMIndex;
+
+public class FixResult implements Serializable
 {
-    private static Logger log =
-        Logger.getLogger(FixResult.class);
+    private static final long serialVersionUID = 1L;
 
     protected Parameters      parameters;
-    protected KMIndex<QWD []> referenced;
-    protected KMIndex<QWD []> outliers;
+    protected KMIndex<QWD []> fixings;
 
     public FixResult() {
     }
 
-    public FixResult(
-        Parameters      parameters,
-        KMIndex<QWD []> referenced,
-        KMIndex<QWD []> outliers
-    ) {
+    public FixResult( final Parameters parameters, final KMIndex<QWD []> fixings ) {
         this.parameters = parameters;
-        this.referenced = referenced;
-        this.outliers   = outliers;
+        this.fixings = fixings;
     }
 
-    public KMIndex<QWD []> getReferenced() {
-        return referenced;
+    public KMIndex<QWD []> getFixings() {
+        return fixings;
     }
 
-    public void setReferenced(KMIndex<QWD []> referenced) {
-        this.referenced = referenced;
-    }
-
-    public void makeReferenceEventsDatesUnique() {
+    public void makeEventsDatesUnique() {
         final DateUniqueMaker dum = new DateUniqueMaker();
         
-        for (KMIndex.Entry<QWD []> entry: referenced) {
+        for (KMIndex.Entry<QWD []> entry: fixings) {
             for (QWD ref: entry.getValue())
                 dum.makeUnique(ref);
         }
-
-        // FIXME
-//        for (KMIndex.Entry<QWD []> entry: outliers) {
-//            for (QWD ref: entry.getValue())
-//                dum.makeUnique(ref);
-//        }
     }
 
-    private Collection<Integer> getReferenceEventsIndices() {
+    private Collection<Integer> getEventsIndices() {
         final TreeMap<Date, Integer> dates = new TreeMap<>();
         
-        for (KMIndex.Entry<QWD []> entry: referenced) {
+        for (KMIndex.Entry<QWD []> entry: fixings) {
             for (QWD value: entry.getValue())
                 dates.put(value.date, value.index);
         }
-// FIXME
-//        for (KMIndex.Entry<QWD []> entry: outliers) {
-//            for (QWD value: entry.getValue())
-//                dates.put(value.date, value.index);
-//        }
         
         return dates.values();
     }
 
-    public void remapReferenceIndicesToRank() {
+    public void remapEventIndicesToRank() {
         final RankRemapper remapper = new RankRemapper();
-        for (Integer idx: getReferenceEventsIndices())
+        for (Integer idx: getEventsIndices())
             remapper.toMap(idx);
-        
-        for (KMIndex.Entry<QWD []> entry: referenced) {
+
+        for (KMIndex.Entry<QWD []> entry: fixings) {
             for (QWD value: entry.getValue())
                 remapper.remap(value);
         }
-// FIXME
-//        for (KMIndex.Entry<QWD []> entry: outliers) {
-//            for (QWD value: entry.getValue())
-//                remapper.remap(value);
-//        }
     }
 
     public Collection<Date> getReferenceEventsDates() {
         
         final Set<Date> dates = new TreeSet<>();
         
-        for (final KMIndex.Entry<QWD []> entry: referenced) {
+        for (final KMIndex.Entry<QWD []> entry: fixings) {
             for (final QWD qwd: entry.getValue())
                 dates.add(qwd.date);
         }
         
-        // FIXME, but not always...
-//        for (final KMIndex.Entry<QWD []> entry: outliers) {
-//            for (final QWD qwd: entry.getValue())
-//                dates.add(qwd.date);
-//        }
-        
         return dates;
     }
 
-
-    public KMIndex<QWD []> getOutliers() {
-        return outliers;
-    }
-
-    public void setOutliers(KMIndex<QWD []> outliers) {
-        this.outliers = outliers;
-    }
-
     public Parameters getParameters() {
         return parameters;
     }
-
-    public void setParameters(Parameters parameters) {
-        this.parameters = parameters;
-    }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/QWSeriesCollection.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/QWSeriesCollection.java	Wed Aug 01 17:13:52 2018 +0200
@@ -101,7 +101,7 @@
 
         final boolean interpolated = qw.getInterpolated();
 
-        final Shape shape = FixWQCurveGenerator.getWQDShape(qw);
+        final Shape shape = FixWQCurveGenerator.getWQDShape(qw, 4);
 
         final boolean filled = !interpolated;
         return new ShapeRenderer.Entry(shape, Color.blue, filled);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixAnalysisCompute.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixAnalysisCompute.java	Wed Aug 01 17:13:52 2018 +0200
@@ -36,7 +36,6 @@
 import org.dive4elements.river.artifacts.model.fixings.FixLongitudinalAvSectorFacet;
 import org.dive4elements.river.artifacts.model.fixings.FixLongitudinalDeviationFacet;
 import org.dive4elements.river.artifacts.model.fixings.FixLongitudinalReferenceFacet;
-import org.dive4elements.river.artifacts.model.fixings.FixOutlierFacet;
 import org.dive4elements.river.artifacts.model.fixings.FixReferenceEventsFacet;
 import org.dive4elements.river.artifacts.model.fixings.FixWQCurveFacet;
 import org.dive4elements.river.artifacts.resources.Resources;
@@ -58,8 +57,6 @@
 
     private static final String I18N_DERIVATIVE = "fix.derivative";
 
-    private static final String I18N_OUTLIER = "fix.outlier";
-
     private static final String I18N_ANALYSIS = "fix.analysis.short";
 
     private static final String I18N_DEVIATION = "fix.deviation";
@@ -228,16 +225,9 @@
 
         facets.add(new FixWQCurveFacet(idg.next(), "W/Q"));
 
-        final Boolean preprocessing = access.getPreprocessing();
-
-        if (preprocessing != null && preprocessing) {
-            facets.add(new FixOutlierFacet(idg.next(), FIX_OUTLIER, Resources.getMsg(context.getMeta(), I18N_OUTLIER, I18N_OUTLIER)));
-        }
-
         facets.add(new FixDerivateFacet(idg.next(), FIX_DERIVATE_CURVE, Resources.getMsg(context.getMeta(), I18N_DERIVATIVE, I18N_DERIVATIVE)));
 
         facets.add(new FixDeviationFacet(idg.next(), FIX_DEVIATION_DWT, Resources.getMsg(context.getMeta(), I18N_DEVIATION, I18N_DEVIATION)));
         return res;
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java	Wed Aug 01 17:13:52 2018 +0200
@@ -26,7 +26,6 @@
 import org.dive4elements.river.artifacts.model.ReportFacet;
 import org.dive4elements.river.artifacts.model.WQCKms;
 import org.dive4elements.river.artifacts.model.WQKms;
-import org.dive4elements.river.artifacts.model.fixings.FixOutlierFacet;
 import org.dive4elements.river.artifacts.model.fixings.FixRealizingCalculation;
 import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult;
 import org.dive4elements.river.artifacts.model.fixings.FixReferenceEventsFacet;
@@ -49,8 +48,6 @@
 
     public static final String I18N_WQ_CURVE = "fix.vollmer.wq.curve";
 
-    public static final String I18N_WQ_OUTLIER = "fix.vollmer.wq.outliers";
-
     /**
      * The default constructor that initializes an empty State object.
      */
@@ -98,29 +95,19 @@
                 nameQ = "Q(" + nameW + ")";
             }
 
-            final Facet wq = new FixWaterlevelFacet(i, FIX_WQ_LS, nameW, ComputeType.ADVANCE, hash, id);
-
-            final Facet w = new FixWaterlevelFacet(i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, id);
-
-            final Facet q = new FixWaterlevelFacet(i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, id);
-            final Facet csFacet = new CrossSectionWaterLineFacet(i, nameW);
-
-            facets.add(wq);
-            facets.add(w);
-            facets.add(q);
-            facets.add(csFacet);
+            facets.add(new FixWaterlevelFacet(i, FIX_WQ_LS, nameW, ComputeType.ADVANCE, hash, id));
+            facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, id));
+            facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, id));
+            facets.add(new CrossSectionWaterLineFacet(i, nameW));
 
             // XXX: THIS CAN NOT HAPPEN! REMOVE IT!
             if (wqkms[i] instanceof WQCKms) {
                 final String nameC = nameW.replace("benutzerdefiniert", "benutzerdefiniert [korrigiert]");
-
-                final Facet c = new FixWaterlevelFacet(i, DISCHARGE_LONGITUDINAL_C, nameC);
-
-                facets.add(c);
+                facets.add(new FixWaterlevelFacet(i, DISCHARGE_LONGITUDINAL_C, nameC));
             }
         }
 
-        if (wqkms.length > 0) {
+        if (fixRes != null && wqkms.length > 0) {
             final DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy");
             final DateFormat lf = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy'T'HH:mm");
 
@@ -145,10 +132,6 @@
         if (fixRes != null)
             facets.add(new FixWQCurveFacet(0, Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE) + " (" + access.getFunction() + ")"));
 
-        if (access.getPreprocessing() && fixRes != null) {
-            facets.add(new FixOutlierFacet(0, FIX_OUTLIER, Resources.getMsg(meta, I18N_WQ_OUTLIER, I18N_WQ_OUTLIER)));
-        }
-
         return res;
     }
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/DeltaWtExporter.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/DeltaWtExporter.java	Wed Aug 01 17:13:52 2018 +0200
@@ -107,14 +107,12 @@
         }
         final FixAnalysisResult result = (FixAnalysisResult) data;
         this.analysisPeriods.add(result.getAnalysisPeriods());
-        this.referenceEvents.add(result.getReferenced());
+        this.referenceEvents.add(result.getFixings());
     }
 
     @Override
     protected void writeCSVData(final CSVWriter writer) throws IOException {
 
-        final boolean debug = log.isDebugEnabled();
-
         writeCSVHeader(writer);
 
         final TreeMap<Double, ArrayList<String[]>> sorted = getRows();
@@ -154,20 +152,18 @@
 
                 final String kmS = kmF.format(kmEntry.getKm());
                 for (final QWD qwd : kmEntry.getValue()) {
-                    final String deltaWS = dwF.format(qwd.getDeltaW());
-                    final String qS = qF.format(qwd.getQ());
-                    final String wS = wF.format(qwd.getW());
-                    final String dateS = dF.format(qwd.getDate());
-
-                    list.add(new String[] { kmS, dateS, qS, wS, referenceS, deltaWS });
+                    if( !qwd.isOutlier() ) {
+                        final String deltaWS = dwF.format(qwd.getDeltaW());
+                        final String qS = qF.format(qwd.getQ());
+                        final String wS = wF.format(qwd.getW());
+                        final String dateS = dF.format(qwd.getDate());
+    
+                        list.add(new String[] { kmS, dateS, qS, wS, referenceS, deltaWS });
+                    }
                 }
             }
         }
 
-        // if (debug) {
-        // log.debug("AnalysisPeriods: " + this.analysisPeriods.size());
-        // }
-
         final String analysisTemplate = getAnalysisTemplate();
 
         for (final KMIndex<AnalysisPeriod[]> periods : this.analysisPeriods) {
--- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixDeltaWtGenerator.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixDeltaWtGenerator.java	Wed Aug 01 17:13:52 2018 +0200
@@ -25,6 +25,7 @@
 import org.dive4elements.river.jfree.StyledValueMarker;
 import org.dive4elements.river.themes.ThemeDocument;
 
+import java.awt.Shape;
 import java.io.OutputStream;
 import java.text.NumberFormat;
 import java.util.ArrayList;
@@ -326,15 +327,16 @@
         }
 
         final ThemeDocument themeInterpolated = FixWQCurveGenerator.configureThemeInterpolated(theme, qwd);
-        final String label = FixWQCurveGenerator.buildQWDSeriesLabel(qwd, desc);
-        
+        final Shape shape = FixWQCurveGenerator.getWQDShape(qwd, themeInterpolated.parsePointWidth());
+        final String label = FixWQCurveGenerator.buildQWDSeriesLabel(getContext().getMeta(), qwd, desc);
+
         final Map<Integer, int[]> annoIdxMap = new HashMap<>();
  
         final long time = uniqueDate(qwd.getDate().getTime());
         final RegularTimePeriod rtp = new FixedMillisecond(time);
         final double value =  qwd.getDeltaW();
 
-        final TimeSeries series = new StyledTimeSeries(label, themeInterpolated);
+        final TimeSeries series = new StyledTimeSeries(label, themeInterpolated, shape);
         series.addOrUpdate(rtp, value);
 
         tsc.addSeries(series);
--- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java	Wed Aug 01 17:13:52 2018 +0200
@@ -30,6 +30,7 @@
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifactdatabase.state.Facet;
 import org.dive4elements.artifacts.CallContext;
+import org.dive4elements.artifacts.CallMeta;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.StaticWKmsArtifact;
 import org.dive4elements.river.artifacts.WINFOArtifact;
@@ -58,7 +59,7 @@
 import org.dive4elements.river.themes.ThemeDocument;
 import org.dive4elements.river.utils.RiverUtils;
 import org.dive4elements.river.java2d.ShapeUtils;
-
+import org.dive4elements.river.java2d.ShapeUtils.ShapeType;
 import org.dive4elements.river.jfree.Bounds;
 import org.dive4elements.river.jfree.DoubleBounds;
 
@@ -227,9 +228,6 @@
         else if(FIX_WQ_CURVE.equals(name)) {
             doWQCurveOut(aaf, doc, visible);
         }
-        else if(FIX_OUTLIER.equals(name)) {
-            doOutlierOut(aaf, doc, visible);
-        }
         else if(QSECTOR.equals(name)) {
             doQSectorOut(aaf, doc, visible);
         }
@@ -302,7 +300,7 @@
     }
 
     /** Add analysis event points to chart. */
-    protected void doAnalysisEventsOut(
+    private void doAnalysisEventsOut(
         ArtifactAndFacet aaf,
         ThemeDocument    doc,
         boolean          visible
@@ -324,7 +322,7 @@
         double w = factor*(qwd.getW()-gaugeDatum);
 
         final ThemeDocument theme = configureThemeInterpolated(doc, qwd);
-        final XYSeries series = createQWDSeries(aaf, theme, qwd, qwd.getQ(), qwd.getQ());
+        final XYSeries series = createQWDSeries(getContext().getMeta(), aaf, theme, qwd, qwd.getQ(), qwd.getQ());
 
         addAxisSeries(series, atGauge ? YAXIS.WCm.idx : YAXIS.W.idx, visible);
 
@@ -347,7 +345,7 @@
 
 
     /** Add reference event points to chart. */
-    protected void doReferenceEventsOut(
+    private void doReferenceEventsOut(
         ArtifactAndFacet aaf,
         ThemeDocument doc,
         boolean visible
@@ -368,7 +366,7 @@
         double w = factor*(qwd.getW()-gaugeDatum);
         
         final ThemeDocument theme = configureThemeInterpolated(doc, qwd);
-        final XYSeries series = createQWDSeries(aaf, theme, qwd, qwd.getQ(), w);
+        final XYSeries series = createQWDSeries(getContext().getMeta(), aaf, theme, qwd, qwd.getQ(), w);
         series.add(qwd.getQ(), w, false);
 
         if (visible && theme.parseShowPointLabel()) {
@@ -392,31 +390,34 @@
     }
 
         
-    public static XYSeries createQWDSeries(final ArtifactAndFacet bundle, final ThemeDocument theme, final QWI qwd) {
-        return createQWDSeries(bundle, theme, qwd, qwd.getQ(), qwd.getW());
+    public static XYSeries createQWDSeries(final CallMeta meta, final ArtifactAndFacet bundle, final ThemeDocument theme, final QWI qwd) {
+        return createQWDSeries(meta, bundle, theme, qwd, qwd.getQ(), qwd.getW());
     }
     
-    public static XYSeries createQWDSeries(final ArtifactAndFacet bundle, final ThemeDocument theme, final QWI qwd, double q, double w) {
+    public static XYSeries createQWDSeries(final CallMeta meta, final ArtifactAndFacet bundle, final ThemeDocument theme, final QWI qwd, double q, double w) {
         
-        final String description = buildQWDSeriesLabel(qwd, bundle.getFacetDescription());
+        final String description = buildQWDSeriesLabel(meta, qwd, bundle.getFacetDescription());
         
-        final XYSeries series = new StyledXYSeries( description, theme, FixWQCurveGenerator.getWQDShape(qwd) );
+        final int size = theme.parsePointWidth();
+        final Shape shape = FixWQCurveGenerator.getWQDShape(qwd, size);
+        
+        final XYSeries series = new StyledXYSeries( description, theme, shape );
 
         series.add(q, w, false);
 
         return series;
     }
 
-    public static Shape getWQDShape(final QWI qwd) {
+    public static Shape getWQDShape(final QWI qwd, final float size) {
         final boolean isOutlier = qwd instanceof QWD ? ((QWD) qwd).isOutlier() : false;
 
-//        if( isOutlier)
-//            return ShapeUtils.DIGITIZED_SHAPE;
-        
+        if( isOutlier)
+            return ShapeUtils.getScaledShape(ShapeType.outlier, size );
+
         if (qwd.getInterpolated())
-            return ShapeUtils.INTERPOLATED_SHAPE;
+            return ShapeUtils.getScaledShape(ShapeType.interpolated, size);
 
-        return ShapeUtils.MEASURED_SHAPE;
+        return ShapeUtils.getScaledShape(ShapeType.measured, size);
     }
 
     public static final ThemeDocument configureThemeInterpolated(ThemeDocument theme, QWI qwd) {
@@ -424,26 +425,20 @@
         // prevent potential side effects by copying original theme
         final ThemeDocument newTheme = new ThemeDocument(theme);
         
-        // FIXME: it was like this before: points were always shown, flag had no effekt on this kind of theme, although the option is visible in the style editor
-        final boolean showPoints = true;
-//        final boolean showPoints = theme.parseShowPoints();
+        final boolean showPoints = theme.parseShowPoints();
         
         final boolean doFill = showPoints && !qwd.getInterpolated(); 
         final boolean doOutline = showPoints && qwd.getInterpolated(); 
 
-        final boolean isOutlier = qwd instanceof QWD ? ((QWD) qwd).isOutlier() : false;
-        if( isOutlier )
-            newTheme.setValue(ThemeDocument.POINT_COLOR, "255, 0, 0");
-
         newTheme.setValue(ThemeDocument.SHOW_POINTS, Boolean.toString(doFill));
         newTheme.setValue(ThemeDocument.SHOW_POINTS_OUTLINE, Boolean.toString(doOutline));
 
         return newTheme;
     }    
     
-    public static String buildQWDSeriesLabel(final QWI qwd, final String facetDescription) {
+    public static String buildQWDSeriesLabel(final CallMeta meta, final QWI qwd, final String facetDescription) {
 
-        StringBuilder buffer = new StringBuilder( facetDescription );
+        final StringBuilder buffer = new StringBuilder( facetDescription );
         
         final boolean isOutlier = qwd instanceof QWD ? ((QWD) qwd).isOutlier() : false;
         boolean isInterpolated = qwd.getInterpolated();
@@ -452,15 +447,15 @@
             return buffer.toString();
 
         buffer.append(" (");
-        if( isInterpolated )
+        if( isOutlier )
         {
-            buffer.append("interpoliert");
-            if( isOutlier )
+            buffer.append( Resources.getMsg(meta, "fix.outlier") );
+            if( isInterpolated )
                 buffer.append(", ");
         }
 
-        if( isOutlier )
-            buffer.append("Ausreißer");
+        if( isInterpolated )
+            buffer.append( Resources.getMsg(meta, "fix.interpolated") );
         
         buffer.append(")");
         
@@ -572,18 +567,6 @@
         }
     }
 
-    protected void doOutlierOut(
-        ArtifactAndFacet aaf,
-        ThemeDocument doc,
-        boolean visible
-    ) {
-        log.debug("doOutlierOut");
-
-        QWI[] qws = (QWI[])aaf.getData(getContext());
-        addQWSeries(qws, aaf, doc, visible);
-    }
-
-
     /** Add markers for q sectors. */
     protected void doQSectorOut(
         ArtifactAndFacet aaf,
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/FixWQProcessor.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/FixWQProcessor.java	Wed Aug 01 17:13:52 2018 +0200
@@ -26,7 +26,6 @@
 import org.dive4elements.river.artifacts.model.fixings.FixFunction;
 import org.dive4elements.river.artifacts.model.fixings.FixWQCurveFacet;
 import org.dive4elements.river.artifacts.model.fixings.QWD;
-import org.dive4elements.river.artifacts.model.fixings.QWI;
 import org.dive4elements.river.artifacts.resources.Resources;
 import org.dive4elements.river.exports.DiagramGenerator;
 import org.dive4elements.river.exports.StyledSeriesBuilder;
@@ -51,12 +50,10 @@
 extends DefaultProcessor
 implements FacetTypes
 {
-
     private static Logger log = Logger.getLogger(FixWQProcessor.class);
 
     private String I18N_AXIS_LABEL = "chart.discharge.curve.yaxis.label";
 
-
     public FixWQProcessor() {
     }
 
@@ -83,9 +80,6 @@
         else if(FIX_WQ_CURVE.equals(facetType)) {
             doWQCurveOut(generator, bundle, theme, visible);
         }
-        else if(FIX_OUTLIER.equals(facetType)) {
-            doOutlierOut(generator, bundle, theme, visible);
-        }
         else if(QSECTOR.equals(facetType)) {
             doQSectorOut(generator, bundle, theme, visible);
         }
@@ -103,7 +97,7 @@
     }
 
     /** Add sector average points to chart. */
-    protected void doSectorAverageOut(
+    private void doSectorAverageOut(
         DiagramGenerator generator,
         ArtifactAndFacet bundle,
         ThemeDocument theme,
@@ -146,7 +140,7 @@
 
 
     /** Add analysis event points to chart. */
-    protected void doEventsOut(
+    private void doEventsOut(
         DiagramGenerator generator,
         ArtifactAndFacet bundle,
         ThemeDocument    theme,
@@ -163,7 +157,7 @@
 
         // prevent potential side effects
         final ThemeDocument themeInterpolated = FixWQCurveGenerator.configureThemeInterpolated(theme, qwd);
-        final XYSeries series = FixWQCurveGenerator.createQWDSeries(bundle, themeInterpolated, qwd);
+        final XYSeries series = FixWQCurveGenerator.createQWDSeries(generator.getContext().getMeta(), bundle, themeInterpolated, qwd);
 
         generator.addAxisSeries(series, axisName, visible);
 
@@ -185,46 +179,7 @@
         }
     }
 
-    /** Add reference event points to chart. */
-    protected void doReferenceEventsOut(
-        DiagramGenerator generator,
-        ArtifactAndFacet bundle,
-        ThemeDocument theme,
-        boolean visible) {
-        log.debug("doReferenceEventsOut");
-
-        QWI qwd = (QWI)bundle.getData(generator.getContext());
-        if (qwd == null) {
-            log.debug("doReferenceEventsOut: qwds == null in "
-                + bundle.getFacetDescription());
-            return;
-        }
-
-        
-        final ThemeDocument themeInterpolated = FixWQCurveGenerator.configureThemeInterpolated(theme, qwd);
-        final XYSeries series = FixWQCurveGenerator.createQWDSeries(bundle, themeInterpolated, qwd);
-        series.add(qwd.getQ(), qwd.getW(), false);
-
-        if (visible && themeInterpolated.parseShowPointLabel()) {
-            DateFormat dateFormat = DateFormat.getDateInstance(
-                DateFormat.SHORT);
-
-            XYTextAnnotation anno = new CollisionFreeXYTextAnnotation(
-                dateFormat.format(qwd.getDate()),
-                qwd.getQ(),
-                qwd.getW());
-
-            List<XYTextAnnotation> textAnnos = new ArrayList<>();
-            textAnnos.add(anno);
-            RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, themeInterpolated);
-            flysAnno.setTextAnnotations(textAnnos);
-            generator.addAnnotations(flysAnno);
-        }
-
-        generator.addAxisSeries(series, axisName, visible);
-    }
-
-    protected void doWQCurveOut(
+    private void doWQCurveOut(
         DiagramGenerator generator,
         ArtifactAndFacet bundle,
         ThemeDocument theme,
@@ -259,48 +214,6 @@
         }
     }
 
-    protected void doOutlierOut(
-        DiagramGenerator generator,
-        ArtifactAndFacet bundle,
-        ThemeDocument theme,
-        boolean visible
-    ) {
-        log.debug("doOutlierOut");
-
-        QWI[] qws = (QWI[])bundle.getData(generator.getContext());
-        if(qws != null) {
-            XYSeries series = new StyledXYSeries(
-                bundle.getFacetDescription(),
-                false, true,
-                theme);
-            DateFormat dateFormat = DateFormat.getDateInstance(
-                DateFormat.SHORT);
-
-            List<XYTextAnnotation> annos = new ArrayList<>();
-
-            for (QWI qw: qws) {
-                series.add(qw.getQ(), qw.getW(), false);
-
-                XYTextAnnotation anno = new CollisionFreeXYTextAnnotation(
-                        dateFormat.format(qw.getDate()),
-                        qw.getQ(),
-                        qw.getW());
-                annos.add(anno);
-            }
-            generator.addAxisSeries(series, axisName, visible);
-
-            if (visible && theme != null && theme.parseShowPointLabel()) {
-                RiverAnnotation flysAnno =
-                        new RiverAnnotation(null, null, null, theme);
-                flysAnno.setTextAnnotations(annos);
-                generator.addAnnotations(flysAnno);
-            }
-        }
-        else {
-            log.debug("doOutlierOut: qwd == null");
-        }
-    }
-
     /** Add markers for q sectors. */
     protected void doQSectorOut(
         DiagramGenerator generator,
@@ -487,7 +400,6 @@
             || FIX_REFERENCE_EVENTS_WQ.equals(facettype)
             || FIX_EVENTS.equals(facettype)
             || FIX_WQ_CURVE.equals(facettype)
-            || FIX_OUTLIER.equals(facettype)
             || QSECTOR.equals(facettype)
             || STATIC_WKMS_MARKS.equals(facettype)
             || STATIC_WKMS.equals(facettype)
--- a/artifacts/src/main/java/org/dive4elements/river/java2d/ShapeUtils.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/java2d/ShapeUtils.java	Wed Aug 01 17:13:52 2018 +0200
@@ -9,83 +9,81 @@
 package org.dive4elements.river.java2d;
 
 import java.awt.Shape;
-
-import java.awt.geom.AffineTransform;
+import java.awt.geom.Area;
 import java.awt.geom.Ellipse2D;
 import java.awt.geom.GeneralPath;
 import java.awt.geom.Rectangle2D;
-
 import java.util.HashMap;
 import java.util.Map;
 
-public class ShapeUtils
-{
-    // TODO: Use enum
-    public static final int MEASURED     = 0;
-    public static final int DIGITIZED    = 1;
-    public static final int INTERPOLATED = 2;
-
-    public static final boolean DIGITIZED_FILL    = false;
-    public static final boolean MEASURED_FILL     = true;
-    public static final boolean INTERPOLATED_FILL = false;
-
-   public static final Shape DIGITIZED_SHAPE =
-        createCross(4f);
+public class ShapeUtils {
 
-    public static final Shape MEASURED_SHAPE =
-        new Rectangle2D.Double(-2, -2, 4, 4);
-
-    public static final Shape INTERPOLATED_SHAPE =
-        new Ellipse2D.Double(-2, -2, 4, 4);
-
-    protected static Map<Long, Shape> scaledShapesCache =
-        new HashMap<Long, Shape>();
+    public static enum ShapeType {
+        measured, digitized, interpolated, outlier
+    }
 
-    public static final Shape createCross(float size) {
-        float half = size * 0.5f;
-        GeneralPath p = new GeneralPath();
-        p.moveTo(-half, -half);
-        p.lineTo(half, half);
+    private static Map<Long, Shape> scaledShapesCache = new HashMap<>();
+
+    private static final Shape createCross(float size) {
+
+        final GeneralPath p = new GeneralPath();
+
+        p.moveTo(-size, -size);
+        p.lineTo(size, size);
         p.closePath();
-        p.moveTo(-half, half);
-        p.lineTo(half, -half);
+        p.moveTo(-size, size);
+        p.lineTo(size, -size);
         p.closePath();
+
         return p;
     }
 
-    public static Shape scale(Shape shape, float factor) {
-        if (factor == 1f) {
-            return shape;
-        }
-        AffineTransform xform =
-            AffineTransform.getScaleInstance(factor, factor);
-
-        GeneralPath gp = new GeneralPath(shape);
-        return gp.createTransformedShape(xform);
+    private static Shape createBox(float size) {
+        return new Rectangle2D.Double(-size, -size, size * 2, size * 2);
     }
 
-    public static synchronized Shape getScaledShape(int type, float size) {
-
-        Long hash = Long.valueOf(
-            (((long)type) << 32) | Float.floatToIntBits(size));
-
-        Shape shape = scaledShapesCache.get(hash);
+    private static Shape createCircle(float size) {
+        return new Ellipse2D.Float(-size, -size, size * 2, size * 2);
+    }
 
-        if (shape == null) {
-            switch (type) {
-                case MEASURED:
-                    shape = MEASURED_SHAPE;
-                    break;
-                case DIGITIZED:
-                    shape = DIGITIZED_SHAPE;
-                    break;
-                default:
-                    shape = INTERPOLATED_SHAPE;
-            }
-            scaledShapesCache.put(hash, shape = scale(shape, size));
+    private static final Shape createTriangle(float size) {
+        final GeneralPath p = new GeneralPath();
+
+        p.moveTo(-size, size);
+        p.lineTo(size, size);
+        p.lineTo(0, -size);
+        p.closePath();
+
+        return new Area(p);
+    }
+
+    public static synchronized Shape getScaledShape(final ShapeType type, float size) {
+
+        final Long hash = Long.valueOf((((long) type.ordinal()) << 32) | Float.floatToIntBits(size));
+
+        final Shape shape = scaledShapesCache.get(hash);
+        if (shape != null)
+            return shape;
+
+        final Shape newShape = createScaledShape(type, size);
+        scaledShapesCache.put(hash, newShape);
+        return newShape;
+    }
+
+    private static Shape createScaledShape(ShapeType type, float size) {
+        switch (type) {
+        case measured:
+            return createBox(size);
+
+        case digitized:
+            return createCross(size);
+
+        case outlier:
+            return createTriangle(size);
+
+        case interpolated:
+        default:
+            return createCircle(size);
         }
-
-        return shape;
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/jfree/StyledTimeSeries.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StyledTimeSeries.java	Wed Aug 01 17:13:52 2018 +0200
@@ -8,39 +8,36 @@
 
 package org.dive4elements.river.jfree;
 
-import org.apache.log4j.Logger;
+import java.awt.Shape;
+
 import org.dive4elements.river.themes.ThemeDocument;
 
 import org.jfree.data.time.TimeSeries;
 
-
 /**
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
 public class StyledTimeSeries extends TimeSeries implements StyledSeries {
 
-    private static final Logger log =
-        Logger.getLogger(StyledTimeSeries.class);
-
-
-    protected Style style;
-
+    private Style style;
 
     public StyledTimeSeries(String key, ThemeDocument theme) {
         super(key);
         setStyle(new XYStyle(theme));
     }
-
+    
+    public StyledTimeSeries(String key, ThemeDocument theme, Shape shape) {
+        super(key);
+        setStyle(new XYStyle(theme, shape));
+    }
 
     @Override
     public void setStyle(Style style) {
         this.style = style;
     }
 
-
     @Override
     public Style getStyle() {
         return style;
     }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/jfree/XYStyle.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/XYStyle.java	Wed Aug 01 17:13:52 2018 +0200
@@ -179,11 +179,6 @@
         r.setUseOutlinePaint(c != null);
 
         r.setSeriesShapesVisible(idx, show || showOutline);
-
-        // applyShowPoints(r, idx);
-        // applyPointColor(r, idx);
-
-        // applyUseFillPaint(r);
     }
 
     private void applyPointSize(final XYLineAndShapeRenderer r, final int idx) {
@@ -193,46 +188,6 @@
         r.setSeriesShape(idx, new Ellipse2D.Double(-size, -size, dim, dim));
     }
 
-    private void applyPointColor(final XYLineAndShapeRenderer r, final int idx) {
-        final Color c = this.theme.parsePointColor();
-
-        boolean alt = false;
-        if (alt) {
-
-            if (c != null) {
-                r.setSeriesFillPaint(idx, c);
-
-                r.setUseFillPaint(true);
-                r.setDrawOutlines(false);
-            }
-        } else {
-            // if (c != null) {
-            r.setSeriesFillPaint(idx, c);
-            r.setUseFillPaint(c != null);
-
-            r.setSeriesOutlinePaint(idx, c);
-            r.setDrawOutlines(c != null);
-            // }
-        }
-    }
-
-    /**
-     * Sets form and visibility of points.
-     */
-    private void applyShowPoints(final XYLineAndShapeRenderer r, final int idx) {
-        final boolean show = this.theme.parseShowPoints();
-
-        r.setSeriesShapesVisible(idx, show);
-        r.setDrawOutlines(true);
-    }
-
-    // private void applyUseFillPaint(final XYLineAndShapeRenderer r) {
-    // final Boolean use = this.theme.parseUseFillPaint();
-    // if (use != null) {
-    // r.setUseFillPaint(use);
-    // }
-    // }
-
     private void applyShowLine(final XYLineAndShapeRenderer r, final int idx) {
         final boolean show = this.theme.parseShowLine();
         r.setSeriesLinesVisible(idx, show);
--- a/artifacts/src/main/java/org/dive4elements/river/utils/KMIndex.java	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/utils/KMIndex.java	Wed Aug 01 17:13:52 2018 +0200
@@ -69,11 +69,11 @@
     }
 
     public KMIndex(int capacity) {
-        entries = new ArrayList<Entry<A>>(capacity);
+        entries = new ArrayList<>(capacity);
     }
 
     public void add(double km, A value) {
-        entries.add(new Entry<A>(km, value));
+        entries.add(new Entry<>(km, value));
     }
 
     public void sort() {
--- a/artifacts/src/main/resources/messages.properties	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/resources/messages.properties	Wed Aug 01 17:13:52 2018 +0200
@@ -665,11 +665,11 @@
 fix.analysis.periods=Analysis periods
 fix.derivative=Derivative
 fix.outlier=Outlier
+fix.interpolated = interpolated
 fix.analysis=Analysis event
 fix.deviation=Standard deviation
 fix.reference.deviation=Reference deviation
 fix.vollmer.wq.curve=Adjusted function
-fix.vollmer.wq.outliers=Outliers
 fix.vollmer.wq.events=Events
 qsectors=Discharge Sectors
 fix.mnq=arround MNQ
--- a/artifacts/src/main/resources/messages_de.properties	Wed Aug 01 13:21:34 2018 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Wed Aug 01 17:13:52 2018 +0200
@@ -665,11 +665,11 @@
 fix.analysis.periods=Analysezeitr\u00e4ume
 fix.derivative=Ableitung
 fix.outlier=Ausrei\u00dfer
+fix.interpolated = interpoliert
 fix.analysis=Analyseereignis
 fix.deviation=Standardabweichung
 fix.reference.deviation=Standardabweichung Bezugszeitraum
 fix.vollmer.wq.curve=Angepasste Funktion
-fix.vollmer.wq.outliers=Ausrei\u00dfer
 fix.vollmer.wq.events=Ereignisse
 qsectors=Abfluss-Sektoren
 fix.mnq=um MNQ

http://dive4elements.wald.intevation.org