annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedQualityResultValue.java @ 8587:07c9ac22f611

(issue1755) Generalise BedQuality result handling The bedquality calculation now produces a result for each time period which has BedQualityResultValues for each specific result type. Formally this was split up in density, porosity and diameter classes with some bedload diameter classes mixed in for extra fun. The intent of this commit is to allow more shared code and generic access patterns to the BedQuality results.
author Andre Heinecke <andre.heinecke@intevation.de>
date Wed, 18 Mar 2015 18:42:08 +0100
parents
children 3c78fc83fc6d
rev   line source
8587
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
2 * Software engineering by Intevation GmbH
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
3 *
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
6 * documentation coming with Dive4Elements River for details.
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
7 */
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
8
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
9 package org.dive4elements.river.artifacts.model.minfo;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
10
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
11 import org.dive4elements.river.utils.DoubleUtil;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
12
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
13 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
14 import org.apache.commons.math.ArgumentOutsideDomainException;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
15
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
16 import java.util.Arrays;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
17 import java.util.Set;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
18 import java.util.HashSet;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
19
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
20 import java.io.Serializable;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
21
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
22 /** Holder of a specific result from the bed quality calculation.
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
23 *
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
24 * Data is always a map of km to value. The type "bedload"
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
25 * translates to german "Geschiebe" other results are either
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
26 * specific to the top or the sublayer of the riverbed.
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
27 *
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
28 * The name can be the diameter of this result for bed and bedload
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
29 * data.
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
30 **/
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
31 public class BedQualityResultValue implements Serializable {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
32 public static final String[] DIAMETER_NAMES = new String[] {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
33 "D90",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
34 "D84",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
35 "D80",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
36 "D75",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
37 "D70",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
38 "D60",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
39 "D50",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
40 "D40",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
41 "D30",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
42 "D25",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
43 "D20",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
44 "D16",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
45 "D10",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
46 "DM",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
47 "DMIN",
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
48 "DMAX"
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
49 };
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
50
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
51 /* For ease of access */
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
52 public static final Set<String> DIAMETER_NAME_SET = new HashSet<String>(
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
53 Arrays.asList(DIAMETER_NAMES));
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
54
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
55 private String name;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
56 private String type;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
57 private double [][] data;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
58 private transient PolynomialSplineFunction interpolFunc;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
59
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
60 public BedQualityResultValue() {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
61 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
62
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
63 public BedQualityResultValue(String name, double [][] data, String type) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
64 this.name = name;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
65 setData(data);
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
66 this.type = type;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
67 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
68
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
69 public String getName() {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
70 return name;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
71 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
72
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
73 public void setName(String name) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
74 this.name = name;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
75 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
76
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
77 public double [][] getData() {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
78 return data;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
79 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
80
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
81 public double getData(double x) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
82 int idx = Arrays.binarySearch(data[0], x);
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
83 if (idx < 0) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
84 return Double.NaN;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
85 } else {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
86 return data[1][idx];
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
87 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
88 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
89
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
90 public double getDataInterpolated(double x) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
91 if (interpolFunc == null) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
92 interpolFunc = DoubleUtil.getLinearInterpolator(data[0], data[1]);
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
93 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
94 try {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
95 return interpolFunc.value(x);
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
96 } catch (ArgumentOutsideDomainException e) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
97 return getData(x);
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
98 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
99 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
100
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
101 public double [][] getDataInterpolated(double[] x) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
102 double y[] = new double[x.length];
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
103 int i = 0;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
104 for (double point: x) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
105 y[i++] = getDataInterpolated(point);
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
106 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
107 return new double[][] {x, y};
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
108 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
109
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
110 public void setData(double [][] data) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
111 this.data = data;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
112 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
113
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
114 public void setType(String type) {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
115 this.type = type;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
116 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
117
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
118 public String getType() {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
119 return type;
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
120 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
121
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
122 /** Checks wether or not the name matches that of a diameter */
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
123 public boolean isDiameterResult() {
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
124 return DIAMETER_NAME_SET.contains(name.toUpperCase());
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
125 }
07c9ac22f611 (issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
126 }

http://dive4elements.wald.intevation.org