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; sascha@3552: teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; sascha@3552: teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; sascha@3552: teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; teichmann@5831: teichmann@5831: import org.dive4elements.river.artifacts.math.fitting.Function; teichmann@5831: import org.dive4elements.river.artifacts.math.fitting.FunctionFactory; teichmann@5831: 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; teichmann@5831: teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; sascha@3552: sascha@3552: import org.apache.log4j.Logger; sascha@3552: sascha@3552: public class SQOutlierCurveFacet sascha@3552: extends DataFacet sascha@3552: implements FacetTypes sascha@3552: { sascha@3552: private static final Logger log = sascha@3552: Logger.getLogger(SQOutlierCurveFacet.class); sascha@3552: sascha@3552: public static final String FUNCTION = "sq-pow"; sascha@3552: sascha@3552: public static final int BITMASK_ITERATION = (1 << 16) - 1; sascha@3552: sascha@3552: private int fractionIdx; sascha@3552: sascha@3552: public SQOutlierCurveFacet() { sascha@3552: } sascha@3552: sascha@3552: public SQOutlierCurveFacet( sascha@3552: int idx, sascha@3552: int fractionIdx, sascha@3552: String name, sascha@3552: String description, sascha@3552: String hash, sascha@3552: String stateId sascha@3552: ) { sascha@3552: super(idx, name, description, ComputeType.ADVANCE, hash, stateId); sascha@3552: this.fractionIdx = fractionIdx; sascha@3552: } sascha@3552: sascha@3552: sascha@3552: @Override sascha@3552: public Object getData(Artifact artifact, CallContext context) { sascha@3552: log.debug("SQOutlierCurveFacet.getData"); sascha@3552: sascha@3552: if (!(artifact instanceof FLYSArtifact)) { sascha@3552: return null; sascha@3552: } sascha@3552: 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: int idx = this.index >> 16; sascha@3552: int iter = this.index & BITMASK_ITERATION; sascha@3552: sascha@3552: SQResult[] results = (SQResult[]) res.getData(); sascha@3552: SQFractionResult result = results[idx].getFraction(fractionIdx); sascha@3552: sascha@3552: Parameters params = result.getParameters(iter); sascha@3552: sascha@3552: if (params == null) { 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; i < paramNames.length; 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]); sascha@3552: } sascha@3552: sascha@3552: @Override sascha@3552: public Facet deepCopy() { sascha@3552: SQOutlierCurveFacet copy = new SQOutlierCurveFacet(); sascha@3552: copy.set(this); sascha@3552: return copy; sascha@3552: } sascha@3552: } sascha@3552: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :