rrenkert@4372: package de.intevation.flys.artifacts.model.minfo; rrenkert@4372: rrenkert@4372: import org.apache.log4j.Logger; rrenkert@4372: felix@5645: import java.util.ArrayList; felix@5645: import java.util.List; felix@5645: rrenkert@4372: import de.intevation.artifactdatabase.state.Facet; rrenkert@4372: import de.intevation.artifacts.Artifact; rrenkert@4372: import de.intevation.artifacts.CallContext; rrenkert@4372: import de.intevation.flys.artifacts.FLYSArtifact; rrenkert@4372: import de.intevation.flys.artifacts.model.CalculationResult; rrenkert@4372: import de.intevation.flys.artifacts.model.DataFacet; felix@5645: import de.intevation.flys.model.MeasurementStation; felix@5645: import de.intevation.flys.artifacts.model.FacetTypes; rrenkert@4372: import de.intevation.flys.artifacts.states.DefaultState.ComputeType; rrenkert@4372: felix@5645: import de.intevation.flys.utils.FLYSUtils; felix@5645: rrenkert@4372: rrenkert@4372: public class SedimentLoadFacet rrenkert@4372: extends DataFacet rrenkert@4372: { felix@5645: /** Very own logger. */ rrenkert@4372: private static Logger logger = Logger.getLogger(SedimentLoadFacet.class); rrenkert@4372: felix@5645: private static double EPSILON = 1e-5; felix@5645: rrenkert@4372: public SedimentLoadFacet() { rrenkert@4372: } rrenkert@4372: rrenkert@4372: public SedimentLoadFacet(int idx, String name, String description, rrenkert@4372: ComputeType type, String stateId, String hash) { rrenkert@4372: super(idx, name, description, type, hash, stateId); rrenkert@4372: } rrenkert@4372: rrenkert@4372: public Object getData(Artifact artifact, CallContext context) { rrenkert@4372: logger.debug("Get data for sediment load at index: " + index); rrenkert@4372: rrenkert@4372: FLYSArtifact flys = (FLYSArtifact) artifact; rrenkert@4372: rrenkert@4372: CalculationResult res = (CalculationResult) flys.compute(context, hash, rrenkert@4372: stateId, type, false); rrenkert@4372: rrenkert@4372: Object[] data = rrenkert@4372: (SedimentLoadResult[]) res.getData(); // TODO CAST TO SPECIFIC CLASS rrenkert@4372: felix@5645: List allStations = FLYSUtils.getRiver(flys).getMeasurementStations(); felix@5645: SedimentLoadResult result = data != null && data.length > index ? (SedimentLoadResult)data[index] : null; felix@5645: if (result == null) { felix@5645: return null; felix@5645: } felix@5645: felix@5645: // Filter stations according to type. felix@5645: List stations = new ArrayList(); felix@5645: for (MeasurementStation station: allStations) { felix@5645: if (station.getRange() == null || station.getMeasurementType() == null) { felix@5645: continue; felix@5645: } felix@5645: if (FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName()) && station.getMeasurementType().equals("Geschiebe")) felix@5645: stations.add(station); felix@5645: else if (!FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName()) && station.getMeasurementType().equals("Schwebstoff")) felix@5645: stations.add(station); felix@5645: } felix@5645: felix@5645: // Access data according to type. felix@5645: double[][] sd = null; felix@5645: if (getName().equals(FacetTypes.SEDIMENT_LOAD_SAND)) felix@5645: sd = result.getSandData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_COARSE)) felix@5645: sd = result.getCoarseData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_FINEMIDDLE)) felix@5645: sd = result.getFineMiddleData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND)) felix@5645: sd = result.getSuspSandData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND_BED)) felix@5645: sd = result.getSuspSandBedData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SEDIMENT)) felix@5645: sd = result.getSuspSedimentData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL_LOAD)) felix@5645: sd = result.getTotalLoadData(); felix@5645: else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL)) felix@5645: sd = result.getTotalData(); felix@5645: felix@5645: double[] km = sd[0]; felix@5645: double[] load = sd[1]; felix@5645: felix@5645: double[][] values = new double[2][]; felix@5645: values[0] = new double[km.length*2]; felix@5645: values[1] = new double[km.length*2]; felix@5645: felix@5645: // Find station via its station (km). felix@5645: // TODO what to do with gaps in measurement stations. felix@5645: for (int i = 0; i < km.length; i++) { felix@5645: boolean matchFound = false; felix@5645: for (MeasurementStation station: stations) { felix@5645: if (Math.abs(station.getStation() - km[i]) < EPSILON) { felix@5645: values[0][i*2] = station.getRange().getA().doubleValue(); felix@5645: values[1][i*2] = load[i]; felix@5645: values[0][i*2+1] = station.getRange().getB().doubleValue(); felix@5645: values[1][i*2+1] = load[i]; felix@5645: matchFound = true; felix@5645: } felix@5645: } felix@5645: if (!matchFound) { felix@5645: values[0][i*2] = km[i]; felix@5645: values[1][i*2] = load[i]; felix@5645: logger.debug("No measurement station for km " + km[i]); felix@5645: } felix@5645: } felix@5645: return values; rrenkert@4372: } rrenkert@4372: felix@5645: rrenkert@4372: /** Copy deeply. */ rrenkert@4372: @Override rrenkert@4372: public Facet deepCopy() { rrenkert@4372: SedimentLoadFacet copy = new SedimentLoadFacet(); rrenkert@4372: copy.set(this); rrenkert@4372: copy.type = type; rrenkert@4372: copy.hash = hash; rrenkert@4372: copy.stateId = stateId; rrenkert@4372: return copy; rrenkert@4372: } rrenkert@4372: } rrenkert@4372: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :