comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedQualityCalculation.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 59b4f6cf1cf4
children 36faef4f8acb
comparison
equal deleted inserted replaced
8586:19fde13e2db4 8587:07c9ac22f611
108 dr.getFrom(), 108 dr.getFrom(),
109 dr.getTo()); 109 dr.getTo());
110 BedQualityResult result = new BedQualityResult(); 110 BedQualityResult result = new BedQualityResult();
111 result.setDateRange(dr); 111 result.setDateRange(dr);
112 if (bedDiameter != null) { 112 if (bedDiameter != null) {
113 result.add(calculateBedParameter(bedMeasurements, dr)); 113 result.add(calculateBedParameter(bedMeasurements));
114 for (String bd : bedDiameter) { 114 for (String bd : bedDiameter) {
115 BedDiameterResult bedResult = 115 result.add (calculateBed(bedMeasurements, bd));
116 calculateBed(bedMeasurements, bd, dr);
117
118 // Avoid adding empty result sets.
119 if (!bedResult.isEmpty()) {
120 result.add(bedResult);
121 }
122 } 116 }
123 } 117 }
124 if (bedloadDiameter != null) { 118 if (bedloadDiameter != null) {
125 for (String bld : bedloadDiameter) { 119 for (String bld : bedloadDiameter) {
126 BedloadDiameterResult loadResult = 120 result.add(calculateBedload(loadMeasurements, bld));
127 calculateBedload(loadMeasurements, bld, dr);
128 result.add(loadResult);
129 } 121 }
130 } 122 }
131 results.add(result); 123 results.add(result);
132 } 124 }
133 125
134 return new CalculationResult( 126 return new CalculationResult(
135 results.toArray(new BedQualityResult[results.size()]), this); 127 results.toArray(new BedQualityResult[results.size()]), this);
136 } 128 }
137 129
138 private BedParametersResult calculateBedParameter( 130 private BedQualityResultValue[] calculateBedParameter(
139 QualityMeasurements qm, 131 QualityMeasurements qm
140 DateRange dr
141 ) { 132 ) {
142 List<Double> kms = qm.getKms(); 133 List<Double> kms = qm.getKms();
134 TDoubleArrayList location = new TDoubleArrayList();
143 QualityMeasurements capFiltered = filterCapMeasurements(qm); 135 QualityMeasurements capFiltered = filterCapMeasurements(qm);
144 QualityMeasurements subFiltered = filterSubMeasurements(qm); 136 QualityMeasurements subFiltered = filterSubMeasurements(qm);
145 TDoubleArrayList location = new TDoubleArrayList();
146 TDoubleArrayList porosityCap = new TDoubleArrayList(); 137 TDoubleArrayList porosityCap = new TDoubleArrayList();
147 TDoubleArrayList porositySub = new TDoubleArrayList(); 138 TDoubleArrayList porositySub = new TDoubleArrayList();
148 TDoubleArrayList densityCap = new TDoubleArrayList(); 139 TDoubleArrayList densityCap = new TDoubleArrayList();
149 TDoubleArrayList densitySub = new TDoubleArrayList(); 140 TDoubleArrayList densitySub = new TDoubleArrayList();
150 141
171 porositySub.add((pSubRes / pSub.length) * 100); 162 porositySub.add((pSubRes / pSub.length) * 100);
172 densityCap.add((dCapRes / dCap.length) / 1000); 163 densityCap.add((dCapRes / dCap.length) / 1000);
173 densitySub.add((dSubRes / dSub.length) / 1000); 164 densitySub.add((dSubRes / dSub.length) / 1000);
174 165
175 } 166 }
176 167 return new BedQualityResultValue[] {
177 return new BedParametersResult( 168 new BedQualityResultValue("porosity",
178 location, 169 new double[][] {location.toNativeArray(), porositySub.toNativeArray()},
179 porosityCap, 170 "sublayer"),
180 porositySub, 171 new BedQualityResultValue("porosity",
181 densityCap, 172 new double[][] {location.toNativeArray(), porosityCap.toNativeArray()},
182 densitySub); 173 "toplayer"),
183 } 174 new BedQualityResultValue("density",
184 175 new double[][] {location.toNativeArray(), densitySub.toNativeArray()},
185 protected BedDiameterResult calculateBed( 176 "sublayer"),
177 new BedQualityResultValue("density",
178 new double[][] {location.toNativeArray(), densityCap.toNativeArray()},
179 "toplayer")};
180 }
181
182 protected BedQualityResultValue[] calculateBed(
186 QualityMeasurements qm, 183 QualityMeasurements qm,
187 String diameter, 184 String diameter
188 DateRange range
189 ) { 185 ) {
190 List<Double> kms = qm.getKms(); 186 List<Double> kms = qm.getKms();
191 TDoubleArrayList location = new TDoubleArrayList(); 187 TDoubleArrayList location = new TDoubleArrayList();
192 TDoubleArrayList avDiameterCap = new TDoubleArrayList(); 188 TDoubleArrayList avDiameterCap = new TDoubleArrayList();
193 TDoubleArrayList avDiameterSub = new TDoubleArrayList(); 189 TDoubleArrayList avDiameterSub = new TDoubleArrayList();
203 double avSub = calculateAverage(sm, diameter); 199 double avSub = calculateAverage(sm, diameter);
204 location.add(km); 200 location.add(km);
205 avDiameterCap.add(avCap * 1000);// bring to mm. 201 avDiameterCap.add(avCap * 1000);// bring to mm.
206 avDiameterSub.add(avSub * 1000); 202 avDiameterSub.add(avSub * 1000);
207 } 203 }
208 return new BedDiameterResult( 204 return new BedQualityResultValue[] {
209 diameter, 205 new BedQualityResultValue(diameter,
210 avDiameterCap, 206 new double[][] {location.toNativeArray(), avDiameterSub.toNativeArray()},
211 avDiameterSub, 207 "sublayer"),
212 location); 208 new BedQualityResultValue(diameter,
209 new double[][] {location.toNativeArray(), avDiameterCap.toNativeArray()},
210 "toplayer")};
213 } 211 }
214 212
215 private double[] calculateDensity( 213 private double[] calculateDensity(
216 QualityMeasurements capFiltered, 214 QualityMeasurements capFiltered,
217 double[] porosity 215 double[] porosity
239 } 237 }
240 238
241 return results; 239 return results;
242 } 240 }
243 241
244 protected BedloadDiameterResult calculateBedload( 242 protected BedQualityResultValue calculateBedload(
245 QualityMeasurements qm, 243 QualityMeasurements qm,
246 String diameter, 244 String diameter
247 DateRange range
248 ) { 245 ) {
249 List<Double> kms = qm.getKms(); 246 List<Double> kms = qm.getKms();
250 TDoubleArrayList location = new TDoubleArrayList(); 247 TDoubleArrayList location = new TDoubleArrayList();
251 TDoubleArrayList avDiameter = new TDoubleArrayList(); 248 TDoubleArrayList avDiameter = new TDoubleArrayList();
252 for (double km : kms) { 249 for (double km : kms) {
253 List<QualityMeasurement> measurements = qm.getMeasurements(km); 250 List<QualityMeasurement> measurements = qm.getMeasurements(km);
254 double mid = calculateAverage(measurements, diameter); 251 double mid = calculateAverage(measurements, diameter);
255 location.add(km); 252 location.add(km);
256 avDiameter.add(mid * 1000); 253 avDiameter.add(mid * 1000);
257 } 254 }
258 return new BedloadDiameterResult( 255 return new BedQualityResultValue(diameter,
259 diameter, 256 new double[][] {location.toNativeArray(), avDiameter.toNativeArray()},
260 avDiameter, 257 "bedload");
261 location,
262 range);
263 } 258 }
264 259
265 protected double calculateAverage( 260 protected double calculateAverage(
266 List<QualityMeasurement> list, 261 List<QualityMeasurement> list,
267 String diameter 262 String diameter

http://dive4elements.wald.intevation.org