teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model.sq; ingo@3072: ingo@3072: import org.apache.log4j.Logger; ingo@3072: teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; ingo@3072: teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; teichmann@5831: import org.dive4elements.river.artifacts.math.fitting.Function; teichmann@5831: import org.dive4elements.river.artifacts.math.fitting.FunctionFactory; teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; teichmann@5831: import org.dive4elements.river.artifacts.model.DataFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.model.Parameters; ingo@3072: teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; ingo@3072: ingo@3072: ingo@3072: /** ingo@3072: * Facet to show the curve in a sq relation. ingo@3072: * ingo@3072: * @author Ingo Weinzierl ingo@3072: */ ingo@3072: public class SQCurveFacet extends DataFacet implements FacetTypes { ingo@3072: ingo@3072: private static final Logger log = Logger.getLogger(SQCurveFacet.class); ingo@3072: ingo@3072: ingo@3105: public static final String FUNCTION = "sq-pow"; ingo@3105: ingo@3105: ingo@3101: private int fractionIdx; ingo@3101: ingo@3101: ingo@3072: public SQCurveFacet() { ingo@3072: } ingo@3072: ingo@3072: ingo@3101: public SQCurveFacet( ingo@3101: int idx, ingo@3101: int fractionIdx, ingo@3101: String name, ingo@3101: String description, ingo@3101: String hash, ingo@3101: String stateId ingo@3101: ) { ingo@3101: super(idx, name, description, ComputeType.ADVANCE, hash, stateId); ingo@3101: this.fractionIdx = fractionIdx; ingo@3072: } ingo@3072: ingo@3072: ingo@3072: @Override ingo@3072: public Object getData(Artifact artifact, CallContext context) { ingo@3072: log.debug("SQCurveFacet.getData"); ingo@3105: sascha@3552: if (!(artifact instanceof FLYSArtifact)) { sascha@3552: return null; ingo@3105: } ingo@3072: sascha@3552: FLYSArtifact flys = (FLYSArtifact) artifact; sascha@3552: sascha@3552: CalculationResult res = (CalculationResult) flys.compute( sascha@3552: context, ComputeType.ADVANCE, false); sascha@3552: sascha@3552: SQResult[] results = (SQResult[]) res.getData(); sascha@3552: SQFractionResult result = results[index].getFraction(fractionIdx); sascha@3552: sascha@3552: Parameters params = result.getParameters(); sascha@3552: sascha@3552: if (params == null) { sascha@3552: log.debug("no parameters found"); sascha@3552: return null; sascha@3552: } sascha@3552: sascha@3552: Function func = FunctionFactory.getInstance().getFunction(FUNCTION); sascha@3552: String[] paramNames = func.getParameterNames(); sascha@3552: sascha@3552: double [] coeffs = params.get(0, paramNames); sascha@3552: sascha@3552: if (log.isDebugEnabled()) { sascha@3552: for (int i = 0, N = paramNames.length; i < N; i++) { sascha@3552: log.debug("retrieved parameter " + paramNames[i] + sascha@3552: " = " + coeffs[i]); sascha@3552: } sascha@3552: } sascha@3552: teichmann@5831: org.dive4elements.river.artifacts.math.Function mf = sascha@3552: func.instantiate(coeffs); sascha@3552: sascha@3552: double [] extent = result.getQExtent(); sascha@3552: return new SQFunction(mf, extent[0], extent[1]); ingo@3072: } ingo@3072: ingo@3072: ingo@3072: @Override ingo@3072: public SQCurveFacet deepCopy() { ingo@3072: SQCurveFacet copy = new SQCurveFacet(); ingo@3072: copy.set(this); ingo@3072: ingo@3072: return copy; ingo@3072: } ingo@3072: } ingo@3072: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :