V1_0.java [src/java/m/oms/ages] Revision: 5106f5176352222ea4542c86bcd117dad5b1d4e9  Date: Fri Jul 28 10:09:15 MDT 2023
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package m.oms.ages;

import csip.Config;
import csip.ModelDataService;
import csip.annotations.*;
import static csip.annotations.ResourceType.*;
import csip.cosu.ObjFunc;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.ws.rs.Path;
import static m.oms.ages.V1_0.*;
import oms.utils.Utils;

/**
 * Ages service.
 *
 * @author od
 */
@Name("AGES model execution")
@Description("OMS based AGES model service")
@VersionInfo("1.0")
@Path("m/ages/1.0.0")
@Polling(first = 5000, next = 4500)
@Resource(file = "/bin/ages_1_0/ages.jar", type = JAR, id = Utils.ID_AGES_JAR)
@Resource(file = "/bin/ages_1_0/ages-lib.zip", type = ARCHIVE)
@Resource(file = "/bin/ages_1_0/ages-static.zip", type = ARCHIVE)
@Resource(file = "java-*-std*.txt output/csip_run/out/*.csv", type = OUTPUT)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages.sim", type = REFERENCE, id = KEY_SCRIPT)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPL.sim", type = REFERENCE, id = KEY_SCRIPT_NP)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR3.sim", type = REFERENCE, id = KEY_SCRIPT_NP3)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR30.sim", type = REFERENCE, id = KEY_SCRIPT_NP30)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR300.sim", type = REFERENCE, id = KEY_SCRIPT_NP300)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLSFIR3000.sim", type = REFERENCE, id = KEY_SCRIPT_NP3000)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLBDCW.sim", type = REFERENCE, id = KEY_SCRIPT_NPBDCW)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLEAGLE.sim", type = REFERENCE, id = KEY_SCRIPT_NPEAGLE)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE58.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE58)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE51.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE51)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27s1.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27s1)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27s4.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27s4)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE27s5.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE27s5)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE58s1.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE58s1)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLDRAKE58s5.sim", type = REFERENCE, id = KEY_SCRIPT_NPDRAKE58s5)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLGOODWATER.sim", type = REFERENCE, id = KEY_SCRIPT_NPGOODWATER)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLFM_GR.sim", type = REFERENCE, id = KEY_SCRIPT_NPFM_GR)
@Resource(file = "${csip.dir}/bin/ages_1_0/simulation/ages_noPLFM_ST.sim", type = REFERENCE, id = KEY_SCRIPT_NPFM_ST)
public class V1_0 extends ModelDataService {

    public static final String KEY_SCRIPT = "ages.sim";
    public static final String KEY_SCRIPT_NP = "ages_noPL.sim"; // no payload script
    public static final String KEY_SCRIPT_NP3 = "ages_noPLSFIR3.sim"; // no payload script
    public static final String KEY_SCRIPT_NP30 = "ages_noPLSFIR30.sim"; // no payload script
    public static final String KEY_SCRIPT_NP300 = "ages_noPLSFIR300.sim"; // no payload script
    public static final String KEY_SCRIPT_NP3000 = "ages_noPLSFIR3000.sim"; // no payload script
    public static final String KEY_SCRIPT_NPBDCW = "ages_noPLBDCW.sim"; // no payload script
    public static final String KEY_SCRIPT_NPEAGLE = "ages_noPLEAGLE.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE58 = "ages_noPLDRAKE58.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE51 = "ages_noPLDRAKE51.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE27 = "ages_noPLDRAKE27.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE27s1 = "ages_noPLDRAKE27s1.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE27s4 = "ages_noPLDRAKE27s4.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE27s5 = "ages_noPLDRAKE27s5.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE58s1 = "ages_noPLDRAKE58s1.sim"; // no payload script
    public static final String KEY_SCRIPT_NPDRAKE58s5 = "ages_noPLDRAKE58s5.sim"; // no payload script
    public static final String KEY_SCRIPT_NPGOODWATER = "ages_noPLGOODWATER.sim"; // no payload script
    public static final String KEY_SCRIPT_NPFM_GR = "ages_noPLFM_GR.sim"; // no payload script
    public static final String KEY_SCRIPT_NPFM_ST = "ages_noPLFM_ST.sim"; // no payload script
    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 CAL_STARTTIME = "cal_startTime";
    public static final String CAL_ENDTIME = "cal_endTime";

    public static final String PAYLOAD = "payload";
    public static final String PROJECT = "project";

    public String data_folder = "";
    boolean payLoad = false;

    // required parameter
    String[] reqParams = {
        PAR_STARTTIME,
        PAR_ENDTIME
    };

    // optional parameter
    String[] optParams = {
        "ACAdaptation",
        "baseDepth",
        "BetaW",
        "Beta_min",
        "Beta_rsd",
        "DCAdaptation",
        "FCAdaptation",
        "Ksink",
        "LExCoef",
        "N_delay_RG1",
        "N_delay_RG2",
        "a_rain",
        "a_snow",
        "angstrom_a",
        "angstrom_b",
        "baseTemp",
        "calib_clat_fact",
        "ccf_factor",
        "cn_froz",
        "icn",
        "r2adj",
        "fcimp",
        "meanCNFactor",
        "meanKfFactor",
        "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",
        "kf_fact",
        "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",
        "loadStateFilePath",
        "dataStartTime",
        "dataEndTime"
    };

    @Override
    public void doProcess() throws Exception {
        LOG.info("===>  Running AgES ");

        payLoad = parameter().getBoolean(PAYLOAD, false);

        String project = parameter().getString(PROJECT, "SFIR3");
        String dsl = parameter().getString(KEY_SCRIPT, resources().getFile(KEY_SCRIPT).toString());

        if (!payLoad) {
            dsl = parameter().getString(KEY_SCRIPT_NP, resources().getFile(KEY_SCRIPT_NP).toString());
            if (!project.isEmpty()) {
                if (project.equals("SFIR3")) {
                    dsl = parameter().getString(KEY_SCRIPT_NP3, resources().getFile(KEY_SCRIPT_NP3).toString());
                }
                if (project.equals("SFIR30")) {
                    dsl = parameter().getString(KEY_SCRIPT_NP30, resources().getFile(KEY_SCRIPT_NP30).toString());
                }
                if (project.equals("SFIR300")) {
                    dsl = parameter().getString(KEY_SCRIPT_NP300, resources().getFile(KEY_SCRIPT_NP300).toString());
                }
                if (project.equals("SFIR3000")) {
                    dsl = parameter().getString(KEY_SCRIPT_NP3000, resources().getFile(KEY_SCRIPT_NP3000).toString());
                }
                if (project.equals("BDCW")) {
                    dsl = parameter().getString(KEY_SCRIPT_NPBDCW, resources().getFile(KEY_SCRIPT_NPBDCW).toString());
                }
                if (project.equals("EAGLE")) {
                    dsl = parameter().getString(KEY_SCRIPT_NPEAGLE, resources().getFile(KEY_SCRIPT_NPEAGLE).toString());
                }
                if (project.equals("DRAKE58")) {
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE58, resources().getFile(KEY_SCRIPT_NPDRAKE58).toString());
                }
                if (project.equals("DRAKE51")) {
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE51, resources().getFile(KEY_SCRIPT_NPDRAKE51).toString());
                }
                if (project.equals("DRAKE27")) {
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27, resources().getFile(KEY_SCRIPT_NPDRAKE27).toString());
                }
                if (project.equals("DRAKE27s1")) {
                    project = "DRAKE27";
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27s1, resources().getFile(KEY_SCRIPT_NPDRAKE27s1).toString());
                }
                if (project.equals("DRAKE27s4")) {
                    project = "DRAKE27";
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27s4, resources().getFile(KEY_SCRIPT_NPDRAKE27s4).toString());
                }
                if (project.equals("DRAKE27s5")) {
                    project = "DRAKE27";
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE27s5, resources().getFile(KEY_SCRIPT_NPDRAKE27s5).toString());
                }
                if (project.equals("DRAKE58s1")) {
                    project = "DRAKE58";
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE58s1, resources().getFile(KEY_SCRIPT_NPDRAKE58s1).toString());
                }
                if (project.equals("DRAKE58s5")) {
                    project = "DRAKE58";
                    dsl = parameter().getString(KEY_SCRIPT_NPDRAKE58s5, resources().getFile(KEY_SCRIPT_NPDRAKE58s5).toString());
                }
                if (project.equals("GOODWATER")) {
                    project = "GOODWATER";
                    dsl = parameter().getString(KEY_SCRIPT_NPGOODWATER, resources().getFile(KEY_SCRIPT_NPGOODWATER).toString());
                }
                if (project.equals("FM_GR")) {
                    project = "FOURMILECREEK_GR";
                    dsl = parameter().getString(KEY_SCRIPT_NPFM_GR, resources().getFile(KEY_SCRIPT_NPFM_GR).toString());
                }
                if (project.equals("FM_ST")) {
                    project = "FOURMILECREEK_ST";
                    dsl = parameter().getString(KEY_SCRIPT_NPFM_ST, resources().getFile(KEY_SCRIPT_NPFM_ST).toString());
                }
            }
        }

        data_folder = project;

        // 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);

        // data file parameters
        File dataFolder = !payLoad ? new File(Config.getString(Config.CSIP_BIN_DIR) + "/ages_1_0/data/" + data_folder) : workspace().getDir();
        Utils.processFileParameters(parameter(), dataFolder, workspace().getDir(), agesParam);

        // create parameter include file
        Utils.createParamInclude(agesParam, workspace().getFile(RUN_INC));

        String start = parameter().getString(PAR_STARTTIME);
        String end = parameter().getString(PAR_ENDTIME);

        // optional parameter
        String cal_start = parameter().getString(CAL_STARTTIME, start);
        String cal_end = parameter().getString(CAL_ENDTIME, end);

        File d = new File(dsl);
        if (!(d.isAbsolute() && d.exists())) {
            d = workspace().getFile(dsl);
        }

        workspace().getFile("output").mkdirs();
        workspace().getFile("logs").mkdirs();

        Utils.runAges(d, workspace().getDir(), parameter(), resources(), LOG);

        if (!cosu().isRequested()) {
            return;
        }

        for (String name : cosu().getNames()) {
            String[] data = cosu().getData(name);
            ObjFunc of = cosu().getObjFunc(name);

            double[] obsData = Utils.getData(data[0],
                    dataFolder, cal_start, cal_end);
            // e.g. output/csip_run/out/Outlet.csv/output/catchmentSimRunoff
            double[] simData = Utils.getData(data[1], workspace().getDir(), cal_start, cal_end);
            double result = of.eval(obsData, simData, parameter().getDouble("missing", -9999d));
            result = Double.isNaN(result) ? -999.0 : result;

            cosu().setValue(name, result);
        }
    }
}