annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFacet.java @ 7357:9d3e44ab25f2

Refactoring: Move functionality of BedHeightAccess into BedHeightFacet for now. Idea is that Artifact and Access are lightweight. Access access the 'data' ('parameterization') attached to artifact, not the data delivered by means of artifact and its parameterization.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 16 Oct 2013 10:42:45 +0200
parents fe32a7f9655e
children aab63784a80f
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5867
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5867
diff changeset
6 * documentation coming with Dive4Elements River for details.
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
9 package org.dive4elements.river.artifacts.model.minfo;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
10
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
11 import gnu.trove.TDoubleArrayList;
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
12
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
13 import org.dive4elements.artifactdatabase.state.Facet;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
14
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
15 import org.dive4elements.artifacts.Artifact;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
16 import org.dive4elements.artifacts.CallContext;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
17
5867
59ff03ff48f1 River artifacts: Renamed FLYSArtifact(Collection) to D4EArtifact(Collection).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5865
diff changeset
18 import org.dive4elements.river.artifacts.D4EArtifact;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
19
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
20 import org.dive4elements.river.artifacts.model.CalculationResult;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
21 import org.dive4elements.river.artifacts.model.DataFacet;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
22 import org.dive4elements.river.artifacts.model.FacetTypes;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
23
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
24 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
25
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
26 import org.dive4elements.river.model.MeasurementStation;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
27
5865
73da40528cf2 River artifacts: Renamed FLYSUtils to RiverUtils.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
28 import org.dive4elements.river.utils.RiverUtils;
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
29
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
30 import java.util.ArrayList;
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
31 import java.util.Collections;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
32 import java.util.List;
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
33 import java.util.Map;
6940
274948f91dd6 issue1466: Fix, sort stations before gap detection.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6679
diff changeset
34 import java.util.TreeSet;
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
35 import java.util.TreeMap;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
36
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
37 import org.apache.log4j.Logger;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
38
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
39
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
40 /** Facet to access various sediment loads. */
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
41 public class SedimentLoadFacet
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
42 extends DataFacet
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
43 {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
44 /** Very own logger. */
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
45 private static Logger logger = Logger.getLogger(SedimentLoadFacet.class);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
46
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
47 /** Used as tolerance value when fetching measurement stations. */
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
48 private static double EPSILON = 1e-5;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
49
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
50
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
51 public SedimentLoadFacet() {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
52 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
53
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
54 public SedimentLoadFacet(int idx, String name, String description,
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
55 ComputeType type, String stateId, String hash) {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
56 super(idx, name, description, type, hash, stateId);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
57 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
58
6679
0c593745bcd6 Added @Override annotation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6412
diff changeset
59 @Override
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
60 public Object getData(Artifact artifact, CallContext context) {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
61 logger.debug("Get data for sediment load at index: " + index);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
62
5867
59ff03ff48f1 River artifacts: Renamed FLYSArtifact(Collection) to D4EArtifact(Collection).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5865
diff changeset
63 D4EArtifact flys = (D4EArtifact) artifact;
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
64
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
65 CalculationResult res = (CalculationResult) flys.compute(context, hash,
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
66 stateId, type, false);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
67
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
68 Object[] data =
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
69 (SedimentLoadResult[]) res.getData(); // TODO CAST TO SPECIFIC CLASS
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
70
5865
73da40528cf2 River artifacts: Renamed FLYSUtils to RiverUtils.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
71 List<MeasurementStation> allStations = RiverUtils.getRiver(flys).getMeasurementStations();
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
72 SedimentLoadResult result = data != null && data.length > index ? (SedimentLoadResult)data[index] : null;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
73 if (result == null) {
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
74 return null;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
75 }
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
76
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
77 // These complicated calculations were necessary because
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
78 // SedimentLoad/Fraction did not contain the ranges of the given
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
79 // values. Since this changed, the code is somewhat obsolete, but stable.
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
80 // For an example of easier calculation, see the "total" part below.
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
81
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
82 List<Double> sortedStarts = new ArrayList<Double>();
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
83 // Filter stations according to type.
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
84 List<MeasurementStation> stations = new ArrayList<MeasurementStation>();
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
85 for (MeasurementStation station: allStations) {
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
86 if (station.getRange() == null || station.getMeasurementType() == null) {
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
87 continue;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
88 }
6412
c74261e05a62 issue1235: revert some changes, use correct Schwebstoff/Geschiebe-measurement-stations.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6382
diff changeset
89 if (this.getName().contains("susp_sediment")
c74261e05a62 issue1235: revert some changes, use correct Schwebstoff/Geschiebe-measurement-stations.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6382
diff changeset
90 && station.getMeasurementType().equals("Schwebstoff")) {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
91 stations.add(station);
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
92 sortedStarts.add(station.getStation());
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
93 }
6412
c74261e05a62 issue1235: revert some changes, use correct Schwebstoff/Geschiebe-measurement-stations.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6382
diff changeset
94 else if (!this.getName().contains("susp_sediment")
c74261e05a62 issue1235: revert some changes, use correct Schwebstoff/Geschiebe-measurement-stations.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6382
diff changeset
95 && station.getMeasurementType().equals("Geschiebe")) {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
96 stations.add(station);
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
97 sortedStarts.add(station.getStation());
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
98 }
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
99 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
100 Collections.sort(sortedStarts);
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
101
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
102 // Handle sediment load differently, as it respects already
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
103 // the ranges that were added to SedimentLoad/Fraction.
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
104 if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL)) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
105 SedimentLoad load = result.getLoad();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
106 TDoubleArrayList xPos = new TDoubleArrayList();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
107 TDoubleArrayList yPos = new TDoubleArrayList();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
108 double lastX = -1d;
6940
274948f91dd6 issue1466: Fix, sort stations before gap detection.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6679
diff changeset
109 for (double km: new TreeSet<Double>(load.getKms())) {
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
110 SedimentLoadFraction fraction = load.getFraction(km);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
111 if (fraction.getTotal() != 0) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
112 if (Math.abs(lastX-km) >= EPSILON) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
113 xPos.add(Double.NaN);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
114 yPos.add(Double.NaN);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
115 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
116 xPos.add(km);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
117 yPos.add(fraction.getTotal());
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
118 xPos.add(fraction.getTotalRange().getEnd());
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
119 yPos.add(fraction.getTotal());
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
120 lastX = fraction.getTotalRange().getEnd();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
121 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
122 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
123 return new double[][] {xPos.toNativeArray(), yPos.toNativeArray()};
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
124 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
125
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
126 // Access data according to type (except total - see above).
5648
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
127 double[][] sd = getLoadData(result);
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
128
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
129 // Sort by km.
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
130 TreeMap<Double, Double> sortedKmLoad = new TreeMap<Double,Double>();
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
131
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
132 double[] km = sd[0];
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
133 double[] load = sd[1];
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
134
6342
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
135 // Build map of km->load, but directly exclude the ones which do
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
136 // not match against a measurements station ranges start.
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
137 for (int i = 0 ; i < km.length; i++) {
6342
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
138 for (MeasurementStation station: stations) {
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
139 if (Math.abs(station.getStation() - km[i]) <= EPSILON) {
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
140 sortedKmLoad.put(km[i], load[i]);
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
141 continue;
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
142 }
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
143 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
144 }
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
145
6341
3ec08ff0f497 Comment.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6340
diff changeset
146 // [0] -> x, [1] -> y
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
147 double[][] values = new double[2][];
6342
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
148 values[0] = new double[sortedKmLoad.size()*3];
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
149 values[1] = new double[sortedKmLoad.size()*3];
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
150
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
151 // Find station via its station (km).
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
152 // TODO use a binarySearch instead of linear absdiff approach
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
153 int i = 0;
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
154 for (Map.Entry<Double, Double> kmLoad: sortedKmLoad.entrySet()) {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
155 boolean matchFound = false;
7254
fe32a7f9655e Reduce usage of careless 'for (int i = 0; i < x.size(); i++)' pattern.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6940
diff changeset
156 for (int k = 0, S = stations.size(); k < S; k++) {
6343
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
157 MeasurementStation station = stations.get(k);
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
158 if (Math.abs(station.getStation() - kmLoad.getKey()) < EPSILON) {
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
159 // Value has been taken at measurement station.
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
160 values[0][i*3] = station.getRange().getA().doubleValue() + EPSILON;
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
161 values[1][i*3] = kmLoad.getValue();
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
162 double endValue = 0d;
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
163 // Valid until next measurements stations begin of range,
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
164 // or end of current range if last value.
7254
fe32a7f9655e Reduce usage of careless 'for (int i = 0; i < x.size(); i++)' pattern.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6940
diff changeset
165 if (k+2 <= S) {
6343
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
166 endValue = stations.get(k+1).getRange().getA().doubleValue();
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
167 }
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
168 else {
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
169 endValue = station.getRange().getB().doubleValue();
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
170 }
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
171 values[0][i*3+1] = endValue;
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
172 values[1][i*3+1] = kmLoad.getValue();
6343
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
173 values[0][i*3+2] = endValue;
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
174 values[1][i*3+2] = kmLoad.getValue();
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
175 matchFound = true;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
176 }
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
177 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
178 // Store points without match for later assessment.
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
179 if (!matchFound) {
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
180 logger.warn("measurement without station ("+kmLoad.getKey()+")!");
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
181 }
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
182 i++;
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
183 }
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
184
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
185 for (int x = 0; x < values[0].length-1; x++) {
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
186 // Introduce gaps where no data in measurement station.
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
187 if (Math.abs(values[0][x+1] - values[0][x]) > 3*EPSILON
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
188 && values[1][x+1] != values[1][x]) {
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
189 values[0][x] = Double.NaN;
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
190 values[1][x] = Double.NaN;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
191 }
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
192 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
193
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
194 return values;
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
195 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
196
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
197
5648
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
198 /** Get data according to type of facet. */
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
199 private double[][] getLoadData(SedimentLoadResult result) {
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
200 if (getName().equals(FacetTypes.SEDIMENT_LOAD_SAND))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
201 return result.getSandData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
202 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_COARSE))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
203 return result.getCoarseData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
204 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_FINEMIDDLE))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
205 return result.getFineMiddleData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
206 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
207 return result.getSuspSandData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
208 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND_BED))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
209 return result.getSuspSandBedData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
210 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SEDIMENT))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
211 return result.getSuspSedimentData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
212 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL_LOAD))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
213 return result.getTotalLoadData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
214 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
215 return result.getTotalData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
216 else {
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
217 logger.error("SedimentLoadFacet " + getName() + " cannot determine data type.");
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
218 return null;
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
219 }
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
220 }
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
221
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
222 /** Copy deeply. */
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
223 @Override
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
224 public Facet deepCopy() {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
225 SedimentLoadFacet copy = new SedimentLoadFacet();
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
226 copy.set(this);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
227 copy.type = type;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
228 copy.hash = hash;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
229 copy.stateId = stateId;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
230 return copy;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
231 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
232 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
233 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org