@@ -5,14 +5,22 @@ |
package m.oms.ages; |
|
import csip.ModelDataService; |
+import csip.ServiceException; |
import csip.annotations.*; |
import static csip.annotations.ResourceType.*; |
import java.io.File; |
+import java.io.IOException; |
+import java.util.ArrayList; |
import java.util.HashMap; |
+import java.util.List; |
import java.util.Map; |
+import java.util.Set; |
import javax.ws.rs.Path; |
import static m.oms.ages.V1_0.KEY_SCRIPT; |
+import ngmf.util.cosu.luca.of.KGE; |
+import ngmf.util.cosu.luca.of.NS2LOG; |
import oms.utils.Utils; |
+import oms3.ObjectiveFunction; |
import oms3.util.Statistics; |
|
/** |
@@ -37,6 +45,14 @@ |
public static final String PAR_STARTTIME = "startTime"; |
public static final String PAR_ENDTIME = "endTime"; |
|
+ Map<String, ObjectiveFunction> ofs = new HashMap<>(); |
+ |
+ |
+ { |
+ ofs.put("kge", new KGE()); |
+ ofs.put("nslog", new NS2LOG()); |
+ } |
+ |
|
@Override |
public void doProcess() throws Exception { |
@@ -46,7 +62,8 @@ |
// pass request param to model runtime parameter -> run.inc |
Map<String, String> agesParam = new HashMap<>(); |
Utils.passReqQuotedParam(agesParam, parameter(), PAR_STARTTIME, PAR_ENDTIME); |
- Utils.passOptParam(agesParam, parameter(), "flowRouteTA", "soilOutLPS"); |
+ Utils.passOptParam(agesParam, parameter(), |
+ "flowRouteTA", "soilOutLPS"); |
Utils.createParamInclude(agesParam, getWorkspaceFile(RUN_INC)); |
|
String start = parameter().getString(PAR_STARTTIME); |
@@ -62,24 +79,32 @@ |
|
Utils.runAges(d, getWorkspaceDir(), parameter(), resources(), LOG); |
|
- if (parameter().has("obs") && parameter().has("sim")) { |
- String obs = parameter().getString("obs"); |
- String sim = parameter().getString("sim"); |
- |
- double missing = parameter().getDouble("missing", -9999d); |
- |
- // e.g. obs_data02_14.csv/obs/orun[1] |
- double[] obsData = Utils.getData(obs, getWorkspaceDir(), start, end); |
- |
- // e.g. output/csip_run/out/Outlet.csv/output/catchmentSimRunoff |
- double[] simData = Utils.getData(sim, getWorkspaceDir(), start, end); |
- |
- results().put("kge", Statistics.kge(obsData, simData, missing)); |
-// results().put("ns", Statistics.nashSutcliffe(obsData, simData, 2.0, missing)); |
-// results().put("nslog", Statistics.nashSutcliffeLog(obsData, simData, 2.0, missing)); |
+ for (String ofName : getRequestedObjfunc(ofs.keySet())) { |
+ String[] data = parameter().getStringArray(ofName); |
+ double v = calc_of(ofs.get(ofName), data[0], data[1], start, end); |
+ results().put(ofName, v); |
} |
- |
// results().put(getWorkspaceFile("output")); |
} |
|
+ |
+ private List<String> getRequestedObjfunc(Set<String> names) { |
+ List<String> l = new ArrayList<>(); |
+ for (String ofName : names) { |
+ if (parameter().has(ofName)) { |
+ l.add(ofName); |
+ } |
+ } |
+ return l; |
+ } |
+ |
+ |
+ private double calc_of(ObjectiveFunction of, String obs, String sim, String start, String end) throws IOException, ServiceException { |
+ // e.g. obs_data02_14.csv/obs/orun[1] |
+ double[] obsData = Utils.getData(obs, getWorkspaceDir(), start, end); |
+ // e.g. output/csip_run/out/Outlet.csv/output/catchmentSimRunoff |
+ double[] simData = Utils.getData(sim, getWorkspaceDir(), start, end); |
+ return of.calculate(obsData, simData, parameter().getDouble("missing", -9999d)); |
+ } |
+ |
} |