annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/BedQualityD50KmValueFinder.java @ 9339:f812880963a9

Fixed: d50 interpolation always with complete river range
author mschaefer
date Mon, 30 Jul 2018 10:23:48 +0200
parents e07a2b4606c1
children c01f1e65903b
rev   line source
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
1 /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
2 * Software engineering by
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
5 *
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
9 */
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
10
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
11 package org.dive4elements.river.artifacts.sinfo.tkhcalculation;
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
12
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
13 import java.util.Calendar;
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
14 import java.util.Date;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
15 import java.util.List;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
16
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
17 import org.apache.commons.lang.math.DoubleRange;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
18 import org.apache.commons.math.ArgumentOutsideDomainException;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
19 import org.apache.commons.math.analysis.interpolation.LinearInterpolator;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
20 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
21 import org.apache.log4j.Logger;
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
22 import org.dive4elements.river.artifacts.math.Utils;
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
23 import org.dive4elements.river.artifacts.model.Calculation;
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
24 import org.dive4elements.river.backend.SedDBSessionHolder;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
25 import org.dive4elements.river.model.River;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
26 import org.hibernate.SQLQuery;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
27 import org.hibernate.Session;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
28 import org.hibernate.type.StandardBasicTypes;
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
29
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
30 import gnu.trove.TDoubleArrayList;
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
31
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
32 /**
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
33 * Searchable sorted km array with parallel bed measurements value array and linear interpolation for km and d50 between
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
34 * the array elements.<br />
8901
0a900d605d52 S-INFO Flowdepth work on TKH calculation
mschaefer
parents: 8898
diff changeset
35 * <br />
0a900d605d52 S-INFO Flowdepth work on TKH calculation
mschaefer
parents: 8898
diff changeset
36 * See comment of SQL command on how the values are filtered and aggregated.
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
37 *
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
38 * @author Matthias Schäfer
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
39 *
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
40 */
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
41 public class BedQualityD50KmValueFinder {
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
42
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
43 /***** FIELDS *****/
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
44
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
45 /**
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
46 * Private log to use here.
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
47 */
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
48 private static Logger log = Logger.getLogger(BedQualityD50KmValueFinder.class);
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
49
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
50 /**
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
51 * Query selecting all sub layer bed measurements with their d50 for a km range and a time period<br />
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
52 * <br />
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
53 * A km may have bed measurements for multiple dates, multiple distances from the river bank, and multiple depth layers.
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
54 * The query filters by km range, time period and layer (sub layer: below bed to max. 50 cm depth).<br />
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
55 *
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
56 * If PostgreSQL would support a median aggregate function like Oracle does, the aggregation could be placed into this
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
57 * query.
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
58 */
9017
9b9f5f4ddb80 Small changes with debug log
mschaefer
parents: 8964
diff changeset
59 private static final String SQL_BED_D50_SUBLAYER_MEASUREMENT = //
9091
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
60 "SELECT s.km, t.datum, p.tiefevon, p.tiefebis, a.d50"
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
61 + " FROM sohltest t INNER JOIN station s ON t.stationid = s.stationid"
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
62 + " INNER JOIN gewaesser g ON s.gewaesserid = g.gewaesserid"
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
63 + " INNER JOIN sohlprobe p ON t.sohltestid = p.sohltestid"
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
64 + " INNER JOIN siebanalyse a ON p.sohlprobeid = a.sohlprobeid"
9339
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
65 + " WHERE (g.name = :name)"
9091
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
66 + " AND (p.tiefevon > 0.0) AND (p.tiefebis <= 0.5)"
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
67 + " AND (t.datum BETWEEN :fromdate AND :todate)"
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
68 + " ORDER BY s.km ASC, a.d50 ASC";
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
69
9339
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
70 // + " WHERE (g.name = :name) AND (s.km BETWEEN :fromkm - 0.0001 AND :tokm + 0.0001)"
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
71 // + " AND (p.tiefevon > 0.0) AND (p.tiefebis <= 0.5)"
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
72 // + " AND (t.datum BETWEEN :fromdate AND :todate)"
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
73 // + " ORDER BY s.km ASC, a.d50 ASC";
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
74
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
75 private Calculation problems;
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
76
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
77 /**
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
78 * Real linear interpolator for kms and d50 values (m)
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
79 */
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
80 private final PolynomialSplineFunction interpolator;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
81
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
82 /***** CONSTRUCTORS *****/
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
83
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
84 private BedQualityD50KmValueFinder(final Calculation problems, final double[] kms, final double[] values) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
85 this.problems = problems;
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
86
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
87 this.interpolator = new LinearInterpolator().interpolate(kms, values);
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
88 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
89
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
90 /***** METHODS *****/
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
91
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
92 /**
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
93 * Sohlbeschaffenheit (D50 Korndurchmesser aus Seddb)
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
94 * Abhängig von Peiljahr
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
95 *
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
96 * @param problems
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
97 */
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
98 public static BedQualityD50KmValueFinder loadBedMeasurements(final Calculation problems, final River river, final DoubleRange kmRange,
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
99 final int soundingYear, final int validYears) {
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
100
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
101 /* construct valid measurement time range */
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
102 final Calendar cal = Calendar.getInstance();
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
103 cal.clear();
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
104
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
105 cal.set(soundingYear - validYears, 0, 1);
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
106 final Date startTime = cal.getTime();
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
107
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
108 cal.set(soundingYear + validYears, 11, 31);
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
109 final Date endTime = cal.getTime();
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
110
9091
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
111 final String seddbRiver = river.nameForSeddb();
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
112 log.debug(String.format("loadValues '%s' km %.3f - %.3f %tF - %tF", seddbRiver, kmRange.getMinimumDouble(), kmRange.getMaximumDouble(), startTime,
e07a2b4606c1 Fixed km order in d50 query
mschaefer
parents: 9086
diff changeset
113 endTime));
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
114 final Session session = SedDBSessionHolder.HOLDER.get();
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
115 final SQLQuery sqlQuery = session.createSQLQuery(SQL_BED_D50_SUBLAYER_MEASUREMENT).addScalar("km", StandardBasicTypes.DOUBLE)
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
116 .addScalar("datum", StandardBasicTypes.DATE).addScalar("tiefevon", StandardBasicTypes.DOUBLE).addScalar("tiefebis", StandardBasicTypes.DOUBLE)
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
117 .addScalar("d50", StandardBasicTypes.DOUBLE);
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
118 sqlQuery.setString("name", seddbRiver);
9339
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
119 // sqlQuery.setDouble("fromkm", kmRange.getMinimumDouble());
f812880963a9 Fixed: d50 interpolation always with complete river range
mschaefer
parents: 9091
diff changeset
120 // sqlQuery.setDouble("tokm", kmRange.getMaximumDouble());
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
121 sqlQuery.setDate("fromdate", startTime);
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
122 sqlQuery.setDate("todate", endTime);
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
123
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
124 final List<Object[]> rows = sqlQuery.list();
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
125 final TDoubleArrayList kms = new TDoubleArrayList();
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
126 final TDoubleArrayList values = new TDoubleArrayList();
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
127 final TDoubleArrayList kmd50s = new TDoubleArrayList();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
128
9017
9b9f5f4ddb80 Small changes with debug log
mschaefer
parents: 8964
diff changeset
129 // Median aggregate d50 values for each km
9081
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
130 if (rows != null) {
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
131 for (int i = 0; i <= rows.size() - 1; i++) {
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
132 log.trace("loadValues rows(" + i + ") " + rows.get(i)[0] + " " + rows.get(i)[1] + " " + rows.get(i)[2] + " " + rows.get(i)[3] + " "
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
133 + rows.get(i)[4]);
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
134 kmd50s.add((double) rows.get(i)[4]);
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
135 if (((i == rows.size() - 1) || !Utils.epsilonEquals((double) rows.get(i)[0], (double) rows.get(i + 1)[0], 0.0001))) {
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
136 final int k = kmd50s.size() / 2;
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
137 values.add(((k + k < kmd50s.size()) ? kmd50s.get(k) : (kmd50s.get(k - 1) + kmd50s.get(k)) / 2) / 1000);
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
138 kms.add((double) rows.get(i)[0]);
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
139 log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms.get(kms.size() - 1), values.get(values.size() - 1) * 1000,
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
140 kmd50s.size()));
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
141 kmd50s.clear();
a0feac6ea1ba Fixed d50 query, added log.trace
mschaefer
parents: 9040
diff changeset
142 }
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
143 }
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
144 }
9017
9b9f5f4ddb80 Small changes with debug log
mschaefer
parents: 8964
diff changeset
145 if (kms.size() >= 1)
9b9f5f4ddb80 Small changes with debug log
mschaefer
parents: 8964
diff changeset
146 log.debug(String.format("loadValues: %d kms found from %.3f to %.3f", kms.size(), kms.get(0), kms.get(kms.size() - 1)));
9b9f5f4ddb80 Small changes with debug log
mschaefer
parents: 8964
diff changeset
147 else
9b9f5f4ddb80 Small changes with debug log
mschaefer
parents: 8964
diff changeset
148 log.debug("loadValues: no kms found");
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
149
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
150 if (kms.size() < 2 || values.size() < 2) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
151 problems.addProblem("bedqualityd50kmvaluefinder.empty", soundingYear);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
152 return null;
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
153 }
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
154
8911
37ff7f435912 SINFO Flowdepth: more error checks, d50 interpolation, avoid negative tkh
mschaefer
parents: 8901
diff changeset
155 try {
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
156 return new BedQualityD50KmValueFinder(problems, kms.toNativeArray(), values.toNativeArray());
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
157 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
158 catch (final Exception e) {
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
159 e.printStackTrace();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
160 problems.addProblem("bedqualityd50kmvaluefinder.error", e.getLocalizedMessage());
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
161 return null;
8911
37ff7f435912 SINFO Flowdepth: more error checks, d50 interpolation, avoid negative tkh
mschaefer
parents: 8901
diff changeset
162 }
8898
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
163 }
89f3c5462a16 Implemented S-INFO Flowdepth TKH calculation
mschaefer
parents:
diff changeset
164
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
165 /**
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
166 * Returns the d50 value interpolated according to a km
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
167 *
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8915
diff changeset
168 * @return d50 (m) of the km, or NaN
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
169 */
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
170 public double findD50(final double km) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
171 try {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
172 return this.interpolator.value(km);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
173 }
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
174 catch (final ArgumentOutsideDomainException e) {
9086
b5dbcbaed42b Avoid too many regular exceptions
gernotbelger
parents: 9081
diff changeset
175 // e.printStackTrace();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
176
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
177 if (this.problems != null) {
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
178 this.problems.addProblem(km, "bedqualityd50kmvaluefinder.missing");
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
179 // Report only once
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
180 this.problems = null;
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
181 }
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
182
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
183 return Double.NaN;
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8921
diff changeset
184 }
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
185 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents: 8911
diff changeset
186 }

http://dive4elements.wald.intevation.org