From e9875472a2cb5ff6f73d44e9f68aadad174bc745 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Tue, 7 Jun 2022 09:42:21 +0200
Subject: [PATCH] Added support for the EOL (dead) phase

---
 pom.xml                                       | 10 ++--
 .../yellowstemborertempmodel/DataMatrix.java  |  1 +
 .../YellowStemborerTempModel.java             | 47 +++++++++++++------
 .../YellowStemborerTempModelTest.java         |  6 +--
 4 files changed, 41 insertions(+), 23 deletions(-)

diff --git a/pom.xml b/pom.xml
index bb20e15..ca147cb 100755
--- a/pom.xml
+++ b/pom.xml
@@ -6,11 +6,6 @@
     <version>1.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     <dependencies>
-        <dependency>
-            <groupId>no.nibio.vips.common</groupId>
-            <artifactId>VIPSCommon</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -23,6 +18,11 @@
             <version>1.3</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>no.nibio.vips.common</groupId>
+            <artifactId>VIPSCommon</artifactId>
+            <version>2022.1</version>
+        </dependency>
     </dependencies>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/DataMatrix.java b/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/DataMatrix.java
index 17d2e76..0e10b81 100644
--- a/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/DataMatrix.java
+++ b/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/DataMatrix.java
@@ -35,4 +35,5 @@ public class DataMatrix extends DateMap{
     public final static String PHASE_LARVAE ="LARVAE";
     public final static String PHASE_PUPA ="PUPA";
     public final static String PHASE_ADULT ="ADULT";
+    public final static String PHASE_EOL ="EOL";
 }
diff --git a/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModel.java b/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModel.java
index 4abf3f2..b4a045c 100644
--- a/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModel.java
+++ b/src/main/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModel.java
@@ -61,12 +61,13 @@ public class YellowStemborerTempModel extends I18nImpl implements Model {
         DataMatrix.PHASE_EGG,
         DataMatrix.PHASE_LARVAE,
         DataMatrix.PHASE_PUPA,
-        DataMatrix.PHASE_ADULT
+        DataMatrix.PHASE_ADULT,
+        DataMatrix.PHASE_EOL
     };
     
     // DD aggregation cutoff values for each phase
-    private Double[] ddLower = {13.0,12.0,15.0,13.0};
-    private Double[] ddUpper = {36.0, 34.0,36.0,36.0};
+    private Double[] ddLower = {13.0, 12.0, 15.0, 13.0};
+    private Double[] ddUpper = {36.0, 34.0, 36.0, 36.0};
     
     // Heat sum thresholds for each phase
     private Double[] heatRequirements = {113.0, 370.0, 188.0, 25.0};
@@ -127,6 +128,10 @@ public class YellowStemborerTempModel extends I18nImpl implements Model {
            {
                warningStatus = Result.WARNING_STATUS_HIGH_RISK;
            }
+           if(PHASE.equals(DataMatrix.PHASE_EOL))
+           {
+               warningStatus = Result.WARNING_STATUS_NO_RISK;
+           }
            result.setWarningStatus(warningStatus);
            retVal.add(result);
            // Moving on...
@@ -347,27 +352,39 @@ public class YellowStemborerTempModel extends I18nImpl implements Model {
         Double sum = currentPhase.equals(DataMatrix.PHASE_EGG) ? 0.0
                 : currentPhase.equals(DataMatrix.PHASE_LARVAE) ? this.heatRequirements[0]
                 : currentPhase.equals(DataMatrix.PHASE_PUPA) ? this.heatRequirements[0] + this.heatRequirements[1]
-                : this.heatRequirements[0] + this.heatRequirements[1] + this.heatRequirements[2];
+                : currentPhase.equals(DataMatrix.PHASE_ADULT) ? this.heatRequirements[0] + this.heatRequirements[1] + this.heatRequirements[2]
+                : this.heatRequirements[0] + this.heatRequirements[1] + this.heatRequirements[2] + this.heatRequirements[3];
         
         List<String> phasesList = Arrays.asList(this.phases);
         
         while(today.compareTo(lastDate) <= 0)
         {
-            WeatherObservation todayMinTemp = (WeatherObservation)this.dataMatrix.getParamValueForDate(today, DataMatrix.TND);
-            WeatherObservation todayMaxTemp = (WeatherObservation)this.dataMatrix.getParamValueForDate(today, DataMatrix.TXD);
-            if(todayMinTemp == null || todayMaxTemp == null)
+            if(!currentPhase.equals(DataMatrix.PHASE_EOL))
+            {
+                WeatherObservation todayMinTemp = (WeatherObservation)this.dataMatrix.getParamValueForDate(today, DataMatrix.TND);
+                WeatherObservation todayMaxTemp = (WeatherObservation)this.dataMatrix.getParamValueForDate(today, DataMatrix.TXD);
+                if(todayMinTemp == null || todayMaxTemp == null)
+                {
+                    throw new ModelExcecutionException("Missing weather data at " + today + ": " + (todayMinTemp == null ? "TND ": "") + (todayMaxTemp == null ? "TXD ": ""));
+                }
+                //System.out.println("today=" + today + ",todayTemp=" + todayTemp);
+                Double current_ddLower = this.ddLower[phasesList.indexOf(currentPhase)];
+                Double current_ddUpper = this.ddUpper[phasesList.indexOf(currentPhase)];
+                Double dailyContribution = nlc.calculateSingleSineWaveWithCutoff(todayMinTemp.getValue(), todayMaxTemp.getValue(), current_ddLower, current_ddUpper);
+                this.dataMatrix.setParamDoubleValueForDate(today, DataMatrix.DAILY_CONTRIB, dailyContribution);
+                sum += dailyContribution;
+            }
+            else
             {
-                throw new ModelExcecutionException("Missing weather data at " + today + ": " + (todayMinTemp == null ? "TND ": "") + (todayMaxTemp == null ? "TXD ": ""));
+                this.dataMatrix.setParamDoubleValueForDate(today, DataMatrix.DAILY_CONTRIB, 0.0);
             }
-            //System.out.println("today=" + today + ",todayTemp=" + todayTemp);
-            Double current_ddLower = this.ddLower[phasesList.indexOf(currentPhase)];
-            Double current_ddUpper = this.ddUpper[phasesList.indexOf(currentPhase)];
-            Double dailyContribution = nlc.calculateSingleSineWaveWithCutoff(todayMinTemp.getValue(), todayMaxTemp.getValue(), current_ddLower, current_ddUpper);
-            this.dataMatrix.setParamDoubleValueForDate(today, DataMatrix.DAILY_CONTRIB, dailyContribution);
-            sum += dailyContribution;
             this.dataMatrix.setParamDoubleValueForDate(today, DataMatrix.HEAT_SUM, sum);
             // Check phase transition
-            if(sum >= this.heatRequirements[0] + this.heatRequirements[1] + this.heatRequirements[2])
+            if(sum >= this.heatRequirements[0] + this.heatRequirements[1] + this.heatRequirements[2] + this.heatRequirements[3])
+            {
+                currentPhase = DataMatrix.PHASE_EOL;
+            }
+            else if(sum >= this.heatRequirements[0] + this.heatRequirements[1] + this.heatRequirements[2])
             {
                 currentPhase = DataMatrix.PHASE_ADULT;
             }
diff --git a/src/test/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModelTest.java b/src/test/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModelTest.java
index 9290114..8d0bb1d 100644
--- a/src/test/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModelTest.java
+++ b/src/test/java/no/nibio/vips/model/yellowstemborertempmodel/YellowStemborerTempModelTest.java
@@ -55,11 +55,11 @@ public class YellowStemborerTempModelTest {
         // The timezone is used to set daily temperatures and biofix date correctly
         config.setConfigParameter("timeZone", "GMT+05:30");
         // The date for when to start calculating heat sums
-        config.setConfigParameter("biofixDate", "2019-01-05");
+        config.setConfigParameter("biofixDate", "2019-01-02");
         
         // OPTIONAL
         // The observed phase at biofix date. Default is EGG
-        config.setConfigParameter("observedPhase", DataMatrix.PHASE_EGG);
+        config.setConfigParameter("observedPhase", DataMatrix.PHASE_ADULT);
         
         // Heat requirement for transitioning out of [EGG,LARVAE,PUPA,ADULT] phases
         Double[] heatRequirements = {113.0, 370.0, 188.0, 25.0};
@@ -90,7 +90,7 @@ public class YellowStemborerTempModelTest {
         //ObjectMapper mapper = new ObjectMapper();
         //System.out.println(mapper.writeValueAsString(result));
         // Line by line
-        //result.forEach(r->System.out.println(r));
+        result.forEach(r->System.out.println(r));
     }
 
     
-- 
GitLab