changeset 9099:850ce16034e9

2.3.4.1.10 Berechnung mit Start-km > End-km
author gernotbelger
date Mon, 28 May 2018 13:22:45 +0200
parents 32dd7e761e4e
children 2a1dcee5e54a
files artifacts/src/main/java/org/dive4elements/river/artifacts/access/RangeAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixCalculation.java gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixLocationPanel.java gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixationPanel.java gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FixFilter.java gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FixingsOverviewInfo.java
diffstat 7 files changed, 278 insertions(+), 333 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/access/RangeAccess.java	Mon May 28 10:56:57 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/access/RangeAccess.java	Mon May 28 13:22:45 2018 +0200
@@ -252,5 +252,13 @@
 
         return DoubleUtil.explode(getFrom(), getTo(), step);
     }
+
+    public final double getLowerKm() {
+        return Math.min(this.getFrom(), this.getTo());
+    }
+
+    public final double getUpperKm() {
+        return Math.max(this.getFrom(), this.getTo());
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixCalculation.java	Mon May 28 10:56:57 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixCalculation.java	Mon May 28 13:22:45 2018 +0200
@@ -8,30 +8,6 @@
 
 package org.dive4elements.river.artifacts.model.fixings;
 
-import org.dive4elements.artifacts.common.utils.StringUtils;
-
-import org.dive4elements.river.artifacts.access.FixAccess;
-
-import org.dive4elements.river.artifacts.math.fitting.Function;
-import org.dive4elements.river.artifacts.math.fitting.FunctionFactory;
-
-import org.dive4elements.river.artifacts.model.Calculation;
-import org.dive4elements.river.artifacts.model.CalculationResult;
-import org.dive4elements.river.artifacts.model.FixingsColumn;
-import org.dive4elements.river.artifacts.model.FixingsColumnFactory;
-
-import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing.Filter;
-
-import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing;
-import org.dive4elements.river.artifacts.model.FixingsOverview.IdsFilter;
-
-import org.dive4elements.river.artifacts.model.FixingsOverview;
-import org.dive4elements.river.artifacts.model.FixingsOverviewFactory;
-import org.dive4elements.river.artifacts.model.Parameters;
-
-import org.dive4elements.river.utils.DoubleUtil;
-import org.dive4elements.river.utils.KMIndex;
-
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -39,99 +15,104 @@
 import java.util.Map;
 
 import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.common.utils.StringUtils;
+import org.dive4elements.river.artifacts.access.FixAccess;
+import org.dive4elements.river.artifacts.math.fitting.Function;
+import org.dive4elements.river.artifacts.math.fitting.FunctionFactory;
+import org.dive4elements.river.artifacts.model.Calculation;
+import org.dive4elements.river.artifacts.model.CalculationResult;
+import org.dive4elements.river.artifacts.model.FixingsColumn;
+import org.dive4elements.river.artifacts.model.FixingsColumnFactory;
+import org.dive4elements.river.artifacts.model.FixingsOverview;
+import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing;
+import org.dive4elements.river.artifacts.model.FixingsOverview.Fixing.Filter;
+import org.dive4elements.river.artifacts.model.FixingsOverview.IdsFilter;
+import org.dive4elements.river.artifacts.model.FixingsOverviewFactory;
+import org.dive4elements.river.artifacts.model.Parameters;
+import org.dive4elements.river.utils.DoubleUtil;
+import org.dive4elements.river.utils.KMIndex;
 
 /** Calculation base class for fix. */
-public abstract class FixCalculation
-extends               Calculation
-{
+public abstract class FixCalculation extends Calculation {
     private static Logger log = Logger.getLogger(FixCalculation.class);
 
     public static final double EPSILON = 1e-4;
 
-    public static final String [] STANDARD_COLUMNS = {
-        "km", "chi_sqr", "max_q", "std-dev"
-    };
+    public static final String[] STANDARD_COLUMNS = { "km", "chi_sqr", "max_q", "std-dev" };
 
     protected static class FitResult {
 
-        protected Parameters      parameters;
-        protected KMIndex<QWD []> referenced;
-        protected KMIndex<QWI []> outliers;
+        protected Parameters parameters;
+        protected KMIndex<QWD[]> referenced;
+        protected KMIndex<QWI[]> outliers;
 
         public FitResult() {
         }
 
-        public FitResult(
-            Parameters      parameters,
-            KMIndex<QWD []> referenced,
-            KMIndex<QWI []> outliers
-        ) {
+        public FitResult(final Parameters parameters, final KMIndex<QWD[]> referenced, final KMIndex<QWI[]> outliers) {
             this.parameters = parameters;
             this.referenced = referenced;
-            this.outliers   = outliers;
+            this.outliers = outliers;
         }
 
         public Parameters getParameters() {
-            return parameters;
+            return this.parameters;
         }
 
-        public KMIndex<QWD []> getReferenced() {
-            return referenced;
+        public KMIndex<QWD[]> getReferenced() {
+            return this.referenced;
         }
 
-        public KMIndex<QWI []> getOutliers() {
-            return outliers;
+        public KMIndex<QWI[]> getOutliers() {
+            return this.outliers;
         }
     } // class FitResult
 
-    /** Helper class to bundle the meta information of a column
-     *  and the real data.
+    /**
+     * Helper class to bundle the meta information of a column
+     * and the real data.
      */
     protected static class Column {
 
         protected Fixing.Column meta;
         protected FixingsColumn data;
-        protected int           index;
+        protected int index;
 
         public Column() {
         }
 
-        public Column(Fixing.Column meta, FixingsColumn data, int index) {
-            this.meta  = meta;
-            this.data  = data;
+        public Column(final Fixing.Column meta, final FixingsColumn data, final int index) {
+            this.meta = meta;
+            this.data = data;
             this.index = index;
         }
 
         public Date getDate() {
-            return meta.getStartTime();
+            return this.meta.getStartTime();
         }
 
         public String getDescription() {
-            return meta.getDescription();
+            return this.meta.getDescription();
         }
 
         public int getIndex() {
-            return index;
+            return this.index;
         }
 
         public int getId() {
-            return meta.getId();
+            return this.meta.getId();
         }
 
-        public boolean getQW(
-            double    km,
-            double [] qs,
-            double [] ws,
-            int       index
-        ) {
-            qs[index] = data.getQ(km);
-            return data.getW(km, ws, index);
+        public boolean getQW(final double km, final double[] qs, final double[] ws, final int index) {
+            qs[index] = this.data.getQ(km);
+            return this.data.getW(km, ws, index);
         }
 
-        public boolean getQW(double km, double [] wq) {
-            data.getW(km, wq, 0);
-            if (Double.isNaN(wq[0])) return false;
-            wq[1] = data.getQ(km);
+        public boolean getQW(final double km, final double[] wq) {
+            this.data.getW(km, wq, 0);
+            if (Double.isNaN(wq[0]))
+                return false;
+            wq[1] = this.data.getQ(km);
             return !Double.isNaN(wq[1]);
         }
     } // class Column
@@ -144,49 +125,46 @@
         protected Map<Integer, Column> columns;
 
         public ColumnCache() {
-            columns = new HashMap<Integer, Column>();
+            this.columns = new HashMap<>();
         }
 
-        public Column getColumn(Fixing.Column meta) {
-            Integer key = meta.getId();
-            Column column = columns.get(key);
+        public Column getColumn(final Fixing.Column meta) {
+            final Integer key = meta.getId();
+            Column column = this.columns.get(key);
             if (column == null) {
-                FixingsColumn data = FixingsColumnFactory
-                    .getInstance()
-                    .getColumnData(meta);
+                final FixingsColumn data = FixingsColumnFactory.getInstance().getColumnData(meta);
                 if (data != null) {
-                    column = new Column(meta, data, columns.size());
-                    columns.put(key, column);
+                    column = new Column(meta, data, this.columns.size());
+                    this.columns.put(key, column);
                 }
             }
             return column;
         }
     } // class ColumnCache
 
-
-    protected String  river;
-    protected double  from;
-    protected double  to;
-    protected double  step;
+    protected String river;
+    protected double from;
+    protected double to;
+    protected double step;
     protected boolean preprocessing;
-    protected String  function;
-    protected int []  events;
-    protected int     qSectorStart;
-    protected int     qSectorEnd;
+    protected String function;
+    protected int[] events;
+    protected int qSectorStart;
+    protected int qSectorEnd;
 
     public FixCalculation() {
     }
 
-    public FixCalculation(FixAccess access) {
-        String  river         = access.getRiverName();
-        Double  from          = access.getFrom();
-        Double  to            = access.getTo();
-        Double  step          = access.getStep();
-        String  function      = access.getFunction();
-        int []  events        = access.getEvents();
-        Integer qSectorStart  = access.getQSectorStart();
-        Integer qSectorEnd    = access.getQSectorEnd();
-        Boolean preprocessing = access.getPreprocessing();
+    public FixCalculation(final FixAccess access) {
+        final String river = access.getRiverName();
+        final Double from = access.getLowerKm();
+        final Double to = access.getUpperKm();
+        final Double step = access.getStep();
+        final String function = access.getFunction();
+        final int[] events = access.getEvents();
+        final Integer qSectorStart = access.getQSectorStart();
+        final Integer qSectorEnd = access.getQSectorEnd();
+        final Boolean preprocessing = access.getPreprocessing();
 
         if (river == null) {
             addProblem("fix.missing.river");
@@ -225,57 +203,51 @@
         }
 
         if (!hasProblems()) {
-            this.river         = river;
-            this.from          = from;
-            this.to            = to;
-            this.step          = step;
-            this.function      = function;
-            this.events        = events;
-            this.qSectorStart  = qSectorStart;
-            this.qSectorEnd    = qSectorEnd;
+            this.river = river;
+            this.from = from;
+            this.to = to;
+            this.step = step;
+            this.function = function;
+            this.events = events;
+            this.qSectorStart = qSectorStart;
+            this.qSectorEnd = qSectorEnd;
             this.preprocessing = preprocessing;
         }
     }
 
-    protected static String toString(
-        String [] parameterNames,
-        double [] values
-    ) {
-        StringBuilder sb = new StringBuilder();
+    protected static String toString(final String[] parameterNames, final double[] values) {
+        final StringBuilder sb = new StringBuilder();
         for (int i = 0; i < parameterNames.length; ++i) {
-            if (i > 0) sb.append(", ");
+            if (i > 0)
+                sb.append(", ");
             sb.append(parameterNames[i]).append(": ").append(values[i]);
         }
         return sb.toString();
     }
 
-
-    /** Create filter to accept only the chosen events.
-     *  This factored out out to be overwritten.
+    /**
+     * Create filter to accept only the chosen events.
+     * This factored out out to be overwritten.
      */
     protected Filter createFilter() {
-        return new IdsFilter(events);
+        return new IdsFilter(this.events);
     }
 
-    protected List<Column> getEventColumns(
-        FixingsOverview overview,
-        ColumnCache     cc
-    ) {
-        FixingsColumnFactory fcf = FixingsColumnFactory.getInstance();
+    protected List<Column> getEventColumns(final FixingsOverview overview, final ColumnCache cc) {
+        final FixingsColumnFactory fcf = FixingsColumnFactory.getInstance();
 
-        Filter filter = createFilter();
-
-        List<Fixing.Column> metas = overview.filter(null, filter);
+        final Filter filter = createFilter();
 
-        List<Column> columns = new ArrayList<Column>(metas.size());
+        final List<Fixing.Column> metas = overview.filter(null, filter);
 
-        for (Fixing.Column meta: metas) {
+        final List<Column> columns = new ArrayList<>(metas.size());
 
-            Column data = cc.getColumn(meta);
+        for (final Fixing.Column meta : metas) {
+
+            final Column data = cc.getColumn(meta);
             if (data == null) {
                 addProblem("fix.cannot.load.data");
-            }
-            else {
+            } else {
                 columns.add(data);
             }
         }
@@ -284,12 +256,8 @@
     }
 
     // Fit a function to the given points from fixation.
-    protected FitResult doFitting(
-        FixingsOverview overview,
-        ColumnCache     cc,
-        Function        func
-    ) {
-        boolean debug = log.isDebugEnabled();
+    protected FitResult doFitting(final FixingsOverview overview, final ColumnCache cc, final Function func) {
+        final boolean debug = log.isDebugEnabled();
 
         final List<Column> eventColumns = getEventColumns(overview, cc);
 
@@ -298,26 +266,19 @@
             return null;
         }
 
-        final double  [] qs = new double[eventColumns.size()];
-        final double  [] ws = new double[qs.length];
-        final boolean [] interpolated = new boolean[ws.length];
+        final double[] qs = new double[eventColumns.size()];
+        final double[] ws = new double[qs.length];
+        final boolean[] interpolated = new boolean[ws.length];
 
-        Fitting.QWDFactory qwdFactory = new Fitting.QWDFactory() {
+        final Fitting.QWDFactory qwdFactory = new Fitting.QWDFactory() {
             @Override
-            public QWD create(double q, double w) {
+            public QWD create(final double q, final double w) {
                 // Check all the event columns for close match
                 // and take the description and the date from meta.
                 for (int i = 0; i < qs.length; ++i) {
-                    if (Math.abs(qs[i]-q) < EPSILON
-                    &&  Math.abs(ws[i]-w) < EPSILON) {
-                        Column column = eventColumns.get(i);
-                        return new QWD(
-                            qs[i], ws[i],
-                            column.getDescription(),
-                            column.getDate(),
-                            interpolated[i],
-                            0d,
-                            column.getId()); // Use database id here
+                    if (Math.abs(qs[i] - q) < EPSILON && Math.abs(ws[i] - w) < EPSILON) {
+                        final Column column = eventColumns.get(i);
+                        return new QWD(qs[i], ws[i], column.getDescription(), column.getDate(), interpolated[i], 0d, column.getId()); // Use database id here
                     }
                 }
                 log.warn("cannot find column for (" + q + ", " + w + ")");
@@ -325,35 +286,33 @@
             }
         };
 
-        Fitting fitting = new Fitting(func, qwdFactory, preprocessing);
+        final Fitting fitting = new Fitting(func, qwdFactory, this.preprocessing);
 
-        String [] parameterNames = func.getParameterNames();
+        final String[] parameterNames = func.getParameterNames();
 
-        Parameters results =
-            new Parameters(
-                StringUtils.join(STANDARD_COLUMNS, parameterNames));
+        final Parameters results = new Parameters(StringUtils.join(STANDARD_COLUMNS, parameterNames));
 
         boolean invalid = false;
 
-        double [] kms = DoubleUtil.explode(from, to, step / 1000.0);
+        final double[] kms = DoubleUtil.explode(this.from, this.to, this.step / 1000.0);
 
         if (debug) {
             log.debug("number of kms: " + kms.length);
         }
 
-        KMIndex<QWI []> outliers   = new KMIndex<QWI []>();
-        KMIndex<QWD []> referenced = new KMIndex<QWD []>(kms.length);
+        final KMIndex<QWI[]> outliers = new KMIndex<>();
+        final KMIndex<QWD[]> referenced = new KMIndex<>(kms.length);
 
-        int kmIndex             = results.columnIndex("km");
-        int chiSqrIndex         = results.columnIndex("chi_sqr");
-        int maxQIndex           = results.columnIndex("max_q");
-        int stdDevIndex         = results.columnIndex("std-dev");
-        int [] parameterIndices = results.columnIndices(parameterNames);
+        final int kmIndex = results.columnIndex("km");
+        final int chiSqrIndex = results.columnIndex("chi_sqr");
+        final int maxQIndex = results.columnIndex("max_q");
+        final int stdDevIndex = results.columnIndex("std-dev");
+        final int[] parameterIndices = results.columnIndices(parameterNames);
 
         int numFailed = 0;
 
-        for (int i = 0; i < kms.length; ++i) {
-            double km = kms[i];
+        for (final double km2 : kms) {
+            final double km = km2;
 
             // Fill Qs and Ws from event columns.
             for (int j = 0; j < ws.length; ++j) {
@@ -369,7 +328,7 @@
                 continue;
             }
 
-            QWD [] refs = fitting.referencedToArray();
+            final QWD[] refs = fitting.referencedToArray();
 
             referenced.add(km, refs);
 
@@ -377,17 +336,17 @@
                 outliers.add(km, fitting.outliersToArray());
             }
 
-            int row = results.newRow();
-            double [] values = fitting.getParameters();
+            final int row = results.newRow();
+            final double[] values = fitting.getParameters();
 
             results.set(row, kmIndex, km);
             results.set(row, chiSqrIndex, fitting.getChiSquare());
             results.set(row, stdDevIndex, fitting.getStandardDeviation());
-            results.set(row, maxQIndex,   fitting.getMaxQ());
+            results.set(row, maxQIndex, fitting.getMaxQ());
             invalid |= results.set(row, parameterIndices, values);
 
             if (debug) {
-                log.debug("km: "+km+" " + toString(parameterNames, values));
+                log.debug("km: " + km + " " + toString(parameterNames, values));
             }
         }
 
@@ -404,22 +363,17 @@
         outliers.sort();
         referenced.sort();
 
-        return new FitResult(
-            results,
-            referenced,
-            outliers);
+        return new FitResult(results, referenced, outliers);
     }
 
     public CalculationResult calculate() {
-        FixingsOverview overview =
-            FixingsOverviewFactory.getOverview(river);
+        final FixingsOverview overview = FixingsOverviewFactory.getOverview(this.river);
 
         if (overview == null) {
             addProblem("fix.no.overview.available");
         }
 
-        Function func = FunctionFactory.getInstance()
-            .getFunction(function);
+        final Function func = FunctionFactory.getInstance().getFunction(this.function);
 
         if (func == null) {
             addProblem("fix.invalid.function.name");
@@ -428,13 +382,13 @@
         if (hasProblems()) {
             return new CalculationResult(this);
         }
-        CalculationResult result = innerCalculate(overview, func);
+        final CalculationResult result = innerCalculate(overview, func);
 
         if (result != null) {
             // Workaraound to deal with same dates in data set
-            Object o = result.getData();
+            final Object o = result.getData();
             if (o instanceof FixResult) {
-                FixResult fr = (FixResult)o;
+                final FixResult fr = (FixResult) o;
                 fr.makeReferenceEventsDatesUnique();
                 fr.remapReferenceIndicesToRank();
             }
@@ -443,9 +397,6 @@
         return result;
     }
 
-    protected abstract CalculationResult innerCalculate(
-        FixingsOverview overview,
-        Function        function
-    );
+    protected abstract CalculationResult innerCalculate(FixingsOverview overview, Function function);
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java	Mon May 28 10:56:57 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java	Mon May 28 13:22:45 2018 +0200
@@ -86,8 +86,8 @@
             catch (final NumberFormatException nfe) {
                 this.collectionView.setSteps(100d);
             }
-            fromKm = fixFilter.getFromKm();
-            toKm = fixFilter.getToKm();
+            fromKm = fixFilter.getLowerKm();
+            toKm = fixFilter.getUpperKm();
         } else {
             // Probably WINFOArtifact kind of artifact.
             final String ld_step = art.getArtifactDescription().getDataValueAsString("ld_step");
@@ -292,7 +292,7 @@
         if (this.collectionView.getArtifact() instanceof AbstractFixBunduArtifact) {
             if (this.collectionView.getCurrentKm() == -1) {
                 final AbstractFixBunduArtifact fix = (AbstractFixBunduArtifact) this.collectionView.getArtifact();
-                this.collectionView.setCurrentKm(fix.getFilter().getFromKm());
+                this.collectionView.setCurrentKm(fix.getFilter().getLowerKm());
             }
         } else if (this.collectionView.getCurrentKm() == -1) {
             this.collectionView.setCurrentKm(this.collectionView.getArtifact().getArtifactDescription().getKMRange()[0]);
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixLocationPanel.java	Mon May 28 10:56:57 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixLocationPanel.java	Mon May 28 13:22:45 2018 +0200
@@ -8,45 +8,39 @@
 
 package org.dive4elements.river.client.client.ui.fixation;
 
-import java.util.List;
 import java.util.ArrayList;
-
-import com.google.gwt.core.client.GWT;
-
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
-
-import com.smartgwt.client.widgets.layout.HLayout;
-import com.smartgwt.client.widgets.layout.VLayout;
-
-import com.smartgwt.client.widgets.form.fields.FormItem;
-import com.smartgwt.client.widgets.form.fields.events.BlurHandler;
-import com.smartgwt.client.widgets.form.fields.events.BlurEvent;
+import java.util.List;
 
 import org.dive4elements.river.client.client.FLYSConstants;
 import org.dive4elements.river.client.client.ui.DoubleRangePanel;
-
 import org.dive4elements.river.client.shared.model.Data;
 import org.dive4elements.river.client.shared.model.DataItem;
 import org.dive4elements.river.client.shared.model.DataList;
 import org.dive4elements.river.client.shared.model.DefaultData;
 import org.dive4elements.river.client.shared.model.DefaultDataItem;
+
+import com.google.gwt.core.client.GWT;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.events.BlurEvent;
+import com.smartgwt.client.widgets.form.fields.events.BlurHandler;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
+
 /**
  * This UIProvider creates a panel for location or distance input.
  *
  * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
  */
-public class FixLocationPanel
-extends      FixationPanel
-implements   BlurHandler
-{
+public class FixLocationPanel extends FixationPanel implements BlurHandler {
     /** The message class that provides i18n strings. */
     protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class);
 
-    /** The constant name of the input field to enter locations.*/
+    /** The constant name of the input field to enter locations. */
     public static final String FIELD_VALUE_LOCATION = "location";
 
-    /** The constant name of the input field to enter distance.*/
+    /** The constant name of the input field to enter distance. */
     public static final String FIELD_VALUE_DISTANCE = "distance";
 
     DoubleRangePanel inputPanel;
@@ -56,61 +50,54 @@
     double step;
 
     public FixLocationPanel() {
-        htmlOverview = "";
+        this.htmlOverview = "";
     }
 
-    public Canvas createWidget(DataList data) {
+    @Override
+    public Canvas createWidget(final DataList data) {
         instances.put(this.artifact.getUuid(), this);
 
-        VLayout layout = new VLayout();
+        final VLayout layout = new VLayout();
 
-        Canvas title = new Label(MESSAGES.distance());
+        final Canvas title = new Label(this.MESSAGES.distance());
         title.setHeight("25px");
 
-        inputPanel = new DoubleRangePanel(
-                MESSAGES.unitFrom(),
-                MESSAGES.unitTo(),
-                MESSAGES.unitWidth(),
-                0d,
-                0d,
-                0d,
-                240,
-                this);
+        this.inputPanel = new DoubleRangePanel(this.MESSAGES.unitFrom(), this.MESSAGES.unitTo(), this.MESSAGES.unitWidth(), 0d, 0d, 0d, 240, this);
 
         layout.addMember(title);
-        layout.addMember(inputPanel);
+        layout.addMember(this.inputPanel);
         return layout;
     }
 
     @Override
-    public Canvas createOld(DataList dataList) {
-        List<Data> items = dataList.getAll();
+    public Canvas createOld(final DataList dataList) {
+        final List<Data> items = dataList.getAll();
 
-        Data       f      = getData(items, "ld_from");
-        Data       t      = getData(items, "ld_to");
-        Data       s      = getData(items, "ld_step");
-        DataItem[] fItems = f.getItems();
-        DataItem[] tItems = t.getItems();
-        DataItem[] sItems = s.getItems();
+        final Data f = getData(items, "ld_from");
+        final Data t = getData(items, "ld_to");
+        final Data s = getData(items, "ld_step");
+        final DataItem[] fItems = f.getItems();
+        final DataItem[] tItems = t.getItems();
+        final DataItem[] sItems = s.getItems();
 
-        StringBuilder sb = new StringBuilder();
+        final StringBuilder sb = new StringBuilder();
         sb.append(fItems[0].getLabel());
-        sb.append(" " + MESSAGES.unitFrom() + " ");
+        sb.append(" " + this.MESSAGES.unitFrom() + " ");
         sb.append(tItems[0].getLabel());
-        sb.append(" " + MESSAGES.unitTo() + " ");
+        sb.append(" " + this.MESSAGES.unitTo() + " ");
         sb.append(sItems[0].getLabel());
-        sb.append(" " + MESSAGES.unitWidth());
+        sb.append(" " + this.MESSAGES.unitWidth());
 
-        Label old = new Label(sb.toString());
+        final Label old = new Label(sb.toString());
         old.setWidth(130);
 
-        HLayout layout = new HLayout();
+        final HLayout layout = new HLayout();
         layout.setWidth("400px");
 
-        Label   label  = new Label(dataList.getLabel());
+        final Label label = new Label(dataList.getLabel());
         label.setWidth("200px");
 
-        Canvas back = getBackButton(dataList.getState());
+        final Canvas back = getBackButton(dataList.getState());
 
         layout.addMember(label);
         layout.addMember(old);
@@ -119,40 +106,36 @@
         return layout;
     }
 
-
     /**
      * This method returns the selected data.
      *
      * @return the selected/inserted data.
      */
+    @Override
     public Data[] getData() {
-        List<Data> data = new ArrayList<Data>();
+        final List<Data> data = new ArrayList<Data>();
 
-        boolean valid = saveRangeValues(inputPanel);
+        final boolean valid = saveRangeValues(this.inputPanel);
         if (valid) {
-            String f = Double.valueOf(this.from).toString();
-            String t = Double.valueOf(this.to).toString();
-            String s = Double.valueOf(this.step).toString();
-            DataItem fi = new DefaultDataItem("ld_from", "ld_from", f);
-            DataItem ti = new DefaultDataItem("ld_to", "ld_to", t);
-            DataItem si = new DefaultDataItem("ld_step", "ld_step", s);
-            data.add(new DefaultData(
-                    "ld_from", null, null, new DataItem[]{ fi }));
-            data.add(new DefaultData(
-                    "ld_to", null, null, new DataItem[]{ ti }));
-            data.add(new DefaultData(
-                    "ld_step", null, null, new DataItem[]{ si }));
+            final String f = Double.valueOf(this.from).toString();
+            final String t = Double.valueOf(this.to).toString();
+            final String s = Double.valueOf(this.step).toString();
+            final DataItem fi = new DefaultDataItem("ld_from", "ld_from", f);
+            final DataItem ti = new DefaultDataItem("ld_to", "ld_to", t);
+            final DataItem si = new DefaultDataItem("ld_step", "ld_step", s);
+            data.add(new DefaultData("ld_from", null, null, new DataItem[] { fi }));
+            data.add(new DefaultData("ld_to", null, null, new DataItem[] { ti }));
+            data.add(new DefaultData("ld_step", null, null, new DataItem[] { si }));
         }
         // what else?
         return data.toArray(new Data[data.size()]);
     }
 
+    protected boolean saveRangeValues(final DoubleRangePanel p) {
+        final FormItem[] items = p.getFields();
+        final boolean valid = p.validateForm();
 
-    protected boolean saveRangeValues(DoubleRangePanel p) {
-        FormItem[] items = p.getFields();
-        boolean valid = p.validateForm();
-
-        if(valid) {
+        if (valid) {
             this.from = p.getFrom();
             this.to = p.getTo();
             this.step = p.getStep();
@@ -160,45 +143,45 @@
         return valid;
     }
 
-
     @Override
-    public void setValues(String cid, boolean checked) {
+    public void setValues(final String cid, final boolean checked) {
         // No user interaction, do nothing.
     }
 
-
     @Override
     public boolean renderCheckboxes() {
         // No selection, return false.
         return false;
     }
 
-
+    @Override
     public void success() {
-        inputPanel.setValues(fixInfo.getFrom(), fixInfo.getTo(), 100d);
+        this.inputPanel.setValues(this.fixInfo.getLowerKm(), // TODO: check if revert makes sense
+                this.fixInfo.getUpperKm(), 100d);
     }
 
     /**
      * This method is used to validate the inserted data in the form fields.
      *
-     * @param event The BlurEvent that gives information about the FormItem that
-     * has been modified and its value.
+     * @param event
+     *            The BlurEvent that gives information about the FormItem that
+     *            has been modified and its value.
      */
-    public void onBlur(BlurEvent event) {
-        FormItem item = event.getItem();
-        String  field = item.getFieldName();
+    @Override
+    public void onBlur(final BlurEvent event) {
+        final FormItem item = event.getItem();
+        final String field = item.getFieldName();
 
         if (field == null) {
             return;
         }
-        DoubleRangePanel p = (DoubleRangePanel) event.getForm();
+        final DoubleRangePanel p = (DoubleRangePanel) event.getForm();
     }
 
-
-    public void dumpGWT(String cid) {
+    public void dumpGWT(final String cid) {
         GWT.log("Setting values for cId: " + cid);
-        GWT.log("River: " + fixInfo.getRiver());
-        GWT.log("Date: " + fixInfo.getEventByCId(cid).getDate());
-        GWT.log("Name: " + fixInfo.getEventByCId(cid).getDescription());
+        GWT.log("River: " + this.fixInfo.getRiver());
+        GWT.log("Date: " + this.fixInfo.getEventByCId(cid).getDate());
+        GWT.log("Name: " + this.fixInfo.getEventByCId(cid).getDescription());
     }
 }
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixationPanel.java	Mon May 28 10:56:57 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixationPanel.java	Mon May 28 13:22:45 2018 +0200
@@ -161,8 +161,8 @@
                         final FixFilter filter = art.getFilter();
                         filter.setRiver(info.getRiver());
                         if (filter.getCurrentKm() == -Double.MAX_VALUE || filter.getCurrentKm() == -1d) {
-                            filter.setCurrentKm(info.getFrom());
-                            filter.setToKm(info.getTo());
+                            filter.setCurrentKm(filter.getLowerKm());
+                            filter.setToKm(filter.getUpperKm());
                         }
                         if (FixationPanel.this.kmText != null) {
                             final NumberFormat nf = NumberFormat.getDecimalFormat();
@@ -175,7 +175,7 @@
                             }
                         }
                         eventPane.setContents(FixationPanel.this.htmlOverview);
-                        updateChartTab(FixationPanel.this.fixInfo.getFrom());
+                        updateChartTab(FixationPanel.this.fixInfo.getLowerKm());
                         FixationPanel.this.events.setPane(eventPane);
                         success();
                     }
@@ -261,19 +261,20 @@
 
         final AbstractFixBunduArtifact art = (AbstractFixBunduArtifact) this.artifact;
 
+        // was soll das all
         if (this.fixInfo != null) {
-            if (km < this.fixInfo.getFrom())
-                km = this.fixInfo.getFrom();
-            if (km > this.fixInfo.getTo())
-                km = this.fixInfo.getTo();
+            if (km < this.fixInfo.getLowerKm())
+                km = this.fixInfo.getLowerKm();
+            // if (km > this.fixInfo.getTo())
+            // km = this.fixInfo.getTo();
         }
 
         final FixFilter filter = art.getFilter();
 
-        if (km < filter.getFromKm())
-            km = filter.getFromKm();
-        if (km > filter.getToKm())
-            km = filter.getToKm();
+        if (km < filter.getLowerKm())
+            km = filter.getLowerKm();
+        if (km > filter.getUpperKm())
+            km = filter.getUpperKm();
 
         filter.setCurrentKm(km);
 
@@ -307,7 +308,7 @@
         final FixFilter filter = art.getFilter();
 
         final double curr = filter.getCurrentKm();
-        if (curr > filter.getFromKm()) {
+        if (curr > filter.getLowerKm()) {
             final double newVal = (curr - 0.1) * 10;
             final long round = Math.round(newVal);
             updateChartTab(((double) round) / 10);
@@ -321,7 +322,7 @@
         final FixFilter filter = art.getFilter();
 
         final double curr = filter.getCurrentKm();
-        if (curr < filter.getToKm()) {
+        if (curr < filter.getUpperKm()) {
             final double newVal = (curr + 0.1) * 10;
             final long round = Math.round(newVal);
             updateChartTab(((double) round) / 10);
@@ -383,8 +384,8 @@
     public String getChartFilter(final FixFilter filter, final int width, final int height) {
         final String river = filter.getRiver();
         final double currentKm = filter.getCurrentKm();
-        final double fromKm = filter.getFromKm();
-        final double toKm = filter.getToKm();
+        final double fromKm = filter.getLowerKm();
+        final double toKm = filter.getUpperKm();
 
         if (river != null && river.length() > 0 && currentKm >= fromKm && currentKm <= toKm) {
             final JSONObject jfix = new JSONObject();
@@ -411,8 +412,8 @@
     }
 
     protected static JSONObject createFilter(final FixFilter filter, final JSONObject root) {
-        final double fromKm = filter.getFromKm();
-        final double toKm = filter.getToKm();
+        final double fromKm = filter.getLowerKm();
+        final double toKm = filter.getUpperKm();
         final boolean hasDate = filter.hasDate();
 
         if (fromKm >= 0 && toKm >= 0 && fromKm <= toKm) {
--- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FixFilter.java	Mon May 28 10:56:57 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FixFilter.java	Mon May 28 13:22:45 2018 +0200
@@ -11,7 +11,7 @@
 import java.io.Serializable;
 
 /** Probably something like *Access, but from client side. */
-public class FixFilter implements Serializable{
+public class FixFilter implements Serializable {
 
     protected String river;
     protected double fromKm;
@@ -37,41 +37,41 @@
         this.events = new int[0];
     }
 
-    public void setRiver(String river) {
+    public void setRiver(final String river) {
         this.river = river;
     }
 
-    public void setFromKm(double from) {
+    public void setFromKm(final double from) {
         this.fromKm = from;
     }
 
-    public void setToKm(double to) {
+    public void setToKm(final double to) {
         this.toKm = to;
     }
 
-    public void setCurrentKm(double km) {
+    public void setCurrentKm(final double km) {
         this.currentKm = km;
     }
 
-    public void setFromClass(int from) {
+    public void setFromClass(final int from) {
         this.fromClass = from;
     }
 
-    public void setToClass(int to) {
+    public void setToClass(final int to) {
         this.toClass = to;
     }
 
-    public void setFromDate(long from) {
+    public void setFromDate(final long from) {
         this.hasDate = true;
         this.fromDate = from;
     }
 
-    public void setToDate(long to) {
+    public void setToDate(final long to) {
         this.hasDate = true;
         this.toDate = to;
     }
 
-    public void setEvents(int[] ev) {
+    public void setEvents(final int[] ev) {
         this.events = ev;
     }
 
@@ -79,14 +79,22 @@
         return this.river;
     }
 
-    public double getFromKm() {
-        return this.fromKm;
+    public double getLowerKm() {
+        return Math.min(this.fromKm, this.toKm);
     }
 
-    public double getToKm() {
-        return this.toKm;
+    public double getUpperKm() {
+        return Math.max(this.fromKm, this.toKm);
     }
 
+    // public double getFromKm() {
+    // return this.fromKm;
+    // }
+    //
+    // public double getToKm() {
+    // return this.toKm;
+    // }
+
     public double getCurrentKm() {
         return this.currentKm;
     }
@@ -112,7 +120,7 @@
     }
 
     public boolean hasDate() {
-        return fromDate != Long.MIN_VALUE && toDate != Long.MIN_VALUE;
+        return this.fromDate != Long.MIN_VALUE && this.toDate != Long.MIN_VALUE;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FixingsOverviewInfo.java	Mon May 28 10:56:57 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FixingsOverviewInfo.java	Mon May 28 13:22:45 2018 +0200
@@ -9,9 +9,8 @@
 package org.dive4elements.river.client.shared.model;
 
 import java.io.Serializable;
-
+import java.util.ArrayList;
 import java.util.List;
-import java.util.ArrayList;
 
 public class FixingsOverviewInfo implements Serializable {
 
@@ -22,16 +21,10 @@
     protected int rid;
     protected String html;
 
-    protected FixingsOverviewInfo() {}
+    private FixingsOverviewInfo() {
+    }
 
-    public FixingsOverviewInfo(
-        int rid,
-        String river,
-        double from,
-        double to,
-        List<FixEvent> events,
-        String html
-    ) {
+    public FixingsOverviewInfo(final int rid, final String river, final double from, final double to, final List<FixEvent> events, final String html) {
         this.rid = rid;
         this.river = river;
         this.from = from;
@@ -48,20 +41,29 @@
         return this.river;
     }
 
-    public double getFrom() {
-        return this.from;
+    public double getLowerKm() {
+        return Math.min(this.from, this.to);
     }
 
-    public double getTo() {
-        return this.to;
+    public double getUpperKm() {
+        return Math.max(this.from, this.to);
     }
 
+    // public double getFrom() {
+    // return this.from < this.to ? this.from : this.to; // TODO: prüfung wieder rausnehmen, hat glaube ich keinen
+    // sinnvollen effekt.
+    // }
+    //
+    // public double getTo() {
+    // return this.to > this.from ? this.to : this.from;
+    // }
+
     public List<FixEvent> getEvents() {
         return this.events;
     }
 
-    public FixEvent getEventByCId(String cid) {
-        for (FixEvent event: events) {
+    public FixEvent getEventByCId(final String cid) {
+        for (final FixEvent event : this.events) {
             if (event.getCId().equals(cid)) {
                 return event;
             }
@@ -73,21 +75,16 @@
         return this.html;
     }
 
-
     public static class FixEvent implements Serializable {
         protected String cid;
         protected String date;
         protected String description;
         protected List<Sector> sectors;
 
-        protected FixEvent () {}
+        protected FixEvent() {
+        }
 
-        public FixEvent(
-            String cid,
-            String date,
-            String description,
-            List<Sector> sectors
-        ) {
+        public FixEvent(final String cid, final String date, final String description, final List<Sector> sectors) {
             this.cid = cid;
             this.date = date;
             this.description = description;
@@ -116,13 +113,10 @@
         protected double from;
         protected double to;
 
-        protected Sector () {}
+        protected Sector() {
+        }
 
-        public Sector(
-            int cls,
-            double from,
-            double to
-        ) {
+        public Sector(final int cls, final double from, final double to) {
             this.cls = cls;
             this.from = from;
             this.to = to;

http://dive4elements.wald.intevation.org