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