Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java @ 8063:41d9014bfa02
Sediment density: Got rid of stupid extra year tracking.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Wed, 30 Jul 2014 18:34:48 +0200 |
parents | 52c364813cb1 |
children | 50102c41151e |
comparison
equal
deleted
inserted
replaced
8062:8489565ff563 | 8063:41d9014bfa02 |
---|---|
7 */ | 7 */ |
8 | 8 |
9 package org.dive4elements.river.artifacts.model.minfo; | 9 package org.dive4elements.river.artifacts.model.minfo; |
10 | 10 |
11 import java.io.Serializable; | 11 import java.io.Serializable; |
12 | |
13 import java.util.ArrayList; | 12 import java.util.ArrayList; |
14 import java.util.Collections; | 13 import java.util.Collections; |
15 import java.util.HashMap; | 14 import java.util.HashMap; |
15 import java.util.Iterator; | |
16 import java.util.List; | 16 import java.util.List; |
17 import java.util.Map; | 17 import java.util.Map; |
18 import java.util.Set; | 18 import java.util.Set; |
19 import java.util.TreeMap; | 19 import java.util.TreeMap; |
20 | 20 |
21 import org.apache.log4j.Logger; | 21 import org.apache.log4j.Logger; |
22 | |
23 import org.dive4elements.artifacts.common.utils.Config; | 22 import org.dive4elements.artifacts.common.utils.Config; |
24 | 23 |
25 | 24 |
26 /** Sediment Densities for multiple years. */ | 25 /** Sediment Densities for multiple years. */ |
27 public class SedimentDensity implements Serializable | 26 public class SedimentDensity implements Serializable |
35 "/artifact-database/options/sediment-density-factor/text()"; | 34 "/artifact-database/options/sediment-density-factor/text()"; |
36 | 35 |
37 public static final double SEDIMNET_DENSITY_FACTOR = | 36 public static final double SEDIMNET_DENSITY_FACTOR = |
38 getSedimentDensityFactor(); | 37 getSedimentDensityFactor(); |
39 | 38 |
40 private Map<Integer, List<SedimentDensityValue>> densities; | 39 private TreeMap<Integer, List<SedimentDensityValue>> densities; |
41 private List<Integer> years; | |
42 | 40 |
43 | 41 |
44 /** Figures out the sediment density factor from global config. */ | 42 /** Figures out the sediment density factor from global config. */ |
45 private static final double getSedimentDensityFactor() { | 43 private static final double getSedimentDensityFactor() { |
46 | 44 |
62 | 60 |
63 return factor; | 61 return factor; |
64 } | 62 } |
65 | 63 |
66 public SedimentDensity() { | 64 public SedimentDensity() { |
67 this.densities = new HashMap<Integer, List<SedimentDensityValue>>(); | 65 densities = new TreeMap<Integer, List<SedimentDensityValue>>(); |
68 this.years = new ArrayList<Integer>(); | |
69 } | 66 } |
70 | 67 |
71 public Map<Integer, List<SedimentDensityValue>> getDensities() { | 68 public Map<Integer, List<SedimentDensityValue>> getDensities() { |
72 return densities; | 69 return densities; |
73 } | |
74 | |
75 public void setDensities(Map<Integer, List<SedimentDensityValue>> densities) { | |
76 this.densities = densities; | |
77 } | 70 } |
78 | 71 |
79 public void addDensity(double km, double density, int year) { | 72 public void addDensity(double km, double density, int year) { |
80 | 73 |
81 logger.debug("adding " + year); | 74 logger.debug("adding " + year); |
88 list = new ArrayList<SedimentDensityValue>(); | 81 list = new ArrayList<SedimentDensityValue>(); |
89 densities.put(key, list); | 82 densities.put(key, list); |
90 } | 83 } |
91 | 84 |
92 list.add(new SedimentDensityValue(km, density, year)); | 85 list.add(new SedimentDensityValue(km, density, year)); |
93 | |
94 // XXX: Why do we store a redundant list of years, too? | |
95 // Years are the keys of densities so they can be easily | |
96 // accessed by their key set! | |
97 if (!years.contains(key)) { | |
98 logger.debug("new year"); | |
99 years.add(key); | |
100 } | |
101 } | |
102 | |
103 public List<Integer> getYears() { | |
104 return years; | |
105 } | |
106 | |
107 public void setYears(List<Integer> years) { | |
108 this.years = years; | |
109 } | 86 } |
110 | 87 |
111 /** | 88 /** |
112 * Get the density at year. | 89 * Get the density at year. |
113 * Measured densities are valid until the next measurement. | 90 * Measured densities are valid until the next measurement. |
114 * If no measurement was found 1.8 is returned. | 91 * If no measurement was found 1.8 is returned. |
115 */ | 92 */ |
116 public double getDensity(double km, int year) { | 93 public double getDensity(double km, int year) { |
117 Collections.sort(this.years); | 94 |
118 if (this.years.size() == 1 && years.get(0) <= year) { | 95 if (densities.isEmpty()) { |
119 logger.debug("get density from year " + year + " at km " + km); | 96 return SEDIMNET_DENSITY_FACTOR; |
120 return getDensityAtKm(densities.get(years.get(0)), km); | 97 } |
121 } | 98 |
122 if (this.years.size() > 1) { | 99 if (densities.size() == 1) { |
123 for (int i = 0, I = years.size()-1; i < I; i++) { | 100 Map.Entry<Integer, List<SedimentDensityValue>> entry = densities.firstEntry(); |
124 int y1 = years.get(i); | 101 return entry.getKey() <= year |
125 int y2 = years.get(i + 1); | 102 ? getDensityAtKm(entry.getValue(), km) |
126 if (year >= y1 && year < y2) { | 103 : SEDIMNET_DENSITY_FACTOR; |
127 return getDensityAtKm(densities.get(y1), km); | 104 } |
128 } | 105 Iterator<Map.Entry<Integer, List<SedimentDensityValue>>> iter = |
129 else if (year >= y2 && i == years.size() -1) { | 106 densities.entrySet().iterator(); |
130 return getDensityAtKm(densities.get(y2), km); | 107 |
131 } | 108 Map.Entry<Integer, List<SedimentDensityValue>> last = iter.next(); |
109 | |
110 while (iter.hasNext()) { | |
111 Map.Entry<Integer, List<SedimentDensityValue>> current = iter.next(); | |
112 last = current; | |
113 int y1 = last.getKey(); | |
114 int y2 = current.getKey(); | |
115 if (year >= y1 && year < y2) { | |
116 return getDensityAtKm(last.getValue(), km); | |
117 } | |
118 if (year >= y2 && !iter.hasNext()) { | |
119 return getDensityAtKm(current.getValue(), km); | |
132 } | 120 } |
133 } | 121 } |
134 return SEDIMNET_DENSITY_FACTOR; | 122 return SEDIMNET_DENSITY_FACTOR; |
135 } | 123 } |
136 | 124 |
137 /** Get (sorted) map of km to density of all years. */ | 125 /** Get (sorted) map of km to density of all years. */ |
138 public double[][] getAllDensities() | 126 public double[][] getAllDensities() |
139 { | 127 { |
140 TreeMap<Double, Double> map = new TreeMap<Double,Double>(); | 128 TreeMap<Double, Double> map = new TreeMap<Double,Double>(); |
141 for (int year: years) { | 129 // XXX: This looks stupid. |
142 for (SedimentDensityValue sdv: densities.get(year)) { | 130 for (List<SedimentDensityValue> sdvs: densities.values()) { |
131 for (SedimentDensityValue sdv: sdvs) { | |
143 map.put(sdv.getKm(), sdv.getDensity()); | 132 map.put(sdv.getKm(), sdv.getDensity()); |
144 } | 133 } |
145 } | 134 } |
146 double[][] points = new double[2][map.keySet().size()]; | 135 double[][] points = new double[2][map.keySet().size()]; |
147 int i = 0; | 136 int i = 0; |
156 | 145 |
157 /** Get points km,density (sorted by km), for a given year. */ | 146 /** Get points km,density (sorted by km), for a given year. */ |
158 public double[][] getDensities(int year) | 147 public double[][] getDensities(int year) |
159 { | 148 { |
160 TreeMap<Double, Double> map = new TreeMap<Double,Double>(); | 149 TreeMap<Double, Double> map = new TreeMap<Double,Double>(); |
150 List<SedimentDensityValue> list = densities.get(year); | |
151 if (list == null) { | |
152 return new double[2][0]; | |
153 } | |
161 for (SedimentDensityValue sdv: densities.get(year)) { | 154 for (SedimentDensityValue sdv: densities.get(year)) { |
162 map.put(sdv.getKm(), sdv.getDensity()); | 155 map.put(sdv.getKm(), sdv.getDensity()); |
163 } | 156 } |
164 double[][] points = new double[2][map.keySet().size()]; | 157 double[][] points = new double[2][map.size()]; |
165 int i = 0; | 158 int i = 0; |
166 for (Map.Entry<Double, Double> kmDens: map.entrySet()) { | 159 for (Map.Entry<Double, Double> kmDens: map.entrySet()) { |
167 points[0][i] = kmDens.getKey(); | 160 points[0][i] = kmDens.getKey(); |
168 points[1][i] = kmDens.getValue(); | 161 points[1][i] = kmDens.getValue(); |
169 i++; | 162 i++; |