teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model; ingo@2713: ingo@2713: import java.util.ArrayList; ingo@2713: import java.util.List; ingo@2713: ingo@2713: import org.apache.log4j.Logger; ingo@2713: teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.common.utils.DateUtils; ingo@2713: teichmann@5831: import org.dive4elements.river.model.BedHeightSingle; teichmann@5831: import org.dive4elements.river.model.BedHeightSingleValue; teichmann@5831: import org.dive4elements.river.model.TimeInterval; ingo@2713: teichmann@5831: import org.dive4elements.river.artifacts.access.BedHeightAccess; ingo@2713: ingo@2713: ingo@2713: public class MiddleBedHeightCalculation extends Calculation { ingo@2713: ingo@2713: private static final Logger logger = ingo@2713: Logger.getLogger(MiddleBedHeightCalculation.class); ingo@2713: ingo@2713: ingo@3230: public CalculationResult calculate(BedHeightAccess access) { ingo@2713: logger.info("MiddleBedHeightCalculation.calculate"); ingo@2713: ingo@3230: int[] singleIds = access.getBedHeightSingleIDs(); sascha@3232: ingo@2713: ingo@2713: if (logger.isDebugEnabled()) { sascha@3258: Artifact artifact = access.getArtifact(); sascha@3232: ingo@2713: logger.debug("Artifact '" + artifact.identifier() + "' contains:"); ingo@2713: if (singleIds != null) { ingo@2713: logger.debug(" " + singleIds.length + " single bedheight ids"); ingo@2713: } ingo@2713: } ingo@2713: ingo@3230: List singles = getSingles(access, singleIds); ingo@2713: rrenkert@7919: return buildCalculationResult(access, singles); ingo@2713: } ingo@2713: ingo@2713: ingo@3230: protected List getSingles( sascha@3258: BedHeightAccess access, sascha@3258: int[] ids ingo@3230: ) { ingo@2713: List singles = new ArrayList(); ingo@2713: ingo@2713: for (int id: ids) { ingo@2713: BedHeightSingle s = BedHeightSingle.getBedHeightSingleById(id); ingo@2713: ingo@2713: if (s != null) { ingo@2713: singles.add(s); ingo@2713: } ingo@2713: else { felix@3924: logger.warn("Cannot find Single by id: " + id); ingo@2713: // TODO ADD WARNING ingo@2713: } ingo@2713: } ingo@2713: ingo@2713: return singles; ingo@2713: } ingo@2713: ingo@2713: ingo@2713: protected CalculationResult buildCalculationResult( felix@3931: BedHeightAccess access, rrenkert@7919: List singles ingo@2713: ) { ingo@2713: logger.info("MiddleBedHeightCalculation.buildCalculationResult"); ingo@2713: ingo@3230: double kmLo = access.getLowerKM(); ingo@3230: double kmHi = access.getUpperKM(); ingo@2713: ingo@2713: List data = new ArrayList(); ingo@2713: ingo@2713: for (BedHeightSingle single: singles) { ingo@2715: MiddleBedHeightData d = prepareSingleData(single, kmLo, kmHi); ingo@2713: ingo@2713: if (d != null) { ingo@2713: data.add(d); ingo@2713: } ingo@2713: } ingo@2713: ingo@2713: logger.debug("Calculation results in " + data.size() + " data objects."); ingo@2713: ingo@2713: return new CalculationResult((MiddleBedHeightData[]) ingo@2713: data.toArray(new MiddleBedHeightData[data.size()]), this); ingo@2713: } ingo@2713: ingo@2713: ingo@2715: protected MiddleBedHeightData prepareSingleData( ingo@2715: BedHeightSingle single, ingo@2715: double kmLo, ingo@2715: double kmHi ingo@2715: ) { ingo@2713: logger.debug("Prepare data for single: " + single.getDescription()); ingo@2713: ingo@2715: List values = ingo@2715: BedHeightSingleValue.getBedHeightSingleValues(single, kmLo, kmHi); ingo@2713: felix@5920: int year = single.getYear() != null ? single.getYear() : 0; felix@5920: ingo@2713: MiddleBedHeightData data = new MiddleBedHeightData( felix@5920: year, felix@5920: year, ingo@2713: single.getEvaluationBy(), ingo@2713: single.getDescription()); ingo@2713: ingo@2713: for (BedHeightSingleValue value: values) { felix@3924: if (value.getHeight() != null) { rrenkert@6351: double uncert = value.getUncertainty() != null ? rrenkert@6351: value.getUncertainty().doubleValue() : Double.NaN; rrenkert@6351: double sounding = value.getSoundingWidth() != null ? rrenkert@6351: value.getSoundingWidth().doubleValue() : Double.NaN; rrenkert@6351: double gap = value.getDataGap() != null ? rrenkert@6351: value.getDataGap().doubleValue() : Double.NaN; felix@3924: data.addAll(value.getStation().doubleValue(), felix@3924: value.getHeight().doubleValue(), rrenkert@6351: uncert, rrenkert@6351: sounding, rrenkert@6351: gap, felix@3924: value.getWidth().doubleValue(), felix@3924: false); felix@3924: } felix@3924: else { felix@3924: data.addAll(value.getStation().doubleValue(), felix@3924: 0, felix@3924: 0, felix@3924: 0, felix@3924: 0, felix@3924: 0, felix@3924: true); felix@3924: } ingo@2713: } ingo@2713: ingo@2713: logger.debug("Single contains " + values.size() + " values"); ingo@2713: ingo@2713: return data; ingo@2713: } ingo@2713: } ingo@2713: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :