Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 643:a9bde508824a
flys/issue82: Only successful interpolations are named.
flys-artifacts/trunk@2027 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 30 May 2011 09:19:57 +0000 |
parents | 2dbbb5be30a1 |
children | 433f67a076aa |
comparison
equal
deleted
inserted
replaced
642:2dbbb5be30a1 | 643:a9bde508824a |
---|---|
1 package de.intevation.flys.artifacts; | 1 package de.intevation.flys.artifacts; |
2 | 2 |
3 import java.util.List; | 3 import java.util.List; |
4 import java.util.Set; | |
5 import java.util.HashSet; | |
4 import java.util.Vector; | 6 import java.util.Vector; |
5 import java.util.ArrayList; | 7 import java.util.ArrayList; |
6 | 8 |
7 import org.w3c.dom.Document; | 9 import org.w3c.dom.Document; |
8 import org.w3c.dom.Element; | 10 import org.w3c.dom.Element; |
275 WstValueTable wst = WstValueTableFactory.getTable(river); | 277 WstValueTable wst = WstValueTableFactory.getTable(river); |
276 if (wst == null) { | 278 if (wst == null) { |
277 throw new NullPointerException("No Wst found for selected river."); | 279 throw new NullPointerException("No Wst found for selected river."); |
278 } | 280 } |
279 | 281 |
280 WQKms[] results = computeWaterlevelData(kms, qs, wst, river.getKmUp()); | 282 HashSet<Integer> failed = new HashSet<Integer>(); |
283 | |
284 WQKms[] results = computeWaterlevelData( | |
285 kms, qs, wst, river.getKmUp(), failed); | |
281 | 286 |
282 // TODO Introduce a caching mechanism here! | 287 // TODO Introduce a caching mechanism here! |
283 | 288 |
284 setWaterlevelNames(results, qSel ? qs : ws, qSel ? "Q" : "W"); | 289 setWaterlevelNames( |
290 results, qSel ? qs : ws, qSel ? "Q" : "W", failed); | |
285 | 291 |
286 return results; | 292 return results; |
287 } | 293 } |
288 | 294 |
289 | 295 |
293 * | 299 * |
294 * @param r The waterlevel columns. | 300 * @param r The waterlevel columns. |
295 * @param v The input values of the computations. | 301 * @param v The input values of the computations. |
296 * @param wq The WQ mode - can be one of "W" or "Q". | 302 * @param wq The WQ mode - can be one of "W" or "Q". |
297 */ | 303 */ |
298 public static void setWaterlevelNames(WQKms[] r, double[] v, String wq) { | 304 public static void setWaterlevelNames( |
305 WQKms[] r, | |
306 double[] v, | |
307 String wq, | |
308 Set failed | |
309 ) { | |
310 int pos = 0; | |
299 for (int i = 0; i < v.length; i++) { | 311 for (int i = 0; i < v.length; i++) { |
300 r[i].setName(wq + "=" + Double.toString(v[i])); | 312 if (!failed.contains(i)) { |
313 r[pos++].setName(wq + "=" + v[i]); | |
314 } | |
301 } | 315 } |
302 } | 316 } |
303 | 317 |
304 | 318 |
305 /** | 319 /** |
314 */ | 328 */ |
315 public static WQKms[] computeWaterlevelData( | 329 public static WQKms[] computeWaterlevelData( |
316 double[] kms, | 330 double[] kms, |
317 double[] qs, | 331 double[] qs, |
318 WstValueTable wst, | 332 WstValueTable wst, |
319 boolean up | 333 boolean up, |
334 Set<Integer> failed | |
320 ) { | 335 ) { |
321 logger.info("WINFOArtifact.computeWaterlevelData"); | 336 logger.info("WINFOArtifact.computeWaterlevelData"); |
322 | 337 |
323 WQKms[] wqkms = new WQKms[qs.length]; | 338 WQKms[] wqkms = new WQKms[qs.length]; |
324 | 339 |
334 if (qPosition != null) { | 349 if (qPosition != null) { |
335 results.add(new WQKms(kms, oqs, ows)); | 350 results.add(new WQKms(kms, oqs, ows)); |
336 } | 351 } |
337 else { | 352 else { |
338 logger.warn("interpolation failed for q = " + qs[i]); | 353 logger.warn("interpolation failed for q = " + qs[i]); |
354 failed.add(i); | |
339 } | 355 } |
340 } | 356 } |
341 | 357 |
342 return results.toArray(new WQKms[results.size()]); | 358 return results.toArray(new WQKms[results.size()]); |
343 } | 359 } |
565 logger.warn("no qs given"); | 581 logger.warn("no qs given"); |
566 return new WQKms[0]; | 582 return new WQKms[0]; |
567 } | 583 } |
568 if (qs.length == 1) { | 584 if (qs.length == 1) { |
569 double [] kms = getKms(segments[0]); | 585 double [] kms = getKms(segments[0]); |
570 return computeWaterlevelData(kms, qs, wst, kmUp); | 586 HashSet<Integer> failed = new HashSet<Integer>(); |
587 WQKms [] results = computeWaterlevelData | |
588 (kms, qs, wst, kmUp, failed); | |
589 setWaterlevelNames( | |
590 results, qs, isQ() ? "Q" : "W", failed); | |
591 return results; | |
571 } | 592 } |
572 } | 593 } |
573 | 594 |
574 // more than one segment | 595 // more than one segment |
575 | 596 |
650 | 671 |
651 ArrayList<WQKms> results = new ArrayList<WQKms>(); | 672 ArrayList<WQKms> results = new ArrayList<WQKms>(); |
652 | 673 |
653 int referenceIndex = kmUp ? 0 : boundKms.length-1; | 674 int referenceIndex = kmUp ? 0 : boundKms.length-1; |
654 | 675 |
676 HashSet<Integer> failed = new HashSet<Integer>(); | |
677 | |
655 for (int i = 0; i < iqs.length; ++i) { | 678 for (int i = 0; i < iqs.length; ++i) { |
656 double [] iqsi = iqs[i]; | 679 double [] iqsi = iqs[i]; |
657 | 680 |
658 QPosition qPosition = wst.interpolate( | 681 QPosition qPosition = wst.interpolate( |
659 iqsi[0], | 682 iqsi[0], |
660 referenceIndex, | 683 referenceIndex, |
661 boundKms, boundWs, boundQs); | 684 boundKms, boundWs, boundQs); |
662 | 685 |
663 if (qPosition == null) { | 686 if (qPosition == null) { |
664 logger.warn("interpolation failed for " + iqsi[i]); | 687 logger.warn("interpolation failed for " + iqsi[i]); |
688 failed.add(i); | |
665 continue; | 689 continue; |
666 } | 690 } |
667 | 691 |
668 LinearRemap remap = new LinearRemap(); | 692 LinearRemap remap = new LinearRemap(); |
669 | 693 |
689 } | 713 } |
690 } | 714 } |
691 | 715 |
692 WQKms [] wqkms = results.toArray(new WQKms[results.size()]); | 716 WQKms [] wqkms = results.toArray(new WQKms[results.size()]); |
693 | 717 |
694 setDischargeLongitudinalSectionNames(wqkms, iqs, isQ() ? "Q" : "W"); | 718 setDischargeLongitudinalSectionNames( |
719 wqkms, iqs, isQ() ? "Q" : "W", failed); | |
695 | 720 |
696 return wqkms; | 721 return wqkms; |
697 } | 722 } |
698 | 723 |
699 protected static String joinDoubles(double [] x) { | 724 protected static String joinDoubles(double [] x) { |
722 /** | 747 /** |
723 * Sets the name for discharge longitudinal section curves where each WQKms | 748 * Sets the name for discharge longitudinal section curves where each WQKms |
724 * in <i>r</i> represents a column. | 749 * in <i>r</i> represents a column. |
725 */ | 750 */ |
726 public static void setDischargeLongitudinalSectionNames( | 751 public static void setDischargeLongitudinalSectionNames( |
727 WQKms [] wqkms, | 752 WQKms [] wqkms, |
728 double [][] iqs, | 753 double [][] iqs, |
729 String wq | 754 String wq, |
755 Set<Integer> failed | |
730 ) { | 756 ) { |
731 logger.debug("WINFOArtifact.setDischargeLongitudinalSectionNames"); | 757 logger.debug("WINFOArtifact.setDischargeLongitudinalSectionNames"); |
732 | 758 |
733 // TODO: I18N | 759 // TODO: I18N |
734 | 760 |
735 for (int j = 0; j < wqkms.length; ++j) { | 761 int pos = 0; |
762 | |
763 for (int j = 0; j < iqs.length; ++j) { | |
764 if (failed.contains(j)) { | |
765 continue; | |
766 } | |
736 StringBuilder sb = new StringBuilder(wq) | 767 StringBuilder sb = new StringBuilder(wq) |
737 .append(" benutzerdefiniert ("); | 768 .append(" benutzerdefiniert ("); |
738 | 769 |
739 double [] iqsi = iqs[j]; | 770 double [] iqsi = iqs[j]; |
740 for (int i = 0; i < iqsi.length; i++) { | 771 for (int i = 0; i < iqsi.length; i++) { |
743 } | 774 } |
744 sb.append(iqsi[i]); | 775 sb.append(iqsi[i]); |
745 } | 776 } |
746 sb.append(")"); | 777 sb.append(")"); |
747 | 778 |
748 wqkms[j].setName(sb.toString()); | 779 wqkms[pos++].setName(sb.toString()); |
749 } | 780 } |
750 } | 781 } |
751 } | 782 } |
752 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 783 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |