sascha@3775: package de.intevation.flys.artifacts.model.extreme; sascha@3775: sascha@3775: import de.intevation.flys.artifacts.access.ExtremeAccess; sascha@3775: sascha@3877: import de.intevation.flys.artifacts.math.fitting.Function; sascha@3877: import de.intevation.flys.artifacts.math.fitting.FunctionFactory; sascha@3877: sascha@3775: import de.intevation.flys.artifacts.model.Calculation; sascha@3775: import de.intevation.flys.artifacts.model.CalculationResult; sascha@3877: import de.intevation.flys.artifacts.model.RangeWithValues; sascha@3877: import de.intevation.flys.artifacts.model.RiverFactory; sascha@3877: import de.intevation.flys.artifacts.model.WstValueTable; sascha@3877: import de.intevation.flys.artifacts.model.WstValueTableFactory; sascha@3877: sascha@3877: import de.intevation.flys.model.River; sascha@3877: sascha@3877: import de.intevation.flys.utils.DoubleUtil; sascha@3877: sascha@3877: import java.util.List; sascha@3775: sascha@3775: public class ExtremeCalculation sascha@3775: extends Calculation sascha@3775: { sascha@3877: protected String river; sascha@3877: protected String function; sascha@3877: protected double from; sascha@3877: protected double to; sascha@3877: protected double step; sascha@3877: protected double percent; sascha@3877: protected List ranges; sascha@3877: sascha@3775: public ExtremeCalculation() { sascha@3775: } sascha@3775: sascha@3775: public ExtremeCalculation(ExtremeAccess access) { sascha@3877: String river = access.getRiver(); sascha@3877: String function = access.getFunction(); sascha@3877: Double from = access.getFrom(); sascha@3877: Double to = access.getTo(); sascha@3877: Double step = access.getStep(); sascha@3877: Double percent = access.getPercent(); sascha@3877: List ranges = access.getRanges(); sascha@3877: sascha@3877: if (river == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.river"); sascha@3877: } sascha@3877: sascha@3877: if (function == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.function"); sascha@3877: } sascha@3877: sascha@3877: if (from == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.from"); sascha@3877: } sascha@3877: sascha@3877: if (to == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.to"); sascha@3877: } sascha@3877: sascha@3877: if (step == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.step"); sascha@3877: } sascha@3877: sascha@3877: if (percent == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.percent"); sascha@3877: } sascha@3877: sascha@3877: if (ranges == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.ranges"); sascha@3877: } sascha@3877: sascha@3877: if (!hasProblems()) { sascha@3877: this.river = river; sascha@3877: this.function = function; sascha@3877: this.from = Math.min(from, to); sascha@3877: this.to = Math.max(from, to); sascha@3877: this.step = Math.max(0.001d, Math.abs(step)/1000d); sascha@3877: this.percent = Math.max(0d, Math.min(100d, percent)); sascha@3877: this.ranges = ranges; sascha@3877: } sascha@3775: } sascha@3775: sascha@3775: public CalculationResult calculate() { sascha@3877: sascha@3877: WstValueTable wst = null; sascha@3877: sascha@3877: River river = RiverFactory.getRiver(this.river); sascha@3877: if (river == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.such.river", this.river); sascha@3775: } sascha@3877: else { sascha@3877: wst = WstValueTableFactory.getTable(river); sascha@3877: if (wst == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.wst.table"); sascha@3877: } sascha@3877: } sascha@3877: sascha@3877: Function function = sascha@3877: FunctionFactory.getInstance().getFunction(this.function); sascha@3877: if (function == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem("extreme.no.such.function", this.function); sascha@3877: } sascha@3877: sascha@3877: return hasProblems() sascha@3877: ? new CalculationResult(this) sascha@3877: : innerCalculate(wst, function); sascha@3877: } sascha@3877: sascha@3877: protected CalculationResult innerCalculate( sascha@3877: WstValueTable wst, sascha@3877: Function function sascha@3877: ) { sascha@3877: RangeWithValues range = null; sascha@3877: sascha@3877: KMs: for (double km = from; km <= to; km += step) { sascha@3877: double currentKm = DoubleUtil.round(km); sascha@3877: sascha@3877: if (range == null || !range.inside(currentKm)) { sascha@3877: for (RangeWithValues r: ranges) { sascha@3877: if (r.inside(currentKm)) { sascha@3877: range = r; sascha@3877: break; sascha@3877: } sascha@3877: } sascha@3877: // TODO: i18n sascha@3877: addProblem(currentKm, "extreme.no.range"); sascha@3877: continue KMs; sascha@3877: } sascha@3877: sascha@3877: double [][] wqs = wst.interpolateTabulated(currentKm); sascha@3877: if (wqs == null) { sascha@3877: // TODO: i18n sascha@3877: addProblem(currentKm, "extreme.no.raw.data"); sascha@3877: continue; sascha@3877: } sascha@3877: sascha@3877: // XXX: This should not be necessary for model data. sascha@3877: if (!DoubleUtil.isValid(wqs)) { sascha@3877: // TODO: i18n sascha@3877: addProblem(currentKm, "extreme.invalid.data"); sascha@3877: continue; sascha@3877: } sascha@3877: // TODO: Implement extraction of points for curve fitting. sascha@3877: // TODO: Implement curve fitting. sascha@3877: // TODO: Implement generating Curve object per km. sascha@3877: } sascha@3877: sascha@3775: ExtremeResult result = new ExtremeResult(); sascha@3775: return new CalculationResult(result, this); sascha@3775: } sascha@3775: } sascha@3775: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :