@@ -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"), |
@@ -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 |