Displaying differences for changeset
 
display as  

src/java/org/rti/rivertrak/V1_0.java

@@ -20,12 +20,15 @@
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
 import java.util.logging.Level;
 import javax.ws.rs.Path;
 import org.apache.commons.io.FileUtils;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
+import org.codehaus.jettison.json.JSONObject;
 import static org.rti.rivertrak.V1_0.*;
 
 /**
@@ -41,8 +44,9 @@
 @Category("Hydrology")
 @Category("Flood forecasting")
 
-@Path("m/rivertrak/1.0")
+@Path("m/rivertrak/3.2")
 @Resource(file = "/bin/OpTableAppLight.exe", id = RIVERTRAK, wine = true, type = EXECUTABLE)
+@Resource(file = "/bin/OpTableAppLight_Mar2019.exe", id = RIVERTRAK_MAR19, wine = true, type = EXECUTABLE)
 @Resource(file = "/config/RiverTrak_Dimensions.csv", id = CONFIG_DIM)
 @Resource(file = "/config/RiverTrak_Units.csv", id = CONFIG_UNITS)
 @Resource(file = "/config/RiverTrak_DataTypes.csv", id = CONFIG_DATATYPES)
@@ -53,6 +57,8 @@
   static VelocityEngine velocity = new VelocityEngine();
 
   public static final String RIVERTRAK = "rivertrak";
+  public static final String RIVERTRAK_MAR19 = "rivertrak_Mar19";
+
   public static final String RIVERTRAK_CFG = "rivertrak.cfg";
   public static final String CONFIG_DIM = "dim";
   public static final String CONFIG_UNITS = "units";
@@ -70,7 +76,24 @@
   int statusLevel;
   int warningLevel;
   int refreshCount;
-  String opTable;
+  String opTable = "Models.optable";
+
+  private static class KeyIterable implements Iterable<String> {
+
+    JSONObject json;
+
+
+    KeyIterable(JSONObject json) {
+      this.json = json;
+    }
+
+
+    @Override
+    public Iterator<String> iterator() {
+      return json.keys();
+    }
+
+  }
 
 
   @Override
@@ -82,11 +105,59 @@
     statusLevel = parameter().getInt("StatusLevel", 1);
     warningLevel = parameter().getInt("WarningLevel", 1);
     refreshCount = parameter().getInt("RefreshCount", 10);
-    opTable = parameter().getString("OpTable");
 
     getWorkspaceFile("States").mkdirs();
 
-    Executable rt = resources().getExe(RIVERTRAK);
+    if (!formdata().hasKey("ts_input")) {
+      throw new ServiceException("missing attachement ts_input");
+    }
+
+    if (!getWorkspaceFile("TimeSeries").exists()) {
+      throw new ServiceException("No Time series data.");
+    }
+
+    File modelFolder = getWorkspaceFile("Models");
+    if (!modelFolder.exists()) {
+      modelFolder.mkdirs();
+    }
+
+    parameter().require("OpTable");
+
+    try {
+      // assume an embedded JSONObject for optable
+      JSONObject j = parameter().getJSON("OpTable");
+      for (String modelName : new KeyIterable(j)) {
+
+        // append to opTable
+        FileUtils.write(new File(modelFolder, opTable), modelName + "\n", true);
+
+        try (PrintWriter w = new PrintWriter(new File(modelFolder, modelName))) {
+          JSONObject modelDefs = j.getJSONObject(modelName);
+          for (String section : new KeyIterable(modelDefs)) {
+            w.println("#" + section);
+            JSONObject kv = modelDefs.getJSONObject(section);
+            for (String key : new KeyIterable(kv)) {
+              w.println(key + "=" + kv.get(key).toString());
+            }
+          }
+        }
+      }
+    } catch (ServiceException E) {
+      // carry on
+      opTable = parameter().getString("OpTable");
+    }
+
+    File opTableFile = new File(modelFolder, opTable);
+    if (!opTableFile.exists()) {
+      throw new ServiceException("Optable file not found: " + opTable.toString());
+    }
+
+    String modelName = RIVERTRAK;
+    if (metainfo().hasName("model_name")) {
+      modelName = metainfo().getString("model_name");
+    }
+
+    Executable rt = resources().getExe(modelName);
     rt.addArguments("-Config", createConfig(),
         "-RunStartDate", parameter().getString("RunStartDate"),
         "-RunEndDate", parameter().getString("RunEndDate"),

src/java/org/rti/rivertrak/V1_0.json

@@ -1,26 +1,199 @@
 {
- "metainfo": {
- },
- "parameter": [
-  {
-   "name": "RunStartDate",
-   "value": "2015-11-01:00:00",
-   "description" : "Execution start date"
+  "metainfo": {
   },
-  {
-   "name": "RunEndDate",
-   "value": "2015-11-05:00:00",
-   "description" : "Execution end date"
-  },
-  {
-   "name": "StatesWriteMode",
-   "value": "WRITE",
-   "description" : "States Write Model (WRITE | ...)"
-  },
-  {
-   "name": "OpTable",
-   "value": "Test.optable",
-   "description" : "The name of the optable file within the Models folder."
-  }
- ]
+  "parameter": [
+    {
+      "name": "RunStartDate",
+      "value": "2015-11-01:00:00",
+      "description": "Execution start date"
+    },
+    {
+      "name": "RunEndDate",
+      "value": "2015-11-05:00:00",
+      "description": "Execution end date"
+    },
+    {
+      "name": "StatesWriteMode",
+      "value": "WRITE",
+      "description": "States Write Model (WRITE | ...)"
+    },
+    {
+      "name": "OpTable1",
+      "value": "Test.optable",
+      "description": "The name of the optable file within the Models folder."
+    },
+    {
+      "name": "OpTable",
+      "description": "The optable with models and parameter, tha value can also be a file name of an existing model in the models folder.",
+      "value": {
+
+        "Mascoma.MAP.ReadDateValue": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.MAP.1HOUR",
+            "OutTS": "MCAN3.NHDES.MAP.1HOUR"
+          }
+        },
+
+        "Mascoma.MAT.ReadDateValue": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.MAT.1HOUR",
+            "OutTS": "MCAN3.NHDES.MAT.1HOUR"
+          }
+        },
+
+        "MCAN3.Basin.SnowPack": {
+          "IO": {
+            "InTSMAP": "MCAN3.NHDES.MAP.1HOUR",
+            "InTSMAT": "MCAN3.NHDES.MAT.1HOUR",
+            "InTSOBSSWE": "",
+            "OutTSRAIM": "MCAN3.NHDES.RAIM.1HOUR",
+            "OutTSSWE": "MCAN3.NHDES.SWE.1HOUR",
+            "OutTSSASC": "MCAN3.NHDES.SASC.1HOUR",
+            "RAIM_OUTPUT_UNITS": "IN",
+            "SWE_OUTPUT_UNITS": "IN"
+          },
+          "Parameters": {
+            "ADC": "[0.10, 0.19, 0.33, 0.41, 0.46, 0.49, 0.52, 0.58, 0.71]",
+            "PXADJ": 1.0,
+            "ELEV": 332.582,
+            "SCF": 1.0,
+            "MFMAX": 0.60,
+            "MFMIN": 0.20,
+            "UADJ": 0.12,
+            "SI": 145,
+            "NMF": 0.10,
+            "TIPM": 0.5,
+            "MBASE": 1.0,
+            "PXTEMP": 0.0,
+            "PLWHC": 0.1,
+            "DAYGM": 0.0,
+            "ALAT": 40.0,
+            "TALMAX": 0.0,
+            "TALMIN": 0.0
+          },
+          "Default States": {
+            "ACCMAX": 0,
+            "AEADJ": 0,
+            "AESC": 0,
+            "EXLAG": "0, 0, 0, 0, 0, 0, 0",
+            "LIQW": 0,
+            "NEGHS": 0.0,
+            "SB": 0,
+            "SBAESC": 0,
+            "SBWS": 0,
+            "STORGE": 0,
+            "TINDEX": 0,
+            "WE": 0,
+            "SNOWFALL_LAST_HOUR": 0,
+            "RAIN_LAST_HOUR": 0
+          }
+        },
+
+        "MCAN3.Basin.SSSacramentoSMA": {
+          "IO": {
+            "PrecipTS": "MCAN3.NHDES.RAIM.1HOUR",
+            "AESCTS": "",
+            "ObsTS": "",
+            "PETTS": "",
+            "OutTS": "MCAN3.NHDES.SQME-DUMMY.1HOUR",
+            "OUTPUT_UNITS": "CFS",
+            "TCITS": "MCAN3.NHDES.TCI.1HOUR"
+          },
+          "Filter and Control Parameters": {
+            "SAVE_STATES": "FALSE",
+            "NUM_PARAM": 0,
+            "FILTER_FLAG": 0
+          },
+          "Parameters": {
+            "PXADJ": 1.0,
+            "ET_ADJ_FACTOR": 0.90,
+            "UZTWM": 25.0,
+            "UZFWM": 86.0,
+            "UZK": 0.3,
+            "PCTIM": 0.005,
+            "ADIMP": 0.0,
+            "RIVA": 0.06,
+            "DIURNAL_ET": 0,
+            "ZPERC": 180.0,
+            "REXP": 2.6,
+            "LZTWM": 70.0,
+            "LZFSM": 50.0,
+            "LZFPM": 87.0,
+            "LZSK": 0.08,
+            "LZPK": 0.008,
+            "PFREE": 0.15,
+            "RSERV": 0.3,
+            "SIDE": 0.0,
+            "ET_FLAG": "\"EVAPORATION\"",
+            "ET_DEMAND": "\"0.1 0.1 0.3 1.0 3.9 5.2 5.8 4.8 2.3 1.0 0.2 0.1\"",
+            "ET_ADJ": "\"0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90 0.90\"",
+            "DRAINAGE_AREA": 118.25,
+            "EFC": 0.63,
+            "COEF_VAR_STREAMFLOW": 0.2,
+            "COEF_VAR_PRECIP": 0.6,
+            "UZTW_RES_EXP": 20,
+            "UZFW_RES_EXP": 20,
+            "LZTW_RES_EXP": 20,
+            "NUM_UH_STATES": 0,
+            "STATE_TRANS_MAT": "\".0 .0 .0 .0 .0 .0 .0  .0 .0 .0 .0 .0 .0 .0  .0 .0 .0 .0 .0 .0 .0  .0 .0 .0 .0 .0 .0 .0  .0 .0 .0 .0 .0 .0 .0  .0 .0 .0 .0 .0 .0 .0  .0 .0 .0 .0 .0 .0 .0\"",
+            "MEAS_MAT": "\".0 .0 .0 .0 .0 .0 .0\"",
+            "SYSTEM_NOISE_COV_MAT": "\".05 .0 .0 .0 .0 .0 .0  .0 .16 .0 .0 .0 .0 .0  .0 .0 2.34 .0 .0 .0 .0  .0 .0 .0 1.04 .0 .0 .0 .0 .0 .0 .0 .04 .0 .0  .0 .0 .0 .0 .0  2.34 .0  .0 .0 .0 .0 .0 .0 1.0\""
+          },
+          "Default States": {
+            "UZTWC": 50,
+            "UZFWC": 50,
+            "LZTWC": 50,
+            "LZFPC": 50,
+            "LZFSC": 50,
+            "ADIMC": 0,
+            "TCI": 0,
+            "UH_STATES": "\"0 0 0\""
+          }
+        },
+
+        "MCAN3.Basin.UnitHydrograph": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.TCI.1HOUR",
+            "OutTS": "MCAN3.NHDES.SQME-LOCAL.1HOUR"
+          },
+          "Parameters": {
+            "ORDINATE_INTERVAL": "1HOUR",
+            "ORDINATE_UNITS": "CFS/MM",
+            "ORDINATES": "0.2, 303.9, 1626.8, 1946.8, 796.6, 184.3, 40.8, 9.0, 2.0, 0.1"
+          },
+          "Default States": {
+            "UHSTORAGE": "1, 0.1, 2, 0.2, 3, 0.3, 4, 0.4, 5, 0.5, 6, 0.6, 7, 0.7, 8, 0.8, 9, 0.9, 10, 1.0"
+          }
+        },
+
+        "Mascoma.TCI.WriteDateValue": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.TCI.1HOUR",
+            "OutTS": "MCAN3.NHDES.TCI.1HOUR"
+          }
+        },
+
+        "Mascoma.SQME-LOCAL.WriteDateValue": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.SQME-LOCAL.1HOUR",
+            "OutTS": "MCAN3.NHDES.SQME-LOCAL.1HOUR"
+          }
+        },
+
+        "Mascoma.RAIM.WriteDateValue": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.RAIM.1HOUR",
+            "OutTS": "MCAN3.NHDES.RAIM.1HOUR"
+          }
+        },
+
+        "Mascoma.SWE.WriteDateValue": {
+          "IO": {
+            "InTS": "MCAN3.NHDES.SWE.1HOUR",
+            "OutTS": "MCAN3.NHDES.SWE.1HOUR"
+          }
+        }
+      }
+    }
+  ]
 }
\ No newline at end of file