Mercurial > dive4elements > river
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixRealizingCalculation.java Thu Apr 25 12:06:39 2013 +0200 @@ -0,0 +1,164 @@ +package org.dive4elements.river.artifacts.model.fixings; + +import org.dive4elements.river.artifacts.access.FixRealizingAccess; + +import org.dive4elements.river.artifacts.math.fitting.Function; + +import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.FixingsOverview; +import org.dive4elements.river.artifacts.model.RiverFactory; +import org.dive4elements.river.artifacts.model.Segment; +import org.dive4elements.river.artifacts.model.WQKms; +import org.dive4elements.river.artifacts.model.Parameters; + +import org.dive4elements.river.model.River; + +import java.util.List; + +import org.apache.log4j.Logger; + +/** Calculation for FixRealize (german: ausgel. WSPL). */ +public class FixRealizingCalculation +extends FixCalculation +{ + private static Logger log = + Logger.getLogger(FixRealizingCalculation.class); + + protected boolean isQ; + protected List<Segment> segments; + + public FixRealizingCalculation() { + } + + public FixRealizingCalculation(FixRealizingAccess access) { + super(access); + + Boolean isQ = access.isQ(); + List<Segment> segments = access.getSegments(); + + if (isQ == null) { + // TODO: i18n + addProblem("fix.realize.missing.is.q"); + } + + if (segments == null || segments.isEmpty()) { + // TODO: i18n + addProblem("fix.realize.missing.segments"); + } + + River r = RiverFactory.getRiver(river); + + if (r == null) { + // TODO: i18n + addProblem("fix.no.such.river"); + } + + if (!hasProblems()) { + this.isQ = isQ; + this.segments = segments; + + // Convert from W to Q + Segment.setReferencePointConvertQ(segments, r, isQ, this); + } + } + + @Override + protected CalculationResult innerCalculate( + FixingsOverview overview, + Function func + ) { + ColumnCache cc = new ColumnCache(); + FitResult fitResult = doFitting(overview, cc, func); + + if (fitResult == null) { + return new CalculationResult(this); + } + + Segment segment = segments.get(0); + int numResults = segment.numValues(); + + WQKms [] results = new WQKms[numResults]; + for (int i = 0; i < results.length; ++i) { + results[i] = new WQKms(); + } + + Parameters parameters = fitResult.getParameters(); + + int kmIndex = parameters.columnIndex("km"); + int [] parameterIndices = + parameters.columnIndices(func.getParameterNames()); + + double [] parameterValues = new double[parameterIndices.length]; + + for (int row = 0, R = parameters.size(); row < R; ++row) { + double km = parameters.get(row, kmIndex); + + if (!segment.inside(km)) { + Segment nextSeg = null; + for (Segment seg: segments) { + if (seg.inside(km)) { + nextSeg = seg; + break; + } + } + if (nextSeg == null) { + // TODO: i18n + addProblem(km, "fix.cannot.find.segment"); + continue; + } + segment = nextSeg; + } + + parameters.get(row, parameterIndices, parameterValues); + + org.dive4elements.river.artifacts.math.Function instance = + func.instantiate(parameterValues); + + double [] values = segment.getValues(); + for (int i = 0; i < numResults; ++i) { + double q = values[i]; + double w = instance.value(q); + + if (Double.isNaN(w)) { + // TODO: i18n + addProblem(km, "fix.cannot.calculate.function", q); + } + else { + results[i].add(w, q, km); + } + } + } + + // Name the curves. + for (int i = 0; i < results.length; ++i) { + results[i].setName(createName(i)); + } + + FixRealizingResult frr = new FixRealizingResult( + parameters, + fitResult.getReferenced(), + fitResult.getOutliers(), + results); + + return new CalculationResult(frr, this); + } + + // TODO: issue1109/2 + protected String createName(int index) { + // TODO: i18n + StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); + sb.append(" benutzerdefiniert ("); + for (int i = 0, N = segments.size(); i < N; ++i) { + if (i > 0) { + sb.append("; "); + } + Segment segment = segments.get(i); + double [] backup = segment.getBackup(); + double [] values = segment.getValues(); + sb.append((backup != null ? backup : values)[index]); + } + sb.append(')'); + return sb.toString(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :