comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java @ 5831:bd047b71ab37

Repaired internal references
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:06:39 +0200
parents flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java@345f3bba6f15
children
comparison
equal deleted inserted replaced
5830:160f53ee0870 5831:bd047b71ab37
1 package org.dive4elements.river.artifacts.model.fixings;
2
3 import org.dive4elements.river.artifacts.access.FixRealizingAccess;
4
5 import org.dive4elements.river.artifacts.math.fitting.Function;
6
7 import org.dive4elements.river.artifacts.model.CalculationResult;
8 import org.dive4elements.river.artifacts.model.FixingsOverview;
9 import org.dive4elements.river.artifacts.model.RiverFactory;
10 import org.dive4elements.river.artifacts.model.Segment;
11 import org.dive4elements.river.artifacts.model.WQKms;
12 import org.dive4elements.river.artifacts.model.Parameters;
13
14 import org.dive4elements.river.model.River;
15
16 import java.util.List;
17
18 import org.apache.log4j.Logger;
19
20 /** Calculation for FixRealize (german: ausgel. WSPL). */
21 public class FixRealizingCalculation
22 extends FixCalculation
23 {
24 private static Logger log =
25 Logger.getLogger(FixRealizingCalculation.class);
26
27 protected boolean isQ;
28 protected List<Segment> segments;
29
30 public FixRealizingCalculation() {
31 }
32
33 public FixRealizingCalculation(FixRealizingAccess access) {
34 super(access);
35
36 Boolean isQ = access.isQ();
37 List<Segment> segments = access.getSegments();
38
39 if (isQ == null) {
40 // TODO: i18n
41 addProblem("fix.realize.missing.is.q");
42 }
43
44 if (segments == null || segments.isEmpty()) {
45 // TODO: i18n
46 addProblem("fix.realize.missing.segments");
47 }
48
49 River r = RiverFactory.getRiver(river);
50
51 if (r == null) {
52 // TODO: i18n
53 addProblem("fix.no.such.river");
54 }
55
56 if (!hasProblems()) {
57 this.isQ = isQ;
58 this.segments = segments;
59
60 // Convert from W to Q
61 Segment.setReferencePointConvertQ(segments, r, isQ, this);
62 }
63 }
64
65 @Override
66 protected CalculationResult innerCalculate(
67 FixingsOverview overview,
68 Function func
69 ) {
70 ColumnCache cc = new ColumnCache();
71 FitResult fitResult = doFitting(overview, cc, func);
72
73 if (fitResult == null) {
74 return new CalculationResult(this);
75 }
76
77 Segment segment = segments.get(0);
78 int numResults = segment.numValues();
79
80 WQKms [] results = new WQKms[numResults];
81 for (int i = 0; i < results.length; ++i) {
82 results[i] = new WQKms();
83 }
84
85 Parameters parameters = fitResult.getParameters();
86
87 int kmIndex = parameters.columnIndex("km");
88 int [] parameterIndices =
89 parameters.columnIndices(func.getParameterNames());
90
91 double [] parameterValues = new double[parameterIndices.length];
92
93 for (int row = 0, R = parameters.size(); row < R; ++row) {
94 double km = parameters.get(row, kmIndex);
95
96 if (!segment.inside(km)) {
97 Segment nextSeg = null;
98 for (Segment seg: segments) {
99 if (seg.inside(km)) {
100 nextSeg = seg;
101 break;
102 }
103 }
104 if (nextSeg == null) {
105 // TODO: i18n
106 addProblem(km, "fix.cannot.find.segment");
107 continue;
108 }
109 segment = nextSeg;
110 }
111
112 parameters.get(row, parameterIndices, parameterValues);
113
114 org.dive4elements.river.artifacts.math.Function instance =
115 func.instantiate(parameterValues);
116
117 double [] values = segment.getValues();
118 for (int i = 0; i < numResults; ++i) {
119 double q = values[i];
120 double w = instance.value(q);
121
122 if (Double.isNaN(w)) {
123 // TODO: i18n
124 addProblem(km, "fix.cannot.calculate.function", q);
125 }
126 else {
127 results[i].add(w, q, km);
128 }
129 }
130 }
131
132 // Name the curves.
133 for (int i = 0; i < results.length; ++i) {
134 results[i].setName(createName(i));
135 }
136
137 FixRealizingResult frr = new FixRealizingResult(
138 parameters,
139 fitResult.getReferenced(),
140 fitResult.getOutliers(),
141 results);
142
143 return new CalculationResult(frr, this);
144 }
145
146 // TODO: issue1109/2
147 protected String createName(int index) {
148 // TODO: i18n
149 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W");
150 sb.append(" benutzerdefiniert (");
151 for (int i = 0, N = segments.size(); i < N; ++i) {
152 if (i > 0) {
153 sb.append("; ");
154 }
155 Segment segment = segments.get(i);
156 double [] backup = segment.getBackup();
157 double [] values = segment.getValues();
158 sb.append((backup != null ? backup : values)[index]);
159 }
160 sb.append(')');
161 return sb.toString();
162 }
163 }
164 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org