Displaying differences for changeset
 
display as  

src/java/m/oms/ages/V1_0.java

@@ -24,7 +24,8 @@
 import ngmf.util.cosu.luca.of.TRMSE;
 import oms.utils.Utils;
 import oms.utils.Utils.PBIAS;
-import oms.utils.Utils.NS2LOG;
+import oms.utils.Utils.NSLOG;
+import oms.utils.Utils.NSLOG1P;
 import oms3.ObjectiveFunction;
 
 /**
@@ -43,205 +44,210 @@
 @Resource(file = "${csip.dir}/bin/ages/simulation/ages.sim", type = REFERENCE, id = KEY_SCRIPT)
 public class V1_0 extends ModelDataService {
 
-    public static final String KEY_SCRIPT = "ages.sim";
-    public static final String RUN_INC = "run.inc";
+  public static final String KEY_SCRIPT = "ages.sim";
+  public static final String RUN_INC = "run.inc";
 
-    public static final String PAR_STARTTIME = "startTime";
-    public static final String PAR_ENDTIME = "endTime";
+  public static final String PAR_STARTTIME = "startTime";
+  public static final String PAR_ENDTIME = "endTime";
 
-    static final Map<String, ObjectiveFunction> OF = new HashMap<>();
+  static final Map<String, ObjectiveFunction> OF = new HashMap<>();
 
-    static {
-        OF.put("kge", new KGE());
-        OF.put("ns", new NS());
-        OF.put("nslog", new NS2LOG());
-        OF.put("rmse", new RMSE());
-        OF.put("trmse", new TRMSE());
-        OF.put("pbias", new PBIAS());
+
+  static {
+    OF.put("kge", new KGE());
+    OF.put("ns", new NS());
+    OF.put("nslog", new NSLOG());
+    OF.put("nslog1p", new NSLOG1P());
+    OF.put("rmse", new RMSE());
+    OF.put("trmse", new TRMSE());
+    OF.put("pbias", new PBIAS());
+  }
+
+  // required parameter
+  String[] reqParams = {
+    PAR_STARTTIME,
+    PAR_ENDTIME
+  };
+
+  // optional parameter
+  String[] optParams = {
+    "ACAdaptation",
+    "BetaW",
+    "Beta_min",
+    "Beta_rsd",
+    "FCAdaptation",
+    "Ksink",
+    "LExCoef",
+    "N_delay_RG1",
+    "N_delay_RG2",
+    "a_rain",
+    "a_snow",
+    "angstrom_a",
+    "angstrom_b",
+    "baseTemp",
+    "calib_clat_fact",
+    "ccf_factor",
+    "defaultCO2",
+    "denitfac",
+    "delayNitrification",
+    "denitrificationRateCoefficient",
+    "denitrificationSoilSaturationThreshold",
+    "depdr",
+    "deposition_factor",
+    "drrad",
+    "drspac",
+    "f1",
+    "f12",
+    "f13",
+    "f14",
+    "f15",
+    "f16",
+    "f17",
+    "f18",
+    "f19",
+    "f2",
+    "f3",
+    "f4",
+    "f5",
+    "f6",
+    "f7",
+    "f8",
+    "flowRouteTA",
+    "fmt_date",
+    "fmt_double",
+    "g_factor",
+    "geoMaxPerc",
+    "gwCapRise",
+    "gwRG1Fact",
+    "gwRG1RG2dist",
+    "gwRG2Fact",
+    "halflife_RG1",
+    "halflife_RG2",
+    "infil_conc_factor",
+    "initLPS",
+    "initMPS",
+    "initN_concRG1",
+    "initN_concRG2",
+    "initRG1",
+    "initRG2",
+    "kdiff_layer",
+    "kf_calib",
+    "lagSurfaceRunoff",
+    "lagInterflow",
+    "locGrw",
+    "longTZ",
+    "nitri_delay",
+    "nitrificationSoilTemperatureThreshold",
+    "nitrificationSurfaceTemperatureThreshold",
+    "opti",
+    "piadin",
+    "r_factor",
+    "rootfactor",
+    "sceno",
+    "skipRegression",
+    "snowCritDens",
+    "snowDensConst",
+    "snowFactorA",
+    "snowFactorB",
+    "snowFactorC",
+    "snow_trans",
+    "snow_trs",
+    "soilDiffMPSLPS",
+    "soilDistMPSLPS",
+    "soilImpGT80",
+    "soilImpLT80",
+    "soilLatVertLPS",
+    "soilLinRed",
+    "soilMaxDPS",
+    "soilMaxInfSnow",
+    "soilMaxInfSummer",
+    "soilMaxInfWinter",
+    "soilMaxPerc",
+    "soilOutLPS",
+    "soilPolRed",
+    "t_factor",
+    "tempRes",
+    "temp_lag"
+  };
+
+  // simulation flags
+  String[] flags = {
+    "flagParallel",
+    "flagRegionalization",
+    "flagHRURouting",
+    "flagReachRouting",
+    "flagSort",
+    "flagSplit",
+    "flagInfiltration",
+    "flagTillage",
+    "flagTileDrain",
+    "flagUPGM",
+    "parallelismFactor",
+    "parallelismThreads",
+    "flagSaveState",
+    "flagLoadState",
+    "flagWB"
+  };
+
+
+  @Override
+  public void doProcess() throws Exception {
+    String dsl = parameter().getString(KEY_SCRIPT,
+        resources().getFile(KEY_SCRIPT).toString());
+
+    // pass request param to model runtime parameter -> run.inc
+    Map<String, String> agesParam = new LinkedHashMap<>();
+    Utils.passReqQuotedParam(agesParam, parameter(), reqParams);
+
+    // scalar parameter
+    Utils.passOptParam(agesParam, parameter(), optParams);
+
+    // optional flags
+    Utils.passOptQuotedParam(agesParam, parameter(), flags);
+
+    // create parameter include file
+    Utils.createParamInclude(agesParam, getWorkspaceFile(RUN_INC));
+
+    String start = parameter().getString(PAR_STARTTIME);
+    String end = parameter().getString(PAR_ENDTIME);
+
+    File d = new File(dsl);
+    if (!(d.isAbsolute() && d.exists())) {
+      d = getWorkspaceFile(dsl);
     }
 
-    // required parameter
-    String[] reqParams = {
-        PAR_STARTTIME,
-        PAR_ENDTIME
-    };
+    getWorkspaceFile("output").mkdirs();
+    getWorkspaceFile("logs").mkdirs();
 
-    // optional parameter
-    String[] optParams = {
-        "ACAdaptation",
-        "BetaW",
-        "Beta_min",
-        "Beta_rsd",
-        "FCAdaptation",
-        "Ksink",
-        "LExCoef",
-        "N_delay_RG1",
-        "N_delay_RG2",
-        "a_rain",
-        "a_snow",
-        "angstrom_a",
-        "angstrom_b",
-        "baseTemp",
-        "calib_clat_fact",
-        "ccf_factor",
-        "defaultCO2",
-        "denitfac",
-        "delayNitrification",
-        "denitrificationRateCoefficient",
-        "denitrificationSoilSaturationThreshold",
-        "depdr",
-        "deposition_factor",
-        "drrad",
-        "drspac",
-        "f1",
-        "f12",
-        "f13",
-        "f14",
-        "f15",
-        "f16",
-        "f17",
-        "f18",
-        "f19",
-        "f2",
-        "f3",
-        "f4",
-        "f5",
-        "f6",
-        "f7",
-        "f8",
-        "flowRouteTA",
-        "fmt_date",
-        "fmt_double",
-        "g_factor",
-        "geoMaxPerc",
-        "gwCapRise",
-        "gwRG1Fact",
-        "gwRG1RG2dist",
-        "gwRG2Fact",
-        "halflife_RG1",
-        "halflife_RG2",
-        "infil_conc_factor",
-        "initLPS",
-        "initMPS",
-        "initN_concRG1",
-        "initN_concRG2",
-        "initRG1",
-        "initRG2",
-        "kdiff_layer",
-        "kf_calib",
-        "lagSurfaceRunoff",
-        "lagInterflow",
-        "locGrw",
-        "longTZ",
-        "nitri_delay",
-        "nitrificationSoilTemperatureThreshold",
-        "nitrificationSurfaceTemperatureThreshold",
-        "opti",
-        "piadin",
-        "r_factor",
-        "rootfactor",
-        "sceno",
-        "skipRegression",
-        "snowCritDens",
-        "snowDensConst",
-        "snowFactorA",
-        "snowFactorB",
-        "snowFactorC",
-        "snow_trans",
-        "snow_trs",
-        "soilDiffMPSLPS",
-        "soilDistMPSLPS",
-        "soilImpGT80",
-        "soilImpLT80",
-        "soilLatVertLPS",
-        "soilLinRed",
-        "soilMaxDPS",
-        "soilMaxInfSnow",
-        "soilMaxInfSummer",
-        "soilMaxInfWinter",
-        "soilMaxPerc",
-        "soilOutLPS",
-        "soilPolRed",
-        "t_factor",
-        "tempRes",
-        "temp_lag"
-    };
+    Utils.runAges(d, getWorkspaceDir(), parameter(), resources(), LOG);
 
-    // simulation flags
-    String[] flags = {
-        "flagParallel",
-        "flagRegionalization",
-        "flagHRURouting",
-        "flagReachRouting",
-        "flagSort",
-        "flagSplit",
-        "flagInfiltration",
-        "flagTillage",
-        "flagTileDrain",
-        "flagUPGM",
-        "parallelismFactor",
-        "parallelismThreads",
-        "flagSaveState",
-        "flagLoadState",
-        "flagWB"
-    };
+    for (String ofName : getRequestedObjfunc(OF.keySet())) {
+      String[] data = parameter().getStringArray(ofName);
+      double v = calc_of(OF.get(ofName), data[0], data[1], start, end);
+      results().put(ofName, v);
+    }
+//  results().put(getWorkspaceFile("output"));
+  }
 
-    @Override
-    public void doProcess() throws Exception {
-        String dsl = parameter().getString(KEY_SCRIPT,
-                resources().getFile(KEY_SCRIPT).toString());
 
-        // pass request param to model runtime parameter -> run.inc
-        Map<String, String> agesParam = new LinkedHashMap<>();
-        Utils.passReqQuotedParam(agesParam, parameter(), reqParams);
+  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;
+  }
 
-        // scalar parameter
-        Utils.passOptParam(agesParam, parameter(), optParams);
 
-        // optional flags
-        Utils.passOptQuotedParam(agesParam, parameter(), flags);
-
-        // create parameter include file
-        Utils.createParamInclude(agesParam, getWorkspaceFile(RUN_INC));
-
-        String start = parameter().getString(PAR_STARTTIME);
-        String end = parameter().getString(PAR_ENDTIME);
-
-        File d = new File(dsl);
-        if (!(d.isAbsolute() && d.exists())) {
-            d = getWorkspaceFile(dsl);
-        }
-
-        getWorkspaceFile("output").mkdirs();
-        getWorkspaceFile("logs").mkdirs();
-
-        Utils.runAges(d, getWorkspaceDir(), parameter(), resources(), LOG);
-
-        for (String ofName : getRequestedObjfunc(OF.keySet())) {
-            String[] data = parameter().getStringArray(ofName);
-            double v = calc_of(OF.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));
-    }
+  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));
+  }
 
 }

src/java/oms/utils/Utils.java

@@ -33,251 +33,324 @@
  */
 public class Utils {
 
-    // parameter keys
-    public static final String KEY_LOGLEVEL = "loglevel";
-    public static final String KEY_OPTIONS = "java.options";
+  // parameter keys
+  public static final String KEY_LOGLEVEL = "loglevel";
+  public static final String KEY_OPTIONS = "java.options";
 
-    public static final String ID_AGES_JAR = "ages.jar";
+  public static final String ID_AGES_JAR = "ages.jar";
 
-    /**
-     *
-     */
-    public static class PBIAS implements ObjectiveFunction {
+  /**
+   *
+   */
+  public static class PBIAS implements ObjectiveFunction {
 
-        @Override
-        public double calculate(double[] obs, double[] sim, double missing) {
-            if (sim.length != obs.length) {
-                throw new IllegalArgumentException("obs/sim length differ: " + obs.length + "!=" + sim.length);
-            }
-            double diffsum = 0;
-            double obssum = 0;
-            for (int i = 0; i < sim.length; i++) {
-                if (obs[i] > missing) {
-                    diffsum += sim[i] - obs[i];
-                    obssum += obs[i];
-                }
-            }
-            return (diffsum / obssum) * 100.0;
+    @Override
+    public double calculate(double[] obs, double[] sim, double missing) {
+      if (sim.length != obs.length) {
+        throw new IllegalArgumentException("obs/sim length differ: " + obs.length + "!=" + sim.length);
+      }
+      double diffsum = 0;
+      double obssum = 0;
+      for (int i = 0; i < sim.length; i++) {
+        if (obs[i] > missing) {
+          diffsum += sim[i] - obs[i];
+          obssum += obs[i];
         }
-
-        @Override
-        public boolean positiveDirection() {
-            return false;
-        }
+      }
+      return (diffsum / obssum) * 100.0;
     }
 
-    public static class NS2LOG implements ObjectiveFunction {
 
-        @Override
-        public double calculate(double[] obs, double[] sim, double missing) {
-            int pre_size = sim.length;
-            int val_size = obs.length;
-            int steps = 0;
-            double sum_log_pd = 0;
-            double sum_log_vd = 0;
+    @Override
+    public boolean positiveDirection() {
+      return false;
+    }
+  }
 
-            /**
-             * checking if both data arrays have the same number of elements
-             */
-            if (pre_size != val_size) {
-                return missing;
-            } else {
-                steps = pre_size;
-            }
+  /**
+   *
+   */
+  public static class NSLOG implements ObjectiveFunction {
 
-            /**
-             * calculating logarithmic values of both data sets. Sets 0 if data
-             * is 0
-             */
-            double[] log_preData = new double[pre_size];
-            double[] log_valData = new double[val_size];
+    @Override
+    public double calculate(double[] obs, double[] sim, double missing) {
+      int pre_size = sim.length;
+      int val_size = obs.length;
+      int steps = 0;
+      double sum_log_pd = 0;
+      double sum_log_vd = 0;
 
-            for (int i = 0; i < steps; i++) {
-                if (sim[i] >= 0 && obs[i] >= 0) {
-                    
-                    if (sim[i] == 0) {
-                        log_preData[i] = 0;
-                    } else {
-                        log_preData[i] = Math.log(sim[i]);
-                    }
+      /**
+       * checking if both data arrays have the same number of elements
+       */
+      if (pre_size != val_size) {
+        return missing;
+      } else {
+        steps = pre_size;
+      }
 
-                    if (obs[i] == 0) {
-                        log_valData[i] = 0;
-                    } else {
-                        log_valData[i] = Math.log(obs[i]);
-                    }
-                }
-            }
+      /**
+       * calculating logarithmic values of both data sets. Sets 0 if data is 0
+       */
+      double[] log_preData = new double[pre_size];
+      double[] log_valData = new double[val_size];
 
-            /**
-             * summing up both data sets
-             */
-            for (int i = 0; i < log_valData.length; i++) {
-                sum_log_pd += log_preData[i];
-                sum_log_vd += log_valData[i];
-            }
+      for (int i = 0; i < steps; i++) {
+        if (sim[i] >= 0 && obs[i] >= 0) {
 
-            /**
-             * calculating mean values for both data sets
-             */
-            double mean_log_pd = sum_log_pd / log_valData.length;
-            double mean_log_vd = sum_log_vd / log_valData.length;
+          if (sim[i] == 0) {
+            log_preData[i] = 0;
+          } else {
+            log_preData[i] = Math.log(sim[i]);
+          }
 
-            /**
-             * calculating mean pow deviations
-             */
-            double pd_log_vd = 0;
-            double vd_log_mean = 0;
-            for (int i = 0; i < log_valData.length; i++) {
-                pd_log_vd   = pd_log_vd + (Math.pow(Math.abs(log_valData[i] - log_preData[i]), 2));
-                vd_log_mean = vd_log_mean + (Math.pow(Math.abs(log_valData[i] - mean_log_vd), 2));
-            }
+          if (obs[i] == 0) {
+            log_valData[i] = 0;
+          } else {
+            log_valData[i] = Math.log(obs[i]);
+          }
+        }
+      }
 
-            /**
-             * calculating efficiency after Nash & Sutcliffe (1970)
-             */
-            double log_efficiency = 1 - (pd_log_vd / vd_log_mean);
-            return log_efficiency;
-        }
+      /**
+       * summing up both data sets
+       */
+      for (int i = 0; i < log_valData.length; i++) {
+        sum_log_pd += log_preData[i];
+        sum_log_vd += log_valData[i];
+      }
 
-        @Override
-        public boolean positiveDirection() { // ???
-            return false;
-        }
+      /**
+       * calculating mean values for both data sets
+       */
+      double mean_log_pd = sum_log_pd / log_valData.length;
+      double mean_log_vd = sum_log_vd / log_valData.length;
+
+      /**
+       * calculating mean pow deviations
+       */
+      double pd_log_vd = 0;
+      double vd_log_mean = 0;
+      for (int i = 0; i < log_valData.length; i++) {
+        pd_log_vd = pd_log_vd + (Math.pow(Math.abs(log_valData[i] - log_preData[i]), 2));
+        vd_log_mean = vd_log_mean + (Math.pow(Math.abs(log_valData[i] - mean_log_vd), 2));
+      }
+
+      /**
+       * calculating efficiency after Nash & Sutcliffe (1970)
+       */
+      double log_efficiency = 1 - (pd_log_vd / vd_log_mean);
+      return log_efficiency;
     }
 
-    /**
-     * create a 'sim' include file for the run part.
-     */
-    public static void createParamInclude(Map<String, String> p,
-            File file) throws IOException {
-        StringBuilder b = new StringBuilder();
-        b.append("parameter {\n");
-        p.keySet().forEach((name) -> {
-            b.append("  ").append(name).append(" ").append(p.get(name)).append("\n");
-        });
-        b.append("}\n");
-        FileUtils.writeStringToFile(file, b.toString());
+
+    @Override
+    public boolean positiveDirection() {
+      return true;
+    }
+  }
+
+  /**
+   *
+   */
+  public static class NSLOG1P implements ObjectiveFunction {
+
+    @Override
+    public double calculate(double[] obs, double[] sim, double missing) {
+      if (sim.length != obs.length) {
+        throw new IllegalArgumentException("obs/sim length differ: " + obs.length + "!=" + sim.length);
+      }
+
+      /**
+       * calculating logarithmic values of both data sets. Sets 0 if data is 0
+       */
+      double[] log_sim = new double[sim.length];
+      double[] log_obs = new double[sim.length];
+
+      int valid = 0;
+      double sum_log_obs = 0.0;
+
+      for (int i = 0; i < sim.length; i++) {
+        //either prediction or validation shows a negative value. 
+        //in this case the pair is excluded from the further calculation,
+        //simply by setting the values to -1 and not increasing valid pairs
+        // this will also handle missing values
+        if (sim[i] < 0.0 || obs[i] < 0.0) {
+          log_sim[i] = -1;
+          log_obs[i] = -1;
+          continue;
+        }
+        //both prediction and validation are equal or greater than zero
+        //no problem for the calculation
+        log_sim[i] = Math.log1p(sim[i]);
+        log_obs[i] = Math.log1p(obs[i]);
+
+        // summing up 
+        sum_log_obs += log_obs[i];
+        valid++;
+      }
+
+      // calculating mean 
+      double mean_log_obs = sum_log_obs / valid;
+
+      // calculating mean pow deviations
+      double sum1 = 0.0;
+      double sum_mean = 0.0;
+      for (int i = 0; i < sim.length; i++) {
+        if (log_sim[i] >= 0) {
+          sum1 += Math.pow(Math.abs(log_obs[i] - log_sim[i]), 2);
+          sum_mean += Math.pow(Math.abs(log_obs[i] - mean_log_obs), 2);
+        }
+      }
+      return 1 - (sum1 / sum_mean);
     }
 
-    /**
-     * pass a required parameter, quoted (string).
-     */
-    public static void passReqQuotedParam(Map<String, String> p,
-            PayloadParameter param, String... names) throws ServiceException {
-        for (String name : names) {
-            p.put(name, "\"" + param.getString(name) + "\"");
-        }
+
+    @Override
+    public boolean positiveDirection() {
+      return true;
+    }
+  }
+
+
+  /**
+   * create a 'sim' include file for the run part.
+   */
+  public static void createParamInclude(Map<String, String> p,
+      File file) throws IOException {
+    StringBuilder b = new StringBuilder();
+    b.append("parameter {\n");
+    p.keySet().forEach((name) -> {
+      b.append("  ").append(name).append(" ").append(p.get(name)).append("\n");
+    });
+    b.append("}\n");
+    FileUtils.writeStringToFile(file, b.toString());
+  }
+
+
+  /**
+   * pass a required parameter, quoted (string).
+   */
+  public static void passReqQuotedParam(Map<String, String> p,
+      PayloadParameter param, String... names) throws ServiceException {
+    for (String name : names) {
+      p.put(name, "\"" + param.getString(name) + "\"");
+    }
+  }
+
+
+  /**
+   * pass optional parameter, no quotes.
+   */
+  public static void passOptParam(Map<String, String> p,
+      PayloadParameter param, String... names) throws ServiceException {
+    for (String name : names) {
+      if (param.has(name)) {
+        p.put(name, param.getString(name));
+      }
+    }
+  }
+
+
+  public static void passOptQuotedParam(Map<String, String> p,
+      PayloadParameter param, String... names) throws ServiceException {
+    for (String name : names) {
+      if (param.has(name)) {
+        p.put(name, "\"" + param.getString(name) + "\"");
+      }
+    }
+  }
+
+
+  /**
+   * Run Ages
+   *
+   * @param dsl
+   * @param options
+   * @throws Exception
+   */
+  public static void runAges(File dsl, File ws, PayloadParameter param,
+      ServiceResources res, SessionLogger LOG) throws Exception {
+
+    // Create/execute a Ages.
+    Executable p = createProcess(dsl, ws, param, res, LOG);
+    int result = p.exec();
+    if (result != 0) {
+      FilenameFilter ff = new WildcardFileFilter("java*stderr.txt", IOCase.INSENSITIVE);
+      File[] f = ws.listFiles(ff);
+      if (f != null && f.length > 0) {
+        String err = FileUtils.readFileToString(f[0]);
+        LOG.info("Ages execution error. " + f[0] + ":\n" + err);
+        throw new ServiceException("Ages execution error. " + f[0] + ":\n" + err);
+      }
+      throw new ServiceException("Ages execution error." + result);
+    }
+  }
+
+
+  /**
+   * Create the external Ages process.
+   */
+  public static Executable createProcess(File dsl, File ws,
+      PayloadParameter param, ServiceResources res, SessionLogger LOG) throws Exception {
+
+    Map<String, String> sysprops = new HashMap();
+    sysprops.put("oms_prj", ws.toString());
+    sysprops.put("csip_ages", res.getFile(ID_AGES_JAR).getParent());
+
+    String[] jvmOptions = Binaries.asSysProps(sysprops);
+    String options = param.getString(KEY_OPTIONS, "");
+    if (options != null && !options.isEmpty()) {
+      jvmOptions = (String[]) ArrayUtils.addAll(jvmOptions, options.split("\\s+"));
     }
 
-    /**
-     * pass optional parameter, no quotes.
-     */
-    public static void passOptParam(Map<String, String> p,
-            PayloadParameter param, String... names) throws ServiceException {
-        for (String name : names) {
-            if (param.has(name)) {
-                p.put(name, param.getString(name));
-            }
-        }
+    // java -Doms_prj=. -cp "dist/AgES.jar" oms3.CLI -l OFF -r "projects/sfir30/simulation/sfir30.sim"
+    return Binaries.getResourceOMSDSL(
+        dsl, // the dsl file to run
+        jvmOptions, // jvm options
+        ws, // workspace dir
+        Arrays.asList(res.getFile(ID_AGES_JAR)), // the ages jar file 
+        param.getString(KEY_LOGLEVEL, "INFO"), // The log level
+        LOG); // This session logger
+  }
+
+  private static final int FILE = 0;
+  private static final int TABLE = 1;
+  private static final int COLUMN = 2;
+
+
+  /**
+   *
+   * @param d
+   * @param workspace
+   * @param start
+   * @param end
+   * @return
+   * @throws IOException
+   */
+  public static double[] getData(String d, File workspace,
+      String start, String end) throws IOException {
+    if (d == null) {
+      throw new IllegalArgumentException("Missing data property: " + d);
+    }
+    String[] parts = DataIO.parseCsvFilename(d);
+    if (parts.length != 3) {
+      throw new IllegalArgumentException("invalid: " + d + " expected:: <file>/<table>/<column>");
     }
 
-    public static void passOptQuotedParam(Map<String, String> p,
-            PayloadParameter param, String... names) throws ServiceException {
-        for (String name : names) {
-            if (param.has(name)) {
-                p.put(name, "\"" + param.getString(name) + "\"");
-            }
-        }
-    }
+//    System.out.println(Arrays.toString(parts));
+    CSTable t = DataIO.table(new File(workspace, parts[FILE]), parts[TABLE]);
 
-    /**
-     * Run Ages
-     *
-     * @param dsl
-     * @param options
-     * @throws Exception
-     */
-    public static void runAges(File dsl, File ws, PayloadParameter param,
-            ServiceResources res, SessionLogger LOG) throws Exception {
-
-        // Create/execute a Ages.
-        Executable p = createProcess(dsl, ws, param, res, LOG);
-        int result = p.exec();
-        if (result != 0) {
-            FilenameFilter ff = new WildcardFileFilter("java*stderr.txt", IOCase.INSENSITIVE);
-            File[] f = ws.listFiles(ff);
-            if (f != null && f.length > 0) {
-                String err = FileUtils.readFileToString(f[0]);
-                LOG.info("Ages execution error. " + f[0] + ":\n" + err);
-                throw new ServiceException("Ages execution error. " + f[0] + ":\n" + err);
-            }
-            throw new ServiceException("Ages execution error." + result);
-        }
-    }
-
-    /**
-     * Create the external Ages process.
-     */
-    public static Executable createProcess(File dsl, File ws,
-            PayloadParameter param, ServiceResources res, SessionLogger LOG) throws Exception {
-
-        Map<String, String> sysprops = new HashMap();
-        sysprops.put("oms_prj", ws.toString());
-        sysprops.put("csip_ages", res.getFile(ID_AGES_JAR).getParent());
-
-        String[] jvmOptions = Binaries.asSysProps(sysprops);
-        String options = param.getString(KEY_OPTIONS, "");
-        if (options != null && !options.isEmpty()) {
-            jvmOptions = (String[]) ArrayUtils.addAll(jvmOptions, options.split("\\s+"));
-        }
-
-        // java -Doms_prj=. -cp "dist/AgES.jar" oms3.CLI -l OFF -r "projects/sfir30/simulation/sfir30.sim"
-        return Binaries.getResourceOMSDSL(
-                dsl, // the dsl file to run
-                jvmOptions, // jvm options
-                ws, // workspace dir
-                Arrays.asList(res.getFile(ID_AGES_JAR)), // the ages jar file 
-                param.getString(KEY_LOGLEVEL, "INFO"), // The log level
-                LOG); // This session logger
-    }
-
-    private static final int FILE = 0;
-    private static final int TABLE = 1;
-    private static final int COLUMN = 2;
-
-    /**
-     *
-     * @param d
-     * @param workspace
-     * @param start
-     * @param end
-     * @return
-     * @throws IOException
-     */
-    public static double[] getData(String d, File workspace,
-            String start, String end) throws IOException {
-        if (d == null) {
-            throw new IllegalArgumentException("Missing data property: " + d);
-        }
-        String[] parts = DataIO.parseCsvFilename(d);
-        if (parts.length != 3) {
-            throw new IllegalArgumentException("invalid: " + d + " expected:: <file>/<table>/<column>");
-        }
-
-//    System.out.println(Arrays.toString(parts));
-        CSTable t = DataIO.table(new File(workspace, parts[FILE]), parts[TABLE]);
-
-        Date startDate = Conversions.convert(start, Date.class);
-        Date endDate = Conversions.convert(end, Date.class);
+    Date startDate = Conversions.convert(start, Date.class);
+    Date endDate = Conversions.convert(end, Date.class);
 
 //    System.out.println(startDate);
 //    System.out.println(endDate);
-        double[] vals = DataIO.getColumnDoubleValuesInterval(startDate, endDate, t,
-                parts[COLUMN], DataIO.DAILY);
+    double[] vals = DataIO.getColumnDoubleValuesInterval(startDate, endDate, t,
+        parts[COLUMN], DataIO.DAILY);
 
-        return vals;
-    }
+    return vals;
+  }
 
 //  static void d() throws IOException {
 //    CSProperties pr = DataIO.properties(new File("/od/projects/csip-all/csip-oms/tmp/data/main_params.csv"), "Parameter");
@@ -287,11 +360,12 @@
 //      System.out.println("\"" + string + "\",");
 //    }
 //  }
-    public static void main(String[] args) throws IOException {
-        // small test
-        double[] d = getData("obs_data02_14.csv/obs/orun[1]", new File("/tmp"), "2002-01-18", "2002-02-18");
-        System.out.println(Arrays.toString(d));
+
+  public static void main(String[] args) throws IOException {
+    // small test
+    double[] d = getData("obs_data02_14.csv/obs/orun[1]", new File("/tmp"), "2002-01-18", "2002-02-18");
+    System.out.println(Arrays.toString(d));
 //    d();
-    }
+  }
 
 }