annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java @ 7309:a6ceb4b333c3

SedimentDensity: Fix getAllDensities and made it public.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Mon, 14 Oct 2013 11:48:38 +0200
parents fe32a7f9655e
children 2facd4066a28
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
6 * documentation coming with Dive4Elements River for details.
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5712
diff changeset
9 package org.dive4elements.river.artifacts.model.minfo;
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
10
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
11 import java.util.ArrayList;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
12 import java.util.Collections;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
13 import java.util.HashMap;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
14 import java.util.List;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
15 import java.util.Map;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
16 import java.util.Set;
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
17 import java.util.TreeMap;
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
18
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
19 import org.apache.log4j.Logger;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
20
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
21
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
22 /** Sediment Densities for multiple years. */
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
23 public class SedimentDensity
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
24 {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
25 private static final Logger logger = Logger
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
26 .getLogger(SedimentDensity.class);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
27
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
28 private Map<Integer, List<SedimentDensityValue>> densities;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
29 private List<Integer> years;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
30
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
31 public SedimentDensity() {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
32 this.densities = new HashMap<Integer, List<SedimentDensityValue>>();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
33 this.years = new ArrayList<Integer>();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
34 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
35
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
36 public Map<Integer, List<SedimentDensityValue>> getDensities() {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
37 return densities;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
38 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
39
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
40 public void setDensities(Map<Integer, List<SedimentDensityValue>> densities) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
41 this.densities = densities;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
42 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
43
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
44 public void addDensity(double km, double density, int year) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
45 logger.debug("adding " + year);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
46 if (this.densities.containsKey(year)) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
47 List<SedimentDensityValue> list = this.densities.get(year);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
48 list.add(new SedimentDensityValue(km, density, year));
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
49 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
50 else {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
51 List<SedimentDensityValue> list =
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
52 new ArrayList<SedimentDensityValue>();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
53 list.add(new SedimentDensityValue(km, density, year));
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
54 densities.put(year, list);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
55 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
56 if (!this.years.contains(new Integer(year))) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
57 logger.debug("new year");
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
58 years.add(new Integer(year));
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
59 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
60 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
61
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
62 public List<Integer> getYears() {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
63 return years;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
64 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
65
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
66 public void setYears(List<Integer> years) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
67 this.years = years;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
68 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
69
6937
0a3dd5be6f81 issue1436: Towards finding the best match in years for densities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6910
diff changeset
70 /**
0a3dd5be6f81 issue1436: Towards finding the best match in years for densities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6910
diff changeset
71 * Get the density at year.
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
72 * Measured densities are valid until the next measurement.
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
73 * If no measurement was found 1.8 is returned.
6937
0a3dd5be6f81 issue1436: Towards finding the best match in years for densities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6910
diff changeset
74 */
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
75 public double getDensity(double km, int year) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
76 Collections.sort(this.years);
6937
0a3dd5be6f81 issue1436: Towards finding the best match in years for densities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6910
diff changeset
77 if (this.years.size() == 1 && years.get(0) <= year) {
6910
a58a1a520948 a bit of debug output
Tom Gottfried <tom@intevation.de>
parents: 6758
diff changeset
78 logger.debug("get density from year " + year + " at km " + km);
6937
0a3dd5be6f81 issue1436: Towards finding the best match in years for densities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6910
diff changeset
79 return getDensityAtKm(densities.get(years.get(0)), km);
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
80 }
6937
0a3dd5be6f81 issue1436: Towards finding the best match in years for densities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6910
diff changeset
81 else if (this.years.size() > 1) {
7254
fe32a7f9655e Reduce usage of careless 'for (int i = 0; i < x.size(); i++)' pattern.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7200
diff changeset
82 for (int i = 0, I = years.size()-1; i < I; i++) {
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
83 int y1 = years.get(i);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
84 int y2 = years.get(i + 1);
6938
4c0222d94055 issue1436: Exploit validity-rule of sedimentdensities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6937
diff changeset
85 if (year >= y1 && year < y2) {
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
86 return getDensityAtKm(densities.get(y1), km);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
87 }
6938
4c0222d94055 issue1436: Exploit validity-rule of sedimentdensities.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6937
diff changeset
88 else if (year >= y2 && i == years.size() -1) {
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
89 return getDensityAtKm(densities.get(y2), km);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
90 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
91 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
92 }
5712
84e02b3f7a4f Avoid NPE in sediment density factory and return a valid density if no exists.
Raimund Renkert <rrenkert@intevation.de>
parents: 4551
diff changeset
93 return 1.8d;
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
94 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
95
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
96 /** Get (sorted) map of km to density of all years. */
7309
a6ceb4b333c3 SedimentDensity: Fix getAllDensities and made it public.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 7254
diff changeset
97 public double[][] getAllDensities()
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
98 {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
99 TreeMap<Double, Double> map = new TreeMap<Double,Double>();
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
100 for (int year: years) {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
101 for (SedimentDensityValue sdv: densities.get(year)) {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
102 map.put(sdv.getKm(), sdv.getDensity());
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
103 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
104 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
105 double[][] points = new double[2][map.keySet().size()];
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
106 int i = 0;
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
107 for (Map.Entry<Double, Double> kmDens: map.entrySet()) {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
108 points[0][i] = kmDens.getKey();
7309
a6ceb4b333c3 SedimentDensity: Fix getAllDensities and made it public.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 7254
diff changeset
109 points[1][i] = kmDens.getValue();
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
110 i++;
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
111 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
112
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
113 return points;
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
114 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
115
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
116 /** Get points km,density (sorted by km), for a given year. */
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
117 public double[][] getDensities(int year)
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
118 {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
119 TreeMap<Double, Double> map = new TreeMap<Double,Double>();
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
120 for (SedimentDensityValue sdv: densities.get(year)) {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
121 map.put(sdv.getKm(), sdv.getDensity());
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
122 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
123 double[][] points = new double[2][map.keySet().size()];
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
124 int i = 0;
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
125 for (Map.Entry<Double, Double> kmDens: map.entrySet()) {
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
126 points[0][i] = kmDens.getKey();
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
127 points[1][i] = kmDens.getValue();
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
128 i++;
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
129 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
130
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
131 return points;
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
132 }
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
133
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
134 /** Get value at km, interpolated. */
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
135 private double getDensityAtKm(
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
136 List<SedimentDensityValue> values,
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
137 double km
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
138 ) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
139 SedimentDensityValue prev = null;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
140 SedimentDensityValue next = null;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
141 for (SedimentDensityValue sdv: values) {
6910
a58a1a520948 a bit of debug output
Tom Gottfried <tom@intevation.de>
parents: 6758
diff changeset
142 logger.debug("year: " + sdv.getYear());
6970
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
143 if (Math.abs(sdv.getKm() - km) < 0.00001) {
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
144 return prev.getDensity();
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
145 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
146 if (sdv.getKm() > km) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
147 next = sdv;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
148 break;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
149 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
150 prev = sdv;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
151 }
6970
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
152 return spline(prev, next, km);
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
153 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
154
7200
483cae8915f6 issue1435: Add methods to get data in StyledSeriesBuilder-friendly format, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6970
diff changeset
155 /** Linearly interpolate between density values. */
6970
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
156 private static double spline(
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
157 SedimentDensityValue prev,
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
158 SedimentDensityValue next,
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
159 double km
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
160 ) {
6970
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
161 if (prev == null && next == null) {
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
162 logger.warn("prev and next are null -> NaN");
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
163 return Double.NaN;
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
164 }
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
165
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
166 if (prev == null) return next.getDensity();
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
167 if (next == null) return prev.getDensity();
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
168
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
169 // XXX: This is no spline interpolation!
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
170 double lower = prev.getKm();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
171 double upper = next.getKm();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
172 double upperDensity = next.getDensity();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
173 double lowerDensity = prev.getDensity();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
174
6970
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
175 double m = (upperDensity - lowerDensity)/(upper - lower);
6949
13c2762270a6 issue1462: 1) & 4) Fix wrong density interpolation code.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6948
diff changeset
176 double b = lowerDensity - (m * lower);
6970
7be97faf5848 flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6949
diff changeset
177 return m * km + b;
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
178 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
179
6948
d4108d6c4000 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6938
diff changeset
180
d4108d6c4000 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6938
diff changeset
181 /** If multiple values for same year and station are found,
d4108d6c4000 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6938
diff changeset
182 * build and store average, dismiss multiple values. */
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
183 public void cleanUp() {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
184 Set<Integer> keys = densities.keySet();
6948
d4108d6c4000 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6938
diff changeset
185 // Walk over years
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
186 for (Integer key : keys) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
187 List<SedimentDensityValue> list = densities.get(key);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
188 if (list.size() == 0) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
189 return;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
190 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
191 List<SedimentDensityValue> cleaned =
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
192 new ArrayList<SedimentDensityValue>();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
193 double prevkm = list.get(0).getKm();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
194 int counter = 0;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
195 double sum = 0d;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
196 for (SedimentDensityValue value : list) {
6948
d4108d6c4000 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6938
diff changeset
197 // Apparently we can assume that values are ordered by km.
4521
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
198 if (value.getKm() == prevkm) {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
199 sum += value.getDensity();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
200 counter++;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
201 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
202 else {
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
203 cleaned.add(new SedimentDensityValue(
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
204 prevkm,
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
205 sum / counter,
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
206 value.getYear()));
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
207 sum = value.getDensity();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
208 counter = 1;
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
209 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
210 prevkm = value.getKm();
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
211 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
212 this.densities.put(key, cleaned);
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
213 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
214 }
71e6fe870c1d Added objects and factory for sediment densities.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
215 }
6948
d4108d6c4000 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6938
diff changeset
216 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org