ingo@3072: package de.intevation.flys.artifacts.model.sq; ingo@3072: sascha@3222: import de.intevation.flys.artifacts.access.SQRelationAccess; ingo@3072: sascha@3304: import de.intevation.flys.artifacts.math.fitting.Function; sascha@3304: import de.intevation.flys.artifacts.math.fitting.FunctionFactory; sascha@3304: ingo@3072: import de.intevation.flys.artifacts.model.Calculation; ingo@3072: import de.intevation.flys.artifacts.model.CalculationResult; sascha@3222: import de.intevation.flys.artifacts.model.DateRange; sascha@3304: import de.intevation.flys.artifacts.model.Parameters; ingo@3072: sascha@3289: import de.intevation.flys.backend.SedDBSessionHolder; sascha@3289: sascha@3310: import java.util.ArrayList; sascha@3304: import java.util.List; sascha@3304: sascha@3222: import org.apache.log4j.Logger; ingo@3072: ingo@3072: public class SQRelationCalculation extends Calculation { ingo@3072: sascha@3222: private static final Logger log = ingo@3072: Logger.getLogger(SQRelationCalculation.class); ingo@3072: sascha@3304: public static final String SQ_FUNCTION_NAME = "sq-pow"; sascha@3304: sascha@3222: protected String river; sascha@3222: protected double location; sascha@3222: protected DateRange [] periods; sascha@3222: protected double outliers; sascha@3305: sascha@3222: public SQRelationCalculation() { ingo@3079: } ingo@3079: sascha@3222: public SQRelationCalculation(SQRelationAccess access) { ingo@3079: sascha@3222: String river = access.getRiver(); sascha@3222: Double location = access.getLocation(); sascha@3222: DateRange [] periods = access.getPeriods(); sascha@3222: Double outliers = access.getOutliers(); ingo@3101: sascha@3222: if (river == null) { sascha@3222: // TODO: i18n sascha@3222: addProblem("sq.missing.river"); sascha@3222: } ingo@3101: sascha@3222: if (location == null) { sascha@3222: // TODO: i18n sascha@3222: addProblem("sq.missing.location"); sascha@3222: } ingo@3101: sascha@3297: if (periods == null || periods.length == 0) { sascha@3222: // TODO: i18n sascha@3222: addProblem("sq.missing.periods"); sascha@3222: } sascha@3222: sascha@3222: if (outliers == null) { sascha@3222: // TODO: i18n sascha@3222: addProblem("sq.missing.outliers"); sascha@3222: } sascha@3222: sascha@3222: if (!hasProblems()) { sascha@3222: this.river = river; sascha@3222: this.location = location; sascha@3222: this.periods = periods; sascha@3222: this.outliers = outliers; sascha@3222: } ingo@3079: } ingo@3079: ingo@3105: sascha@3222: public CalculationResult calculate() { sascha@3222: log.debug("SQRelationCalculation.calculate"); ingo@3079: sascha@3222: if (hasProblems()) { sascha@3222: return new CalculationResult(this); ingo@3118: } ingo@3079: sascha@3289: SedDBSessionHolder.acquire(); sascha@3289: try { sascha@3289: return internalCalculate(); sascha@3289: } sascha@3289: finally { sascha@3289: SedDBSessionHolder.release(); sascha@3289: } sascha@3289: } sascha@3289: sascha@3289: protected CalculationResult internalCalculate() { sascha@3289: sascha@3289: boolean debug = log.isDebugEnabled(); sascha@3289: sascha@3304: Function function = FunctionFactory sascha@3304: .getInstance() sascha@3304: .getFunction(SQ_FUNCTION_NAME); sascha@3304: sascha@3304: if (function == null) { sascha@3304: log.error("No '" + SQ_FUNCTION_NAME + "' function found."); sascha@3304: // TODO: i18n sascha@3304: addProblem("sq.missing.sq.function"); sascha@3304: } sascha@3304: sascha@3222: sascha@3304: String [] parameterNames = function.getParameterNames(); sascha@3304: sascha@3310: List results = new ArrayList(periods.length); sascha@3304: sascha@3310: Fitting fitting = new Fitting(function, outliers); sascha@3304: sascha@3310: for (DateRange period: periods) { sascha@3310: Measurements measurements = sascha@3310: MeasurementFactory.getMeasurements(river, location, period); sascha@3310: sascha@3310: if (debug) { sascha@3310: log.debug(measurements.toString()); sascha@3304: } sascha@3304: sascha@3310: SQFractionResult [] fractionResults = sascha@3310: new SQFractionResult[SQResult.NUMBER_FRACTIONS]; sascha@3304: sascha@3310: for (int i = 0; i < fractionResults.length; ++i) { sascha@3310: List sqs = measurements.getSQs(i); sascha@3310: sascha@3310: SQFractionResult fractionResult; sascha@3310: sascha@3310: if (!fitting.fit(sqs)) { sascha@3310: // TODO: i18n sascha@3310: addProblem("sq.fitting.failed." + i); sascha@3310: fractionResult = new SQFractionResult(); sascha@3310: } sascha@3310: else { sascha@3310: Parameters parameters = createParameters(parameterNames); sascha@3310: int row = parameters.newRow(); sascha@3310: double [] coeffs = fitting.getParameters(); sascha@3310: for (int j = 0; j < parameterNames.length; ++j) { sascha@3310: parameters.set(row, parameterNames[j], coeffs[j]); sascha@3310: } sascha@3310: parameters.set(row, "chi_sqr", fitting.getChiSqr()); sascha@3310: parameters.set(row, "std_dev", fitting.getStandardDeviation()); sascha@3310: sascha@3310: fractionResult = new SQFractionResult( sascha@3310: parameters, sascha@3310: fitting.getRemaining(), sascha@3310: fitting.getOutliers()); sascha@3310: } sascha@3310: fitting.reset(); sascha@3310: fractionResults[i] = fractionResult; sascha@3310: } sascha@3310: results.add(new SQResult(fractionResults)); sascha@3297: } sascha@3289: sascha@3310: return new CalculationResult( sascha@3389: results.toArray(new SQResult[results.size()]), sascha@3310: this); ingo@3072: } sascha@3304: sascha@3304: public static final Parameters createParameters(String [] names) { sascha@3304: sascha@3304: String [] columns = new String[names.length + 2]; sascha@3304: columns[0] = "chi_sqr"; sascha@3304: columns[1] = "std_dev"; sascha@3304: System.arraycopy(names, 0, columns, 2, names.length); sascha@3304: return new Parameters(columns); sascha@3304: } ingo@3072: } ingo@3072: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :