Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java @ 3020:ce796f1db30e
FixA: Store AnalysisPeriods into FixResult now.
flys-artifacts/trunk@4587 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 05 Jun 2012 13:51:42 +0000 |
parents | e341606faeb4 |
children | 705d2058b682 |
comparison
equal
deleted
inserted
replaced
3019:484f3dad4bfd | 3020:ce796f1db30e |
---|---|
253 // TODO: i18n | 253 // TODO: i18n |
254 addProblem("fix.invalid.values"); | 254 addProblem("fix.invalid.values"); |
255 results.removeNaNs(); | 255 results.removeNaNs(); |
256 } | 256 } |
257 | 257 |
258 // Calculate Delta W/t | 258 KMIndex<AnalysisPeriod []> analysisPeriods = |
259 DeltaWTsKM deltaWTsKM = calculateDeltaWTs( | 259 calculateAnalysisPeriods(func, results, overview); |
260 func, | |
261 overview, | |
262 results); | |
263 | 260 |
264 outliers.sort(); | 261 outliers.sort(); |
265 | 262 analysisPeriods.sort(); |
266 FixResult fr = new FixResult(results, deltaWTsKM, outliers); | 263 |
264 FixResult fr = new FixResult(results, analysisPeriods, outliers); | |
267 | 265 |
268 return new CalculationResult(fr, this); | 266 return new CalculationResult(fr, this); |
269 } | 267 } |
270 | 268 |
271 | 269 |
297 } | 295 } |
298 | 296 |
299 return columns; | 297 return columns; |
300 } | 298 } |
301 | 299 |
302 public DeltaWTsKM calculateDeltaWTs( | 300 protected KMIndex<AnalysisPeriod []> calculateAnalysisPeriods( |
303 Function function, | |
304 FixingsOverview overview, | |
305 Parameters results | |
306 ) { | |
307 boolean debug = log.isDebugEnabled(); | |
308 | |
309 DeltaWTsKM deltaWTsKM = new DeltaWTsKM(results.size()); | |
310 | |
311 Column [][] analysisColumns = getAnalysisColumns(overview); | |
312 | |
313 int [] parameterIndices = | |
314 results.columnIndices(function.getParameterNames()); | |
315 | |
316 double [] parameterValues = | |
317 new double[parameterIndices.length]; | |
318 | |
319 double [] ow = new double[1]; | |
320 | |
321 int kmIdx = results.columnIndex("km"); | |
322 | |
323 for (int i = 0, N = results.size(); i < N; ++i) { | |
324 double km = results.get(i, kmIdx); | |
325 results.get(i, parameterIndices, parameterValues); | |
326 | |
327 DeltaWTsKM.KM dwtkm = new DeltaWTsKM.KM(km); | |
328 deltaWTsKM.add(dwtkm); | |
329 | |
330 // This is the paraterized function for a given km. | |
331 de.intevation.flys.artifacts.math.Function instance = | |
332 function.instantiate(parameterValues); | |
333 | |
334 // Evaluate all columns for all analysis periods. | |
335 for (int j = 0; j < analysisColumns.length; ++j) { | |
336 Column [] periodColumns = analysisColumns[j]; | |
337 | |
338 int failedQ = 0; | |
339 int failedW = 0; | |
340 int failedC = 0; | |
341 | |
342 for (int k = 0; k < periodColumns.length; ++k) { | |
343 Column pc = periodColumns[k]; | |
344 | |
345 // Q from real data. | |
346 double q = pc.data.getQ(km); | |
347 if (Double.isNaN(q)) { | |
348 ++failedQ; | |
349 continue; | |
350 } | |
351 | |
352 // Calculate W from function. | |
353 double nw = instance.value(q); | |
354 if (Double.isNaN(nw)) { | |
355 ++failedC; | |
356 continue; | |
357 } | |
358 | |
359 // W from real data. | |
360 pc.data.getW(km, ow); | |
361 | |
362 if (Double.isNaN(ow[0])) { | |
363 ++failedW; | |
364 continue; | |
365 } | |
366 | |
367 double deltaW = (ow[0] - nw)*100.0; // in cm | |
368 | |
369 DeltaWT deltaWT = new DeltaWT( | |
370 deltaW, | |
371 pc.meta.getStartTime(), | |
372 pc.meta.getDescription()); | |
373 | |
374 dwtkm.add(deltaWT); | |
375 } | |
376 if (debug) { | |
377 log.debug("failed W: " + failedW); | |
378 log.debug("failed Q: " + failedQ); | |
379 log.debug("failed C: " + failedC); | |
380 log.debug("input size: " + periodColumns.length); | |
381 log.debug("outpt size: " + dwtkm.size()); | |
382 } | |
383 } | |
384 } | |
385 | |
386 return deltaWTsKM; | |
387 } | |
388 | |
389 protected List<AnalysisPeriodsKM> calculateAnalysisPeriods( | |
390 Function function, | 301 Function function, |
391 Parameters parameters, | 302 Parameters parameters, |
392 FixingsOverview overview | 303 FixingsOverview overview |
393 ) { | 304 ) { |
394 ArrayList<AnalysisPeriodsKM> results | |
395 = new ArrayList<AnalysisPeriodsKM>(parameters.size()); | |
396 | |
397 Range range = new Range(from, to); | 305 Range range = new Range(from, to); |
398 | 306 |
399 int kmIndex = parameters.columnIndex("km"); | 307 int kmIndex = parameters.columnIndex("km"); |
400 | 308 |
401 ColumnCache cc = new ColumnCache(); | 309 ColumnCache cc = new ColumnCache(); |
407 | 315 |
408 double [] parameterValues = new double[parameterIndices.length]; | 316 double [] parameterValues = new double[parameterIndices.length]; |
409 | 317 |
410 DateAverager dateAverager = new DateAverager(); | 318 DateAverager dateAverager = new DateAverager(); |
411 | 319 |
412 for (int row = 0, P = parameters.size(); row < P; ++row) { | 320 KMIndex<AnalysisPeriod []> results = |
321 new KMIndex<AnalysisPeriod []>(parameters.size()); | |
322 | |
323 for (int row = 0, R = parameters.size(); row < R; ++row) { | |
413 double km = parameters.get(row, kmIndex); | 324 double km = parameters.get(row, kmIndex); |
414 parameters.get(row, parameterIndices, parameterValues); | 325 parameters.get(row, parameterIndices, parameterValues); |
415 | 326 |
416 // This is the paraterized function for a given km. | 327 // This is the paraterized function for a given km. |
417 de.intevation.flys.artifacts.math.Function instance = | 328 de.intevation.flys.artifacts.math.Function instance = |
418 function.instantiate(parameterValues); | 329 function.instantiate(parameterValues); |
419 | 330 |
420 KmFilter kmFilter = new KmFilter(km); | 331 KmFilter kmFilter = new KmFilter(km); |
332 | |
333 ArrayList<AnalysisPeriod> periodResults = | |
334 new ArrayList<AnalysisPeriod>(analysisPeriods.length); | |
421 | 335 |
422 for (DateRange analysisPeriod: analysisPeriods) { | 336 for (DateRange analysisPeriod: analysisPeriods) { |
423 DateRangeFilter drf = new DateRangeFilter( | 337 DateRangeFilter drf = new DateRangeFilter( |
424 analysisPeriod.getFrom(), | 338 analysisPeriod.getFrom(), |
425 analysisPeriod.getTo()); | 339 analysisPeriod.getTo()); |
340 | |
341 QWD [] qSectorAverages = new QWD[4]; | |
342 ArrayList<QWD> allQWDs = new ArrayList<QWD>(); | |
426 | 343 |
427 // for all Q sectors. | 344 // for all Q sectors. |
428 for (int qSector = qSectorStart; qSector < qSectorEnd; ++qSector) { | 345 for (int qSector = qSectorStart; qSector < qSectorEnd; ++qSector) { |
429 | 346 |
430 AndFilter filter = new AndFilter(); | 347 AndFilter filter = new AndFilter(); |
478 } | 395 } |
479 | 396 |
480 // Calulate average per Q sector. | 397 // Calulate average per Q sector. |
481 int N = qwds.size(); | 398 int N = qwds.size(); |
482 if (N > 0) { | 399 if (N > 0) { |
400 allQWDs.addAll(qwds); | |
483 double avgW = sumW / N; | 401 double avgW = sumW / N; |
484 double avgQ = sumQ / N; | 402 double avgQ = sumQ / N; |
485 | 403 |
486 double avgFw = instance.value(avgQ); | 404 double avgFw = instance.value(avgQ); |
487 if (!Double.isNaN(avgFw)) { | 405 if (!Double.isNaN(avgFw)) { |
491 String avgDescription = "avg.deltawt." + qSector; | 409 String avgDescription = "avg.deltawt." + qSector; |
492 | 410 |
493 QWD avgQWD = new QWD( | 411 QWD avgQWD = new QWD( |
494 avgQ, avgW, avgDescription, avgDate, avgDw); | 412 avgQ, avgW, avgDescription, avgDate, avgDw); |
495 | 413 |
496 // TODO: Store average value. | 414 qSectorAverages[qSector] = avgQWD; |
497 } | |
498 else { | |
499 // TODO: Store | |
500 } | 415 } |
501 } | 416 } |
502 } // for all Q sectors | 417 } // for all Q sectors |
503 } | 418 |
419 QWD [] aqwds = allQWDs.toArray(new QWD[allQWDs.size()]); | |
420 | |
421 AnalysisPeriod periodResult = new AnalysisPeriod( | |
422 analysisPeriod, aqwds, qSectorAverages); | |
423 periodResults.add(periodResult); | |
424 } | |
425 | |
426 results.add(km, periodResults.toArray( | |
427 new AnalysisPeriod[periodResults.size()])); | |
504 } | 428 } |
505 | 429 |
506 return results; | 430 return results; |
507 } | 431 } |
508 | 432 |