Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java @ 2792:fe987587ebc9
Merged revisions 4539-4540,4543,4545-4546 via svnmerge from
file:///home/clients/bsh/bsh-generischer-viewer/Material/SVN/flys-artifacts/trunk
........
r4539 | teichmann | 2012-05-27 20:02:13 +0200 (So, 27 Mai 2012) | 1 line
FixA: Added forgotten csv/report facets/generators to conf.
........
r4540 | teichmann | 2012-05-27 20:11:31 +0200 (So, 27 Mai 2012) | 1 line
FixA: Fixed class cast bug in report facet.
........
r4543 | teichmann | 2012-05-28 20:35:01 +0200 (Mo, 28 Mai 2012) | 1 line
FixA: Added facet to return delta w/t as CSV
........
r4545 | teichmann | 2012-05-28 22:59:27 +0200 (Mo, 28 Mai 2012) | 1 line
FixA: Made Delta W/t calculation finally work
........
r4546 | teichmann | 2012-05-28 23:34:24 +0200 (Mo, 28 Mai 2012) | 1 line
FixA: corrected fitting (Q->W instead W->Q).
........
flys-artifacts/tags/2.7@4547 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 29 May 2012 04:58:29 +0000 |
parents | 063b784b60b4 |
children | 3cda41b5eb23 |
comparison
equal
deleted
inserted
replaced
2791:c9815016a3bb | 2792:fe987587ebc9 |
---|---|
123 } | 123 } |
124 } | 124 } |
125 | 125 |
126 public CalculationResult calculate() { | 126 public CalculationResult calculate() { |
127 | 127 |
128 boolean debug = log.isDebugEnabled(); | |
129 | |
128 FixingsOverview overview = | 130 FixingsOverview overview = |
129 FixingsOverviewFactory.getOverview(river); | 131 FixingsOverviewFactory.getOverview(river); |
130 | 132 |
131 if (overview == null) { | 133 if (overview == null) { |
132 addProblem("fix.no.overview.available"); | 134 addProblem("fix.no.overview.available"); |
171 // TODO: i18n | 173 // TODO: i18n |
172 addProblem("fix.too.less.data.columns"); | 174 addProblem("fix.too.less.data.columns"); |
173 return new CalculationResult(this); | 175 return new CalculationResult(this); |
174 } | 176 } |
175 | 177 |
176 double [] kms = DoubleUtil.explode(from, to, step); | 178 double [] kms = DoubleUtil.explode(from, to, step / 1000.0); |
177 | 179 |
178 double [] ws = new double[dataColumns.size()]; | 180 double [] ws = new double[dataColumns.size()]; |
179 double [] qs = new double[ws.length]; | 181 double [] qs = new double[ws.length]; |
180 | 182 |
181 String [] parameterNames = func.getParameterNames(); | 183 String [] parameterNames = func.getParameterNames(); |
182 | 184 |
183 Parameters results = | 185 Parameters results = |
184 new Parameters(createColumnNames(parameterNames)); | 186 new Parameters(createColumnNames(parameterNames)); |
185 | 187 |
186 boolean invalid = false; | 188 boolean invalid = false; |
189 | |
190 if (debug) { | |
191 log.debug("number of kms: " + kms.length); | |
192 } | |
193 | |
194 int numFailed = 0; | |
187 | 195 |
188 for (int i = 0; i < kms.length; ++i) { | 196 for (int i = 0; i < kms.length; ++i) { |
189 double km = kms[i]; | 197 double km = kms[i]; |
190 | 198 |
191 for (int j = 0; j < ws.length; ++j) { | 199 for (int j = 0; j < ws.length; ++j) { |
196 } | 204 } |
197 | 205 |
198 // TODO: Do preprocessing here! | 206 // TODO: Do preprocessing here! |
199 double [] parameters = fit(func, km, ws, qs); | 207 double [] parameters = fit(func, km, ws, qs); |
200 if (parameters == null) { // Problems are reported already. | 208 if (parameters == null) { // Problems are reported already. |
209 ++numFailed; | |
201 continue; | 210 continue; |
202 } | 211 } |
203 | 212 |
204 int row = results.newRow(); | 213 int row = results.newRow(); |
205 | 214 |
213 } | 222 } |
214 } | 223 } |
215 // TODO: Calculate statistics, too! | 224 // TODO: Calculate statistics, too! |
216 } | 225 } |
217 | 226 |
227 if (debug) { | |
228 log.debug("success: " + (kms.length - numFailed)); | |
229 log.debug("failed: " + numFailed); | |
230 } | |
231 | |
218 if (invalid) { | 232 if (invalid) { |
219 // TODO: i18n | 233 // TODO: i18n |
220 addProblem("fix.invalid.values"); | 234 addProblem("fix.invalid.values"); |
221 results.removeNaNs(); | 235 results.removeNaNs(); |
222 } | 236 } |
235 public DeltaWTsKM calculateDeltaWTs( | 249 public DeltaWTsKM calculateDeltaWTs( |
236 Function function, | 250 Function function, |
237 FixingsOverview overview, | 251 FixingsOverview overview, |
238 Parameters results | 252 Parameters results |
239 ) { | 253 ) { |
254 boolean debug = log.isDebugEnabled(); | |
255 | |
240 DeltaWTsKM deltaWTsKM = new DeltaWTsKM(results.size()); | 256 DeltaWTsKM deltaWTsKM = new DeltaWTsKM(results.size()); |
241 | 257 |
242 Column [][] analysisColumns = getAnalysisColumns(overview); | 258 Column [][] analysisColumns = getAnalysisColumns(overview); |
243 | 259 |
244 int [] parameterIndices = | 260 int [] parameterIndices = |
247 double [] parameterValues = | 263 double [] parameterValues = |
248 new double[parameterIndices.length]; | 264 new double[parameterIndices.length]; |
249 | 265 |
250 double [] ow = new double[1]; | 266 double [] ow = new double[1]; |
251 | 267 |
268 int kmIdx = results.columnIndex("km"); | |
269 | |
252 for (int i = 0, N = results.size(); i < N; ++i) { | 270 for (int i = 0, N = results.size(); i < N; ++i) { |
253 double km = results.get(i, "km"); | 271 double km = results.get(i, kmIdx); |
254 results.get(i, parameterIndices, parameterValues); | 272 results.get(i, parameterIndices, parameterValues); |
255 | 273 |
256 DeltaWTsKM.KM dwtkm = new DeltaWTsKM.KM(km); | 274 DeltaWTsKM.KM dwtkm = new DeltaWTsKM.KM(km); |
257 deltaWTsKM.add(dwtkm); | 275 deltaWTsKM.add(dwtkm); |
258 | 276 |
262 | 280 |
263 // Evaluate all columns for all analysis periods. | 281 // Evaluate all columns for all analysis periods. |
264 for (int j = 0; j < analysisColumns.length; ++j) { | 282 for (int j = 0; j < analysisColumns.length; ++j) { |
265 Column [] periodColumns = analysisColumns[j]; | 283 Column [] periodColumns = analysisColumns[j]; |
266 | 284 |
285 int failedQ = 0; | |
286 int failedW = 0; | |
287 int failedC = 0; | |
288 | |
267 for (int k = 0; k < periodColumns.length; ++k) { | 289 for (int k = 0; k < periodColumns.length; ++k) { |
268 Column pc = periodColumns[k]; | 290 Column pc = periodColumns[k]; |
269 | 291 |
270 // Q from real data. | 292 // Q from real data. |
271 double q = pc.data.getQ(km); | 293 double q = pc.data.getQ(km); |
272 if (Double.isNaN(q)) { | 294 if (Double.isNaN(q)) { |
295 ++failedQ; | |
273 continue; | 296 continue; |
274 } | 297 } |
275 | 298 |
276 // Calculate W from function. | 299 // Calculate W from function. |
277 double nw = instance.value(q); | 300 double nw = instance.value(q); |
278 if (Double.isNaN(nw)) { | 301 if (Double.isNaN(nw)) { |
302 ++failedC; | |
279 continue; | 303 continue; |
280 } | 304 } |
281 | 305 |
282 // W from real data. | 306 // W from real data. |
283 pc.data.getW(km, ow); | 307 pc.data.getW(km, ow); |
284 | 308 |
285 if (Double.isNaN(ow[0])) { | 309 if (Double.isNaN(ow[0])) { |
310 ++failedW; | |
286 continue; | 311 continue; |
287 } | 312 } |
288 | 313 |
289 double deltaW = ow[0] - nw; | 314 double deltaW = (ow[0] - nw)*100.0; // in cm |
290 | 315 |
291 DeltaWT deltaWT = new DeltaWT( | 316 DeltaWT deltaWT = new DeltaWT( |
292 deltaW, | 317 deltaW, |
293 pc.meta.getStartTime(), | 318 pc.meta.getStartTime(), |
294 pc.meta.getDescription()); | 319 pc.meta.getDescription()); |
295 | 320 |
296 dwtkm.add(deltaWT); | 321 dwtkm.add(deltaWT); |
297 } | 322 } |
323 if (debug) { | |
324 log.debug("failed W: " + failedW); | |
325 log.debug("failed Q: " + failedQ); | |
326 log.debug("failed C: " + failedC); | |
327 log.debug("input size: " + periodColumns.length); | |
328 log.debug("outpt size: " + dwtkm.size()); | |
329 } | |
298 } | 330 } |
299 } | 331 } |
300 | 332 |
301 return deltaWTsKM; | 333 return deltaWTsKM; |
302 } | 334 } |
319 } // class Column | 351 } // class Column |
320 | 352 |
321 /** Fetch meta and data columns for analysis periods. */ | 353 /** Fetch meta and data columns for analysis periods. */ |
322 protected Column [][] getAnalysisColumns(FixingsOverview overview) { | 354 protected Column [][] getAnalysisColumns(FixingsOverview overview) { |
323 | 355 |
356 boolean debug = log.isDebugEnabled(); | |
357 if (debug) { | |
358 log.debug("number analysis periods: " + analysisPeriods.length); | |
359 } | |
360 | |
324 Column columns [][] = new Column[analysisPeriods.length][]; | 361 Column columns [][] = new Column[analysisPeriods.length][]; |
325 | 362 |
326 Range range = new Range(from, to); | 363 Range range = new Range(from, to); |
327 SectorRangeFilter sectorRangeFilter = | 364 SectorRangeFilter sectorRangeFilter = |
328 new SectorRangeFilter(qSectorStart, qSectorEnd); | 365 new SectorRangeFilter(qSectorStart, qSectorEnd); |
343 | 380 |
344 filter.add(dateRangeFilter); | 381 filter.add(dateRangeFilter); |
345 filter.add(sectorRangeFilter); | 382 filter.add(sectorRangeFilter); |
346 | 383 |
347 List<Fixing.Column> metaCols = overview.filter(range, filter); | 384 List<Fixing.Column> metaCols = overview.filter(range, filter); |
385 | |
386 if (debug) { | |
387 log.debug("number of filtered columns: " + metaCols.size()); | |
388 } | |
348 | 389 |
349 ArrayList<Column> cols = new ArrayList<Column>(metaCols.size()); | 390 ArrayList<Column> cols = new ArrayList<Column>(metaCols.size()); |
350 | 391 |
351 // Only use columns which have data. | 392 // Only use columns which have data. |
352 for (Fixing.Column meta: metaCols) { | 393 for (Fixing.Column meta: metaCols) { |
353 FixingsColumn data = fcf.getColumnData(meta); | 394 FixingsColumn data = fcf.getColumnData(meta); |
354 if (data != null) { | 395 if (data != null) { |
355 cols.add(new Column(meta, data)); | 396 cols.add(new Column(meta, data)); |
356 } | 397 } |
398 } | |
399 | |
400 if (debug) { | |
401 log.debug("failed loading: " + (metaCols.size()-cols.size())); | |
357 } | 402 } |
358 columns[i] = cols.toArray(new Column[cols.size()]); | 403 columns[i] = cols.toArray(new Column[cols.size()]); |
359 } | 404 } |
360 | 405 |
361 return columns; | 406 return columns; |
376 double [] qs | 421 double [] qs |
377 ) { | 422 ) { |
378 LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer(); | 423 LevenbergMarquardtOptimizer lmo = new LevenbergMarquardtOptimizer(); |
379 CurveFitter cf = new CurveFitter(lmo); | 424 CurveFitter cf = new CurveFitter(lmo); |
380 | 425 |
381 boolean missingWs = false; | |
382 boolean missingQs = false; | |
383 | |
384 for (int i = 0; i < ws.length; ++i) { | 426 for (int i = 0; i < ws.length; ++i) { |
385 boolean ignore = false; | 427 if (!Double.isNaN(ws[i]) && !Double.isNaN(qs[i])) { |
386 if (Double.isNaN(ws[i])) { | 428 cf.addObservedPoint(qs[i], ws[i]); |
387 ignore = true; | |
388 if (!missingWs) { | |
389 missingWs = true; | |
390 // TODO: i18n | |
391 addProblem(km, "fix.missing.w"); | |
392 } | |
393 } | |
394 if (Double.isNaN(qs[i])) { | |
395 ignore = true; | |
396 if (!missingQs) { | |
397 missingQs = true; | |
398 // TODO: i18n | |
399 addProblem(km, "fix.missing.q"); | |
400 } | |
401 } | |
402 if (!ignore) { | |
403 cf.addObservedPoint(ws[i], qs[i]); | |
404 } | 429 } |
405 } | 430 } |
406 | 431 |
407 try { | 432 try { |
408 return cf.fit(function, function.getInitialGuess()); | 433 return cf.fit(function, function.getInitialGuess()); |
409 } | 434 } |
410 catch (MathException me) { | 435 catch (MathException me) { |
436 log.warn(me, me); | |
411 addProblem(km, "fix.fitting.failed"); | 437 addProblem(km, "fix.fitting.failed"); |
412 } | 438 } |
413 | 439 |
414 return null; | 440 return null; |
415 } | 441 } |