Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixRealizingCalculation.java @ 3449:fc351f12b906
FixA: Vollmer. Calculated the Q -> Ws. TODO: Produce result.
flys-artifacts/trunk@5112 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 23 Jul 2012 15:24:14 +0000 |
parents | e111902834d3 |
children | 22790758b132 |
comparison
equal
deleted
inserted
replaced
3448:700d09ca5dc8 | 3449:fc351f12b906 |
---|---|
4 | 4 |
5 import de.intevation.flys.artifacts.math.fitting.Function; | 5 import de.intevation.flys.artifacts.math.fitting.Function; |
6 | 6 |
7 import de.intevation.flys.artifacts.model.CalculationResult; | 7 import de.intevation.flys.artifacts.model.CalculationResult; |
8 import de.intevation.flys.artifacts.model.FixingsOverview; | 8 import de.intevation.flys.artifacts.model.FixingsOverview; |
9 import de.intevation.flys.artifacts.model.RiverFactory; | |
9 import de.intevation.flys.artifacts.model.Segment; | 10 import de.intevation.flys.artifacts.model.Segment; |
11 import de.intevation.flys.artifacts.model.WQKms; | |
12 import de.intevation.flys.artifacts.model.Parameters; | |
13 | |
14 import de.intevation.flys.model.River; | |
10 | 15 |
11 import java.util.List; | 16 import java.util.List; |
12 | 17 |
13 import org.apache.log4j.Logger; | 18 import org.apache.log4j.Logger; |
14 | 19 |
38 if (segments == null || segments.isEmpty()) { | 43 if (segments == null || segments.isEmpty()) { |
39 // TODO: i18n | 44 // TODO: i18n |
40 addProblem("fix.realize.missing.segments"); | 45 addProblem("fix.realize.missing.segments"); |
41 } | 46 } |
42 | 47 |
48 River r = RiverFactory.getRiver(river); | |
49 | |
50 if (r == null) { | |
51 // TODO: i18n | |
52 addProblem("fix.no.such.river"); | |
53 } | |
54 | |
43 if (!hasProblems()) { | 55 if (!hasProblems()) { |
44 this.isQ = isQ; | 56 this.isQ = isQ; |
45 this.segments = segments; | 57 this.segments = segments; |
58 | |
59 // Convert from W to Q | |
60 Segment.setReferencePointConvertQ(segments, r, isQ, this); | |
46 } | 61 } |
47 } | 62 } |
48 | 63 |
49 @Override | 64 @Override |
50 protected CalculationResult innerCalculate( | 65 protected CalculationResult innerCalculate( |
51 FixingsOverview overview, | 66 FixingsOverview overview, |
52 Function func | 67 Function func |
53 ) { | 68 ) { |
54 // TODO: Implement me! | 69 FitResult fitResult = doFitting(overview, func); |
70 | |
71 if (fitResult == null) { | |
72 return new CalculationResult(this); | |
73 } | |
74 | |
75 Segment segment = segments.get(0); | |
76 int numResults = segment.numValues(); | |
77 | |
78 WQKms [] results = new WQKms[numResults]; | |
79 for (int i = 0; i < results.length; ++i) { | |
80 results[i] = new WQKms(); | |
81 } | |
82 | |
83 Parameters parameters = fitResult.getParameters(); | |
84 | |
85 int kmIndex = parameters.columnIndex("km"); | |
86 int [] parameterIndices = | |
87 parameters.columnIndices(func.getParameterNames()); | |
88 | |
89 double [] parameterValues = new double[parameterIndices.length]; | |
90 | |
91 for (int row = 0, R = parameters.size(); row < R; ++row) { | |
92 double km = parameters.get(row, kmIndex); | |
93 | |
94 if (!segment.inside(km)) { | |
95 Segment nextSeg = null; | |
96 for (Segment seg: segments) { | |
97 if (seg.inside(km)) { | |
98 nextSeg = seg; | |
99 break; | |
100 } | |
101 } | |
102 if (nextSeg == null) { | |
103 // TODO: i18n | |
104 addProblem(km, "fix.cannot.find.segment"); | |
105 continue; | |
106 } | |
107 segment = nextSeg; | |
108 } | |
109 | |
110 parameters.get(row, parameterIndices, parameterValues); | |
111 | |
112 de.intevation.flys.artifacts.math.Function instance = | |
113 func.instantiate(parameterValues); | |
114 | |
115 double [] values = segment.getValues(); | |
116 for (int i = 0; i < numResults; ++i) { | |
117 double q = values[i]; | |
118 double w = instance.value(q); | |
119 | |
120 if (Double.isNaN(w)) { | |
121 // TODO: i18n | |
122 addProblem(km, "fix.cannot.calculate.function", q); | |
123 } | |
124 else { | |
125 results[i].add(w, q, km); | |
126 } | |
127 } | |
128 } | |
129 | |
130 // name the curves | |
131 for (int i = 0; i < results.length; ++i) { | |
132 results[i].setName(createName(i)); | |
133 } | |
134 | |
55 return new CalculationResult(this); | 135 return new CalculationResult(this); |
136 } | |
137 | |
138 protected String createName(int index) { | |
139 // TODO: i18n | |
140 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); | |
141 sb.append(" benutzerdefiniert ("); | |
142 for (int i = 0, N = segments.size(); i < N; ++i) { | |
143 if (i > 0) { | |
144 sb.append("; "); | |
145 } | |
146 Segment segment = segments.get(i); | |
147 double [] backup = segment.getBackup(); | |
148 double [] values = segment.getValues(); | |
149 sb.append((backup != null ? backup : values)[index]); | |
150 } | |
151 sb.append(')'); | |
152 return sb.toString(); | |
56 } | 153 } |
57 } | 154 } |
58 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 155 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |