Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java @ 8238:be3c11bef6e8
(issue1448) Finally use the sq time interval as filter in the calculation.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 08 Sep 2014 19:01:26 +0200 |
parents | e4606eae8ea5 |
children | 5c3b36b519d0 |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde * Software engineering by Intevation GmbH * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.artifacts.model.minfo; import gnu.trove.TDoubleArrayList; import org.apache.log4j.Logger; import org.dive4elements.artifacts.CallContext; import org.dive4elements.river.artifacts.access.BedDifferencesAccess; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; /** * Perform calculation of differences of bed height (german Sohlhoehe). * The input are either single year data or epochs. */ public class BedDiffCalculation extends Calculation { private static final Logger log = Logger.getLogger(BedDiffCalculation.class); protected String river; protected int [][] heightIds; public BedDiffCalculation() { } public CalculationResult calculate(BedDifferencesAccess access, CallContext context) { log.info("BedDiffCalculation.calculate"); this.river = access.getRiverName(); this.heightIds = access.extractHeightIds(context); BedDiffYearResult [] results = new BedDiffYearResult[heightIds.length]; for (int i = 0; i < heightIds.length; i++) { BedHeightSingleData [] pair = getHeightPair(heightIds[i]); if (pair[0].getYear() == null || pair[1].getYear() == null) { addProblem("beddiff.missing.year"); } results[i] = calculateYearDifference(pair); } return new CalculationResult(results, this); } /** Get two BedHeights from factory. */ private static BedHeightSingleData [] getHeightPair(int [] ids) { return new BedHeightSingleData [] { (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[0]), (BedHeightSingleData)BedHeightFactory.getHeight("single", ids[1]) }; } private BedDiffYearResult calculateYearDifference( BedHeightSingleData[] pair ) { log.debug("BedDiffCalculation.calculateYearDifference"); BedHeightSingleData s1 = pair[0]; BedHeightSingleData s2 = pair[1]; TDoubleArrayList stations = s1.getStations(); int size = stations.size(); TDoubleArrayList diffRes = new TDoubleArrayList(size); TDoubleArrayList kms = new TDoubleArrayList(size); TDoubleArrayList soundings = new TDoubleArrayList(size); TDoubleArrayList absolute = new TDoubleArrayList(size); TDoubleArrayList gap = new TDoubleArrayList(size); TDoubleArrayList heights1 = new TDoubleArrayList(size); TDoubleArrayList heights2 = new TDoubleArrayList(size); TDoubleArrayList morphs1 = new TDoubleArrayList(size); TDoubleArrayList morphs2 = new TDoubleArrayList(size); Integer range = null; if (s1.getYear() != null && s2.getYear() != null) { range = Math.abs(s1.getYear() - s2.getYear()); } for (int i = 0; i < size; i++) { double station = stations.getQuick(i); double h1 = s1.getHeight(station); double h2 = s2.getHeight(station); double m1 = s1.getWidth(station); double m2 = s2.getWidth(station); double hDiff = h1 - h2; if (!Double.isNaN(hDiff)) { diffRes.add(hDiff); kms.add(station); soundings.add(Math.max( s1.getSoundingWidth(station), s2.getSoundingWidth(station))); gap.add(Math.max( s1.getDataGap(station), s2.getDataGap(station))); if (range != null) { absolute.add((hDiff / range) * 100d); } heights1.add(h1); heights2.add(h2); morphs1.add(m1); morphs2.add(m2); } } return new BedDiffYearResult( kms, diffRes, heights1, heights2, morphs1, morphs2, soundings, absolute, gap, s1.getYear(), s2.getYear(), s1.getName(), s2.getName()); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :