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

http://dive4elements.wald.intevation.org