mschaefer@9361: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9361: * Software engineering by mschaefer@9361: * Björnsen Beratende Ingenieure GmbH mschaefer@9361: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9361: * mschaefer@9361: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9361: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9361: * documentation coming with Dive4Elements River for details. mschaefer@9361: */ mschaefer@9361: package org.dive4elements.river.artifacts.uinfo.salix; mschaefer@9361: mschaefer@9361: import java.text.NumberFormat; mschaefer@9361: import java.util.ArrayList; mschaefer@9361: import java.util.Collection; mschaefer@9361: import java.util.List; mschaefer@9361: mschaefer@9361: import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult; gernotbelger@9364: import org.dive4elements.river.artifacts.common.AbstractExportContext; mschaefer@9361: import org.dive4elements.river.artifacts.common.ExportContextCSV; mschaefer@9361: import org.dive4elements.river.artifacts.common.ExportContextPDF; mschaefer@9361: import org.dive4elements.river.artifacts.common.GeneralResultType; mschaefer@9361: import org.dive4elements.river.artifacts.common.IExportContext; mschaefer@9361: import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource; mschaefer@9361: import org.dive4elements.river.artifacts.common.ResultRow; mschaefer@9361: import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; mschaefer@9361: import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType; gernotbelger@9429: import org.dive4elements.river.artifacts.uinfo.salix.SalixLineCrossSectionIndexData.SalixWaterlevel; mschaefer@9361: mschaefer@9361: import gnu.trove.TDoubleArrayList; mschaefer@9361: mschaefer@9361: /** mschaefer@9361: * @author Domenico Nardi Tironi mschaefer@9361: */ mschaefer@9361: class SalixLineCalculationResult extends AbstractCalculationExportableResult { mschaefer@9361: mschaefer@9361: private static final long serialVersionUID = 1L; gernotbelger@9426: mschaefer@9361: private static final String JASPER_FILE = "/jasper/templates/uinfo.salixline.jrxml"; mschaefer@9361: gernotbelger@9426: private static final double STATION_TOLERANCE = 0.1d; gernotbelger@9426: mschaefer@9361: private final String[] scenarioLabels; mschaefer@9361: mschaefer@9361: private final String partialRangeString; mschaefer@9361: mschaefer@9361: private final String deltaWString; mschaefer@9361: mschaefer@9361: public SalixLineCalculationResult(final String label, final Collection rows) { mschaefer@9361: this(label, new String[] {}, "", "", rows); mschaefer@9361: } mschaefer@9361: mschaefer@9361: public SalixLineCalculationResult(final String label, final String[] scenarioLabels, final String partialRangeString, final String deltaWString, mschaefer@9361: final Collection rows) { mschaefer@9361: super(label, rows); mschaefer@9361: this.scenarioLabels = scenarioLabels; mschaefer@9361: this.partialRangeString = partialRangeString; mschaefer@9361: this.deltaWString = deltaWString; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public final int getScenarioCount() { mschaefer@9361: return (this.scenarioLabels != null) ? this.scenarioLabels.length : 0; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public String getScenarioLabel(final int i) { mschaefer@9361: if ((this.scenarioLabels != null) && (i < this.scenarioLabels.length)) mschaefer@9361: return this.scenarioLabels[i]; mschaefer@9361: mschaefer@9361: return ""; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public String getPartialRangeString() { mschaefer@9361: return this.partialRangeString; mschaefer@9361: } mschaefer@9361: mschaefer@9361: public String getDeltaWString() { mschaefer@9361: return this.deltaWString; mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: public void writeCSVHeader(final ExportContextCSV exportContextCSV, final RiverInfo river) { mschaefer@9361: mschaefer@9361: final Collection header = new ArrayList<>(); mschaefer@9361: mschaefer@9361: header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station)); mschaefer@9361: header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salixline)); mschaefer@9361: header.add(exportContextCSV.formatCsvHeader(UInfoResultType.salix_mw_mnw)); mschaefer@9361: mschaefer@9361: for (int i = 1; i <= getScenarioCount(); i++) { mschaefer@9361: header.add(exportContextCSV.msg(SalixScenario.getDeltaWHeader())); mschaefer@9361: header.add(exportContextCSV.msg(SalixScenario.getScenarioValueHeader())); mschaefer@9361: } mschaefer@9361: exportContextCSV.writeCSVLine(header.toArray(new String[header.size()])); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final ResultRow row) { mschaefer@9361: return formatRow(exportContextCSV, row); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected String[] formatPDFRow(final ExportContextPDF exportContextPDF, final ResultRow row) { mschaefer@9361: return formatRow(exportContextPDF, row); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected String getJasperFile() { mschaefer@9361: return JASPER_FILE; mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected void addJRTableHeader(final ExportContextPDF exportContextPDF, final MetaAndTableJRDataSource source) { mschaefer@9361: mschaefer@9361: /* additional column headings */ mschaefer@9361: exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station); mschaefer@9361: exportContextPDF.addJRMetadata(source, "salix_line", UInfoResultType.salixline); mschaefer@9361: exportContextPDF.addJRMetadata(source, "salix_delta_mw", UInfoResultType.salix_mw_mnw); mschaefer@9361: mschaefer@9361: for (int i = 1; i <= this.getScenarioCount(); i++) { gernotbelger@9406: // TODO Spaltenueberschriften der Scenarios (falls gefordert) mschaefer@9361: } mschaefer@9361: } mschaefer@9361: mschaefer@9361: private String[] formatRow(final IExportContext context, final ResultRow row) { mschaefer@9361: mschaefer@9361: final Collection lines = new ArrayList<>(); mschaefer@9361: lines.add(context.formatRowValue(row, GeneralResultType.station)); mschaefer@9361: lines.add(context.formatRowValue(row, UInfoResultType.salixline)); mschaefer@9361: lines.add(context.formatRowValue(row, UInfoResultType.salix_mw_mnw)); mschaefer@9361: gernotbelger@9406: if (context instanceof ExportContextCSV) { gernotbelger@9406: final NumberFormat formatter = ((AbstractExportContext) context).getSalixScenFormatter(); mschaefer@9504: final NumberFormat intFormatter = ((AbstractExportContext) context).getIntegerFormatter(); gernotbelger@9406: final List scenarios = (List) row.getValue(UInfoResultType.customMultiRowColSalixScenarios); gernotbelger@9406: for (int i = 1; i <= this.getScenarioCount(); i++) { gernotbelger@9406: if (i > scenarios.size()) gernotbelger@9406: break; gernotbelger@9406: if (scenarios.get(i - 1) != null) { mschaefer@9504: lines.add(scenarios.get(i - 1).getDeltaWFormatted(intFormatter)); gernotbelger@9406: lines.add(scenarios.get(i - 1).getSalixValueFormatted(formatter)); gernotbelger@9406: } else { gernotbelger@9406: lines.add(""); gernotbelger@9406: lines.add(""); gernotbelger@9406: } mschaefer@9361: } mschaefer@9361: } mschaefer@9361: return lines.toArray(new String[lines.size()]); mschaefer@9361: } mschaefer@9361: mschaefer@9361: @Override mschaefer@9361: protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV) { mschaefer@9361: // do nothing. subclass may override mschaefer@9361: } mschaefer@9361: mschaefer@9361: /** mschaefer@9361: * Gets a longitudinal section of the salix value of a scenario mschaefer@9361: */ mschaefer@9361: public final double[][] getScenarioPoints(final int dataIndex) { mschaefer@9361: mschaefer@9361: final Collection rows = getRows(); mschaefer@9361: mschaefer@9361: final TDoubleArrayList xPoints = new TDoubleArrayList(rows.size()); mschaefer@9361: final TDoubleArrayList yPoints = new TDoubleArrayList(rows.size()); mschaefer@9361: mschaefer@9361: for (final ResultRow row : rows) { mschaefer@9361: mschaefer@9361: final double station = row.getDoubleValue(GeneralResultType.station); mschaefer@9361: mschaefer@9361: final List scenarios = (List) row.getValue(UInfoResultType.customMultiRowColSalixScenarios); mschaefer@9361: if (dataIndex <= scenarios.size() - 1) { mschaefer@9361: final SalixScenario salixScenario = scenarios.get(dataIndex); mschaefer@9361: if (salixScenario != null) { mschaefer@9361: final double value = salixScenario.getSalixValue(); mschaefer@9361: xPoints.add(station); mschaefer@9361: yPoints.add(value); mschaefer@9361: } mschaefer@9361: } mschaefer@9361: } mschaefer@9361: mschaefer@9361: return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() }; mschaefer@9361: } gernotbelger@9426: gernotbelger@9426: public final double getSalixValue(final double currentKm, final double nextKm, final double prevKm) { gernotbelger@9426: gernotbelger@9426: final ResultRow row = getRowForStation(currentKm, STATION_TOLERANCE); gernotbelger@9426: if (row == null) gernotbelger@9426: return Double.NaN; gernotbelger@9426: mschaefer@9430: return row.getDoubleValue(UInfoResultType.salixw); gernotbelger@9426: } gernotbelger@9426: gernotbelger@9426: public final double getSalixScenarioValue(final double currentKm, final double nextKm, final double prevKm, final int scenarioIndex) { gernotbelger@9426: final ResultRow row = getRowForStation(currentKm, STATION_TOLERANCE); gernotbelger@9426: if (row == null) gernotbelger@9426: return Double.NaN; gernotbelger@9426: gernotbelger@9426: final List scenarios = (List) row.getValue(UInfoResultType.customMultiRowColSalixScenarios); gernotbelger@9426: final SalixScenario salixScenario = scenarios.get(scenarioIndex); gernotbelger@9426: if (salixScenario == null) gernotbelger@9426: return Double.NaN; gernotbelger@9426: mschaefer@9430: return salixScenario.getSalixW(); gernotbelger@9426: } gernotbelger@9426: gernotbelger@9429: public final double getWaterlevelValue(final double currentKm, final double nextKm, final double prevKm, final SalixWaterlevel waterlevel) { gernotbelger@9429: gernotbelger@9426: final ResultRow row = getRowForStation(currentKm, STATION_TOLERANCE); gernotbelger@9429: if (row == null) gernotbelger@9429: return Double.NaN; gernotbelger@9429: gernotbelger@9429: switch (waterlevel) { gernotbelger@9429: case mnw: gernotbelger@9429: return row.getDoubleValue(UInfoResultType.waterlevelMNW); gernotbelger@9429: case mw: gernotbelger@9429: return row.getDoubleValue(UInfoResultType.waterlevelMW); gernotbelger@9429: case mhw: gernotbelger@9429: return row.getDoubleValue(UInfoResultType.waterlevelMHW); mschaefer@9430: case hw5: gernotbelger@9429: return row.getDoubleValue(UInfoResultType.waterlevelMH5); gernotbelger@9429: gernotbelger@9429: default: gernotbelger@9429: throw new UnsupportedOperationException(); gernotbelger@9429: } gernotbelger@9426: } mschaefer@9361: }