gernotbelger@8940: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8940: * Software engineering by gernotbelger@8940: * Björnsen Beratende Ingenieure GmbH gernotbelger@8940: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8940: * gernotbelger@8940: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8940: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8940: * documentation coming with Dive4Elements River for details. gernotbelger@8940: */ gernotbelger@8940: gernotbelger@8940: package org.dive4elements.river.artifacts.sinfo.common; gernotbelger@8940: gernotbelger@8940: import java.util.Map; gernotbelger@8940: import java.util.Set; gernotbelger@8940: gernotbelger@8940: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; gernotbelger@8956: import org.dive4elements.artifactdatabase.state.Facet; gernotbelger@8940: import org.dive4elements.artifacts.Artifact; gernotbelger@8940: import org.dive4elements.artifacts.CallContext; gernotbelger@8940: import org.dive4elements.river.artifacts.D4EArtifact; gernotbelger@8940: import org.dive4elements.river.artifacts.access.RiverAccess; gernotbelger@8940: import org.dive4elements.river.artifacts.context.RiverContext; gernotbelger@8940: import org.dive4elements.river.artifacts.math.MovingAverage; gernotbelger@8940: import org.dive4elements.river.artifacts.model.ZoomScale; gernotbelger@8956: import org.dive4elements.river.artifacts.resources.Resources; gernotbelger@8956: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; gernotbelger@8940: import org.dive4elements.river.exports.DiagramGenerator; gernotbelger@8940: import org.dive4elements.river.exports.StyledSeriesBuilder; gernotbelger@8940: import org.dive4elements.river.jfree.StyledXYSeries; gernotbelger@8940: import org.dive4elements.river.themes.ThemeDocument; gernotbelger@8940: gernotbelger@8948: abstract class AbstractSInfoLineProcessor extends AbstractSInfoProcessor { gernotbelger@8940: gernotbelger@8940: public AbstractSInfoLineProcessor(final String i18nAxisLabel, final Set handledFacetType) { gernotbelger@8940: super(i18nAxisLabel, handledFacetType); gernotbelger@8940: } gernotbelger@8940: gernotbelger@8940: @Override gernotbelger@8940: protected final String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { gernotbelger@8940: gernotbelger@8940: final CallContext context = generator.getCallContext(); gernotbelger@8940: final Map metaData = bundle.getFacet().getMetaData(); gernotbelger@8940: gernotbelger@8940: final Artifact artifact = bundle.getArtifact(); gernotbelger@8940: gernotbelger@8940: final StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); gernotbelger@8940: series.putMetaData(metaData, artifact, context); gernotbelger@8940: gernotbelger@8940: final String facetName = bundle.getFacetName(); gernotbelger@8946: @SuppressWarnings("unchecked") gernotbelger@8946: final RESULT data = (RESULT) bundle.getData(context); gernotbelger@8940: if (data == null) { gernotbelger@8940: // Check has been here before so we keep it for security reasons gernotbelger@8940: // this should never happen though. gernotbelger@8940: throw new IllegalStateException("Data is null for facet: " + facetName); gernotbelger@8940: } gernotbelger@8940: gernotbelger@8940: final double[][] points = generatePoints(context, artifact, data, facetName); gernotbelger@8940: gernotbelger@8940: StyledSeriesBuilder.addPoints(series, points, true); gernotbelger@8940: generator.addAxisSeries(series, getAxisName(), visible); gernotbelger@8940: gernotbelger@8940: return metaData.get("Y"); gernotbelger@8940: } gernotbelger@8940: gernotbelger@8940: private Double findRadius(final CallContext context, final Artifact artifact) { gernotbelger@8940: final Double start = (Double) context.getContextValue("startkm"); gernotbelger@8940: final Double end = (Double) context.getContextValue("endkm"); gernotbelger@8940: gernotbelger@8940: if (start == null || end == null) gernotbelger@8940: return null; gernotbelger@8940: gernotbelger@8940: final RiverContext fc = (RiverContext) context.globalContext(); gernotbelger@8940: final ZoomScale scales = (ZoomScale) fc.get("zoomscale"); gernotbelger@8940: final RiverAccess access = new RiverAccess((D4EArtifact) artifact); gernotbelger@8940: final String river = access.getRiverName(); gernotbelger@8940: gernotbelger@8940: return scales.getRadius(river, start, end); gernotbelger@8940: } gernotbelger@8940: gernotbelger@8956: private double[][] generatePoints(final CallContext context, final Artifact artifact, final RESULT data, final String facetName) { gernotbelger@8940: gernotbelger@8940: final double[][] points = doGetPoints(data, facetName); gernotbelger@8956: if (facetName.endsWith(".filtered")) { gernotbelger@8940: final Double radius = findRadius(context, artifact); gernotbelger@8940: return movingAverage(radius, points); gernotbelger@8940: } gernotbelger@8940: gernotbelger@8940: return points; gernotbelger@8940: } gernotbelger@8940: gernotbelger@8946: protected abstract double[][] doGetPoints(RESULT data, String facetName); gernotbelger@8940: gernotbelger@8940: private double[][] movingAverage(final Double radius, final double[][] points) { gernotbelger@8940: gernotbelger@8940: if (radius == null) gernotbelger@8940: return points; gernotbelger@8940: gernotbelger@8940: return MovingAverage.weighted(points, radius); gernotbelger@8940: } gernotbelger@8956: gernotbelger@8956: protected static final Facet createFacet(final CallContext context, final String hash, final String id, final AbstractSInfoCalculationResult result, gernotbelger@8956: final int index, final String axisLabel, final String facetId, final String description) { gernotbelger@8956: final String facetFlowDepthFilteredDescription = Resources.getMsg(context.getMeta(), description, description, result.getLabel()); gernotbelger@8956: return new SInfoResultFacet(index, facetId, facetFlowDepthFilteredDescription, axisLabel, ComputeType.ADVANCE, id, hash); gernotbelger@8956: } gernotbelger@8940: }