Repository 'insect_phenology_model'
hg clone https://eddie.galaxyproject.org/repos/greg/insect_phenology_model

Changeset 142:b06b3881ecf0 (2018-12-20)
Previous changeset 141:14afb6e85581 (2018-11-21) Next changeset 143:7628ba67c7ff (2018-12-20)
Commit message:
Uploaded
modified:
insect_phenology_model.R
insect_phenology_model.xml
test-data/output_combined1.csv
test-data/output_combined2.csv
test-data/output_combined3.csv
test-data/output_combined4.csv
test-data/output_f1_3.csv
test-data/output_f1_4.csv
test-data/output_f2_3.csv
test-data/output_f2_4.csv
test-data/output_p_3.csv
test-data/output_p_4.csv
utils.R
b
diff -r 14afb6e85581 -r b06b3881ecf0 insect_phenology_model.R
--- a/insect_phenology_model.R Wed Nov 21 11:33:40 2018 -0500
+++ b/insect_phenology_model.R Thu Dec 20 09:08:50 2018 -0500
[
b'@@ -250,50 +250,62 @@\n     return(mortality.probability)\n }\n \n-mortality.egg = function(temperature, adj=0) {\n-    # If no input from adjustment, default\n-    # value is 0 (data from Nielsen, 2008).\n-    T.mortality = c(15, 17, 20, 25, 27, 30, 33, 35);\n-    egg.mortality = c(50, 2, 1, 0, 0, 0, 5, 100);\n-    # Calculates slopes and intercepts for lines.\n-    slopes = NULL;\n-    intercepts = NULL;\n-    for (i in 1:length(T.mortality)) {\n-        slopes[i] = (egg.mortality[i+1] - egg.mortality[i]) / (T.mortality[i+1] - T.mortality[i]);\n-        intercepts[i] = -slopes[i] * T.mortality[i] + egg.mortality[i];\n+#mortality.egg = function(temperature, adj=0) {\n+#    # If no input from adjustment, default\n+#    # value is 0 (data from Nielsen, 2008).\n+#    T.mortality = c(15, 17, 20, 25, 27, 30, 33, 35);\n+#    egg.mortality = c(50, 2, 1, 0, 0, 0, 5, 100);\n+#    # Calculates slopes and intercepts for lines.\n+#    slopes = NULL;\n+#    intercepts = NULL;\n+#    for (i in 1:length(T.mortality)) {\n+#        slopes[i] = (egg.mortality[i+1] - egg.mortality[i]) / (T.mortality[i+1] - T.mortality[i]);\n+#        intercepts[i] = -slopes[i] * T.mortality[i] + egg.mortality[i];\n+#    }\n+#    # Calculates mortality based on temperature.\n+#    mortality.probability = NULL;\n+#    for (j in 1:length(temperature)) {\n+#        mortality.probability[j] = if(temperature[j] <= T.mortality[2]) {\n+#                           temperature[j] * slopes[1] + intercepts[1];\n+#                       } else if (temperature[j] > T.mortality[2] && temperature[j] <= T.mortality[3]) {\n+#                           temperature[j] * slopes[2] + intercepts[2];\n+#                       } else if (temperature[j] > T.mortality[3] && temperature[j] <= T.mortality[4]) {\n+#                           temperature[j] * slopes[3] + intercepts[3];\n+#                       } else if (temperature[j] > T.mortality[4] && temperature[j] <= T.mortality[5]) {\n+#                           temperature[j] * slopes[4] + intercepts[4];\n+#                       } else if (temperature[j] > T.mortality[5] && temperature[j] <= T.mortality[6]) {\n+#                           temperature[j] * slopes[5] + intercepts[5];\n+#                       } else if (temperature[j] > T.mortality[6] && temperature[j] <= T.mortality[7]) {\n+#                           temperature[j] * slopes[6] + intercepts[6];\n+#                       } else if (temperature[j] > T.mortality[7]) {\n+#                           temperature[j] * slopes[7] + intercepts[7];\n+#                       }\n+#        # If mortality > 100, make it equal to 100.\n+#        mortality.probability[mortality.probability>100] = 100;\n+#        # If mortality <0, make equal to 0.\n+#        mortality.probability[mortality.probability<0] = 0;\n+#    }\n+#    # Make mortality adjustments based on adj parameter.\n+#    mortality.probability = (100 - mortality.probability) * adj + mortality.probability;\n+#    # if mortality > 100, make it equal to 100.\n+#    mortality.probability[mortality.probability>100] = 100;\n+#    # If mortality <0, make equal to 0.\n+#    mortality.probability[mortality.probability<0] = 0;\n+#    # Change percent to proportion.\n+#    mortality.probability = mortality.probability / 100;\n+#    return(mortality.probability)\n+#}\n+\n+mortality.egg = function(temperature) {\n+    if (temperature < 12.7) {\n+        mortality.probability = 0.8;\n+    } else {\n+        mortality.probability = 0.8 - temperature / 40.0;\n+        if (mortality.probability < 0) {\n+            mortality.probability = 0.01;\n+        }\n     }\n-    # Calculates mortality based on temperature.\n-    mortality.probability = NULL;\n-    for (j in 1:length(temperature)) {\n-        mortality.probability[j] = if(temperature[j] <= T.mortality[2]) {\n-                           temperature[j] * slopes[1] + intercepts[1];\n-                       } else if (temperature[j] > T.mortality[2] && temperature[j] <= T.mortality[3]) {\n-                           temperature[j] * slopes[2] + intercepts[2'..b'.probability[mortality.probability<0] = 0;\n-    # Change percent to proportion.\n-    mortality.probability = mortality.probability / 100;\n-    return(mortality.probability)\n+    return (mortality.probability);\n }\n \n mortality.nymph = function(temperature) {\n@@ -311,6 +323,8 @@\n     prepend_end_doy_norm = 0;\n     # The start DOY for norm data appended to ytd data.\n     append_start_doy_norm = 0;\n+    cat("start_date: ", start_date, "\\n");\n+    cat("end_date: ", end_date, "\\n");\n     if (is.null(start_date) && is.null(end_date)) {\n         # We\'re not dealing with a date interval.\n         date_interval = FALSE;\n@@ -326,6 +340,7 @@\n         start_date_doy = as.integer(strftime(start_date, format="%j"));\n         end_date_doy = as.integer(strftime(end_date, format="%j"));\n     }\n+    cat("date_interval: ", date_interval, "\\n");\n     if (is.null(input_ytd)) {\n         # We\'re processing only the 30 year normals data.\n         processing_year_to_date_data = FALSE;\n@@ -363,16 +378,13 @@\n             }\n             end_date_ytd_row = which(temperature_data_frame$DATE==end_date);\n             if (length(end_date_ytd_row) > 0) {\n+                cat("I\'m here...\\n");\n                 end_date_ytd_row = end_date_ytd_row[1];\n                 # The end date is contained within the input_ytd data.\n                 end_doy_ytd = as.integer(temperature_data_frame$DOY[end_date_ytd_row]);\n-                if (end_doy_ytd > end_date_ytd_row + 1) {\n-                    # The input year-to-date dataset is missing 1 or more\n-                    # days of data.\n-                    days_missing = end_doy_ytd - end_date_ytd_row;\n-                    msg = cat("The year-to-date dataset is missing ", days_missing, " days of data.\\n");\n-                    stop_err(msg);\n-                }\n+                cat("end_doy_ytd: ", end_doy_ytd, "\\n");\n+                cat("end_date_ytd_row: ", end_date_ytd_row, "\\n");\n+                cat("start_date_ytd_row: ", start_date_ytd_row, "\\n");\n             } else {\n                 end_date_ytd_row = 0;\n             }\n@@ -396,13 +408,10 @@\n             # Save the first DOY to later check if start_date is Jan 1.\n             start_doy_ytd = as.integer(temperature_data_frame$DOY[1]);\n             end_doy_ytd = as.integer(temperature_data_frame$DOY[num_ytd_rows]);\n-            if (end_doy_ytd > end_date_ytd_row + 1) {\n-                # The input year-to-date dataset is missing 1 or more\n-                # days of data.\n-                days_missing = end_doy_ytd - end_date_ytd_row;\n-                msg = cat("The year-to-date dataset is missing ", days_missing, " days of data.\\n");\n-                stop_err(msg);\n-            }\n+            cat("I\'m here 2...\\n");\n+            cat("end_doy_ytd: ", end_doy_ytd, "\\n");\n+            cat("end_date_ytd_row: ", end_date_ytd_row, "\\n");\n+            cat("start_date_ytd_row: ", start_date_ytd_row, "\\n");\n         }\n     } else {\n         # We\'re processing only the 30 year normals data, so create an empty\n@@ -557,6 +566,8 @@\n             }\n         }\n     }\n+    # Ensure all DOY values are consectuive integers.\n+    validate_doys(temperature_data_frame);\n     # Add a column containing the daylight length for each day.\n     temperature_data_frame = add_daylight_length(temperature_data_frame);\n     return(list(temperature_data_frame, start_date, end_date, prepend_end_doy_norm, append_start_doy_norm, is_leap_year, location));\n@@ -856,7 +867,8 @@\n                 }\n                 if (vector.individual[2] == 0) {\n                     # Egg.\n-                    death.probability = opt$egg_mortality * mortality.egg(mean.temp, adj=opt$egg_mortality);\n+                    # death.probability = opt$egg_mortality * mortality.egg(mean.temp, adj=opt$egg_mortality);\n+                    death.probability = opt$egg_mortality * mortality.egg(mean.temp);\n                 }\n                 else if (vector.individual[2] == 1 | vector.individual[2] == 2) {\n                     # Nymph.\n'
b
diff -r 14afb6e85581 -r b06b3881ecf0 insect_phenology_model.xml
--- a/insect_phenology_model.xml Wed Nov 21 11:33:40 2018 -0500
+++ b/insect_phenology_model.xml Thu Dec 20 09:08:50 2018 -0500
b
@@ -66,13 +66,13 @@
             <validator type="expression" message="30 year normals temperature data must have 10 columns and 366 rows">value is not None and value.metadata.columns==10 and value.metadata.data_lines==366</validator>
         </param>
         <conditional name="merge_ytd_temperature_data_cond">
-            <param name="merge_ytd_temperature_data" type="select" label="Merge year-to-date temperature data with 30 year normals temperature data?">
+            <param name="merge_ytd_temperature_data" type="select" label="Merge daily actuals temperature data with 30 year normals temperature data?">
                 <option value="yes" selected="true">Yes</option>
                 <option value="no">No</option>
             </param>
             <when value="yes">
-                <param name="input_ytd" type="data" format="csv" label="Year-to-date temperature data">
-                    <validator type="expression" message="Year-to-date temperature data must have 6 columns">value is not None and value.metadata.columns==6</validator>
+                <param name="input_ytd" type="data" format="csv" label="Daily actuals temperature data">
+                    <validator type="expression" message="Daily actuals temperature data must have 6 columns">value is not None and value.metadata.columns==6</validator>
                 </param>
                 <param name="location" type="text" value="" optional="true" label="Location" help="Enter the location or leave blank to use the station name from 30 year normals data."/>
             </when>
@@ -81,7 +81,7 @@
         <param name="insect" type="select" label="Select insect">
             <option value="BMSB" selected="True">Brown Marmorated Stink Bug</option>
         </param>
-        <param name="replications" type="integer" value="10" min="2" label="Number of replications"/>
+        <param name="replications" type="integer" value="5" min="2" label="Number of replications"/>
         <param name="insects_per_replication" type="integer" value="1000" min="100" label="Number of insects with which to start each replication"/>
         <param name="photoperiod" type="float" value="13.5" min="0" label="Critical photoperiod for diapause induction/termination"/>
         <param name="egg_mortality" type="float" value="1" min="0" max="1" label="Adjustment rate for egg mortality" help="Floating point value between 0 and 1"/>
@@ -242,7 +242,7 @@
  * **30 year normals temperature data** - the dataset from your history containing the 30-year normals temperature data (available at http://pestwatch.psu.edu/ghcn).
  * **Merge year-to-date temperature data with 30 year normals temperature data** - select Yes to merge a year-to-date temperature dataset from your history into the selected 30 year normals temperature data.
 
-  * **Year-to-date temperature data** - the dataset from your history containing the year-to-date temperature data (available at http://pestwatch.psu.edu/minmax).
+  * **Daily actuals temperature data** - the dataset from your history containing the daily actuals temperature data (available at http://pestwatch.psu.edu/minmax).
 
  * **Location** - the location associated with the selected temperature data.
  * **Select insect** - currently only the Brown Marmorated Stink Bug can be analyzed.
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_combined1.csv
--- a/test-data/output_combined1.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_combined1.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","YOUNGNYMPH","YOUNGNYMPHSE","PRE.VITADULT","PRE.VITADULTSE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","YOUNGNYMPH","YOUNGNYMPHSE","PRE.VITADULT","PRE.VITADULTSE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_combined2.csv
--- a/test-data/output_combined2.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_combined2.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_combined3.csv
--- a/test-data/output_combined3.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_combined3.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","OLDNYMPH","OLDNYMPHSE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","OLDNYMPH","OLDNYMPHSE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_combined4.csv
--- a/test-data/output_combined4.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_combined4.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_f1_3.csv
--- a/test-data/output_f1_3.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_f1_3.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","OLDNYMPH.F1","OLDNYMPH.F1.SE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","OLDNYMPH","OLDNYMPHSE","OLDNYMPH.F1","OLDNYMPH.F1.SE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_f1_4.csv
--- a/test-data/output_f1_4.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_f1_4.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","EGG.F1","EGG.F1.SE","TOTALNYMPH.F1","TOTALNYMPH.F1.SE","TOTALADULT.F1","TOTALADULT.F1.SE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE","EGG.F1","EGG.F1.SE","TOTALNYMPH.F1","TOTALNYMPH.F1.SE","TOTALADULT.F1","TOTALADULT.F1.SE","ALL.TOTAL.F1","ALL.TOTAL.F1.SE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_f2_3.csv
--- a/test-data/output_f2_3.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_f2_3.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","OLDNYMPH.F2","OLDNYMPH.F2.SE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","OLDNYMPH","OLDNYMPHSE","OLDNYMPH.F2","OLDNYMPH.F2.SE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_f2_4.csv
--- a/test-data/output_f2_4.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_f2_4.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","EGG.F2","EGG.F2.SE","TOTALNYMPH.F2","TOTALNYMPH.F2.SE","TOTALADULT.F2","TOTALADULT.F2.SE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE","EGG.F2","EGG.F2.SE","TOTALNYMPH.F2","TOTALNYMPH.F2.SE","TOTALADULT.F2","TOTALADULT.F2.SE","ALL.TOTAL.F2","ALL.TOTAL.F2.SE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_p_3.csv
--- a/test-data/output_p_3.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_p_3.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","OLDNYMPH.P","OLDNYMPH.P.SE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","OLDNYMPH","OLDNYMPHSE","OLDNYMPH.P","OLDNYMPH.P.SE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 test-data/output_p_4.csv
--- a/test-data/output_p_4.csv Wed Nov 21 11:33:40 2018 -0500
+++ b/test-data/output_p_4.csv Thu Dec 20 09:08:50 2018 -0500
b
@@ -1,1 +1,1 @@
-"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","EGG.P","EGG.P.SE","TOTALNYMPH.P","TOTALNYMPH.P.SE","TOTALADULT.P","TOTALADULT.P.SE","ALL.TOTAL.P","ALL.TOTAL.P.SE"
+"LATITUDE","LONGITUDE","DATE","DOY","TMIN","TMAX","DAYLEN","DEGREE.DAYS","EGG","EGGSE","TOTALNYMPH","TOTALNYMPHSE","TOTALADULT","TOTALADULTSE","EGG.P","EGG.P.SE","TOTALNYMPH.P","TOTALNYMPH.P.SE","TOTALADULT.P","TOTALADULT.P.SE","ALL.TOTAL.P","ALL.TOTAL.P.SE"
b
diff -r 14afb6e85581 -r b06b3881ecf0 utils.R
--- a/utils.R Wed Nov 21 11:33:40 2018 -0500
+++ b/utils.R Thu Dec 20 09:08:50 2018 -0500
[
@@ -333,3 +333,21 @@
     }
     return(valid_date);
 }
+
+validate_doys = function(temperature_data_frame) {
+    # Ensure all DOY values are consecutive integers.
+    last_doy = 0;
+    num_rows = dim(temperature_data_frame)[1];
+    for (i in 1:num_rows) {
+        doy = as.integer(temperature_data_frame$DOY[i]);
+        if (last_doy == 0) {
+            last_doy = doy;
+        } else {
+            if (doy != last_doy + 1) {
+                msg = paste("DOY ", doy, " is not consecutive (previous DOY is ", last_doy, ".", sep="");
+                stop_err(msg);
+            }
+            last_doy = doy;
+        }
+    }
+}