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.minfo; rrenkert@4672: rrenkert@4672: import org.apache.log4j.Logger; rrenkert@4672: teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; teichmann@5831: import org.dive4elements.river.artifacts.access.RiverAccess; teichmann@5866: import org.dive4elements.river.artifacts.context.RiverContext; 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.math.MovingAverage; teichmann@5831: import org.dive4elements.river.artifacts.model.ZoomScale; teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; rrenkert@4672: rrenkert@4672: rrenkert@4672: public class BedDiffYearFilterFacet rrenkert@4672: extends DataFacet rrenkert@4672: { rrenkert@4672: private static Logger logger = Logger.getLogger(BedDiffYearFilterFacet.class); rrenkert@4672: rrenkert@4672: public BedDiffYearFilterFacet() { rrenkert@4672: } rrenkert@4672: rrenkert@4672: public BedDiffYearFilterFacet(int idx, String name, String description, rrenkert@4672: ComputeType type, String stateId, String hash) { rrenkert@4672: super(idx, name, description, type, hash, stateId); rrenkert@4672: } rrenkert@4672: rrenkert@4672: public Object getData(Artifact artifact, CallContext context) { rrenkert@4672: logger.debug("Get data for bed density at index: " + index); rrenkert@4672: rrenkert@4672: FLYSArtifact flys = (FLYSArtifact) artifact; rrenkert@4672: rrenkert@4672: CalculationResult res = (CalculationResult) flys.compute(context, hash, rrenkert@4672: stateId, type, false); rrenkert@4672: rrenkert@4672: BedDiffYearResult[] data = rrenkert@4672: (BedDiffYearResult[]) res.getData(); // TODO CAST TO SPECIFIC CLASS rrenkert@4672: Double start = (Double)context.getContextValue("startkm"); rrenkert@4672: Double end = (Double)context.getContextValue("endkm"); rrenkert@4672: if(start != null && end != null) { teichmann@5866: RiverContext fc = (RiverContext)context.globalContext(); rrenkert@4672: ZoomScale scales = (ZoomScale)fc.get("zoomscale"); rrenkert@4672: RiverAccess access = new RiverAccess((FLYSArtifact)artifact); rrenkert@4672: String river = access.getRiver(); rrenkert@4672: rrenkert@4672: double radius = scales.getRadius(river, start, end); rrenkert@4672: BedDiffYearResult oldData = data[index]; rrenkert@4672: BedDiffYearResult newData = new BedDiffYearResult(); rrenkert@4672: newData.setStart(oldData.getStart()); rrenkert@4672: newData.setEnd(oldData.getEnd()); rrenkert@4672: double[][] diffs = MovingAverage.weighted(oldData.getDifferencesData(), radius); rrenkert@4672: double[][] heights1 = MovingAverage.weighted(oldData.getHeights1Data(), radius); rrenkert@4672: double[][] heights2 = MovingAverage.weighted(oldData.getHeights2Data(), radius); rrenkert@4672: double[][] morph = oldData.getMorphWidthData(); rrenkert@4672: double[][] year = MovingAverage.weighted(oldData.getHeightPerYearData(), radius); rrenkert@4672: for(int j = 0; j < diffs[0].length; j++) { rrenkert@4672: newData.addKm(diffs[0][j]); rrenkert@4672: newData.addBedHeights(year[1][j]); rrenkert@4672: newData.addMorphWidth(morph[1][j]); rrenkert@4672: newData.addDifference(diffs[1][j]); rrenkert@4672: newData.addHeight1(heights1[1][j]); rrenkert@4672: newData.addHeight2(heights2[1][j]); rrenkert@4672: } rrenkert@4672: return newData; rrenkert@4672: } rrenkert@4672: return data != null && data.length > index ? data[index] : null; rrenkert@4672: } rrenkert@4672: rrenkert@4672: /** Copy deeply. */ rrenkert@4672: @Override rrenkert@4672: public Facet deepCopy() { rrenkert@4672: BedDiffYearFilterFacet copy = new BedDiffYearFilterFacet(); rrenkert@4672: copy.set(this); rrenkert@4672: copy.type = type; rrenkert@4672: copy.hash = hash; rrenkert@4672: copy.stateId = stateId; rrenkert@4672: return copy; rrenkert@4672: } rrenkert@4672: } rrenkert@4672: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :