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++;

http://dive4elements.wald.intevation.org