diff --git a/src/main/java/no/nibio/vips/model/daydegreemodel/DayDegreeModel.java b/src/main/java/no/nibio/vips/model/daydegreemodel/DayDegreeModel.java index 4d354af04ed1f5ce899ada3810b0c49dd763a0ad..516ab8228f05f97f3666b4818f519e39655a9907 100644 --- a/src/main/java/no/nibio/vips/model/daydegreemodel/DayDegreeModel.java +++ b/src/main/java/no/nibio/vips/model/daydegreemodel/DayDegreeModel.java @@ -18,10 +18,13 @@ package no.nibio.vips.model.daydegreemodel; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.TimeZone; @@ -46,94 +49,69 @@ import no.nibio.vips.util.WeatherUtil; * @author Tor J. Johansen <tor.johansen@nibio.no> (Model research) * @author Tor-Einar Skog <tor-einar.skog@nibio.no> (Programming) */ -public class DayDegreeModel extends I18nImpl implements Model { +public class DayDegreeModel implements Model { - public final static ModelId MODEL_ID = new ModelId("DAYDEGREES"); - - private final ModelUtil modelUtil; - - private TimeZone timeZone; - private DataMatrix dataMatrix; - - private List<WeatherObservation> TM; // Temporary storage of hourly values + private ModelUtil modelUtil; + //private Double dayDegreeBaseTemp; + private List<WeatherObservation> TM; private final Double dayDegreeBaseTemp = 0.0; - // Threshold values - //private final Double THRESHOLD_1 = 260.0; - //private final Double THRESHOLD_2 = 360.0; - //private final Double THRESHOLD_3 = 560.0; + private final static TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("Europe/Oslo"); + private DataMatrix dataMatrix; + public final static ModelId MODEL_ID = new ModelId("DAYDEGREES"); + public DayDegreeModel() { - super("no.nibio.vips.model.psilarosaetempmodel.texts"); + //super(""); this.modelUtil = new ModelUtil(); } @Override public List<Result> getResult() throws ModelExcecutionException { - this.calculateTemperatureSum(DataMatrix.TMD, DataMatrix.TMD0C); - List<Result> retVal = new ArrayList<>(); - Date currentDate = this.dataMatrix.getFirstDateWithParameterValue(DataMatrix.TMD0C); - Calendar cal = Calendar.getInstance(this.timeZone); - DecimalFormat dFormat = new DecimalFormat("###.##"); + Collections.sort(this.TM); + + Double dayDegreeSum = 0.0; - while(this.dataMatrix.getParamDoubleValueForDate(currentDate, DataMatrix.TMD0C) != null) + List<Result> results = new ArrayList<>(); + + Calendar cal = Calendar.getInstance(this.DEFAULT_TIME_ZONE); + DecimalFormat dFormat = new DecimalFormat("###.##"); + + for(WeatherObservation obs:this.TM) { - Result result = new ResultImpl(); - result.setValidTimeStart(currentDate); - Double TMCurrentDate = ((WeatherObservation) this.dataMatrix.getParamValueForDate(currentDate, DataMatrix.TMD)).getValue(); - Double TMD0C = this.dataMatrix.getParamDoubleValueForDate(currentDate, DataMatrix.TMD0C); - - - /* - result.setValue(CommonNamespaces.NS_WEATHER, DataMatrix.TMD, dFormat.format(TMCurrentDate)); - result.setValue(CommonNamespaces.NS_WEATHER, DataMatrix.TMDD5C, dFormat.format(TMDD5C)); - result.setValue(CommonNamespaces.NS_WEATHER, DataMatrix.TMD5C, dFormat.format(TMD5C)); - result.setValue(PsilaRosaeTempModel.MODEL_ID.toString(), "THRESHOLD_1", dFormat.format(this.THRESHOLD_1)); - result.setValue(PsilaRosaeTempModel.MODEL_ID.toString(), "THRESHOLD_2", dFormat.format(this.THRESHOLD_2)); - result.setValue(PsilaRosaeTempModel.MODEL_ID.toString(), "THRESHOLD_3", dFormat.format(this.THRESHOLD_3)); - - - Integer warningStatus = Result.WARNING_STATUS_NO_RISK; - if(TMDD5C >= this.THRESHOLD_1) - { - warningStatus = Result.WARNING_STATUS_MINOR_RISK; - } - if(TMDD5C >= this.THRESHOLD_2) - { - warningStatus = Result.WARNING_STATUS_HIGH_RISK; - } - if(TMDD5C >= this.THRESHOLD_3) - { - warningStatus = Result.WARNING_STATUS_NO_WARNING; - } - result.setWarningStatus(warningStatus); - retVal.add(result); - // Moving on... - cal.setTime(currentDate); - cal.add(Calendar.DATE, 1); - currentDate = cal.getTime();*/ - } + if(obs.getValue() > 0) + { + dayDegreeSum += obs.getValue(); + } + + Result result = new ResultImpl(); + result.setValidTimeStart(obs.getTimeMeasured()); + result.setValue(this.getModelId().toString(), "DayDegreeSum", dayDegreeSum.toString()); - return null; - //return retVal; + results.add(result); + } + return results; } + @Override public ModelId getModelId() { return DayDegreeModel.MODEL_ID; } + @Override public String getModelName() { - return this.getModelName(Model.DEFAULT_LANGUAGE); + return null;//this.getModelName(Model.DEFAULT_LANGUAGE); } @Override public String getModelName(String language) { - return this.getText("name", language); + //return this.getText("name", language); + return "Day Degree model"; } @Override @@ -162,6 +140,7 @@ public class DayDegreeModel extends I18nImpl implements Model { return "(c) 2015-2021 NIBIO (http://www.nibio.no/). Contact: post@nibio.no"; } + @Override public String getModelDescription() { return this.getModelDescription(Model.DEFAULT_LANGUAGE); @@ -169,39 +148,32 @@ public class DayDegreeModel extends I18nImpl implements Model { @Override public String getModelDescription(String language) { - try - { - return this.modelUtil.getTextWithBase64EncodedImages(this.getText("description", language), this.getClass()); - } - catch(IOException ex) - { - return this.getText("description", language); - } + return null; //this.modelUtil.getTextWithBase64EncodedImages(this.getText("description", language), this.getClass()); } - @Override public String getWarningStatusInterpretation() { - return this.getWarningStatusInterpretation(Model.DEFAULT_LANGUAGE); + return null;//this.getWarningStatusInterpretation(Model.DEFAULT_LANGUAGE); } @Override public String getWarningStatusInterpretation(String language) { - return this.getText("statusInterpretation", language); + return null;//this.getText("statusInterpretation", language); } - + @Override public String getModelUsage() { - return this.getModelUsage(Model.DEFAULT_LANGUAGE); + return null; //this.getModelUsage(Model.DEFAULT_LANGUAGE); } @Override public String getModelUsage(String language) { - return this.getText("usage", language); + return null;//this.getText("usage", language); } @Override public String getSampleConfig() { + System.out.println("Kjører i getSampleConfig------"); return "{\n" + "\t\"loginInfo\":{\n" + "\t\t\"username\":\"example\",\n" + @@ -209,7 +181,6 @@ public class DayDegreeModel extends I18nImpl implements Model { "\t},\n" + "\t\"modelId\":\"" + MODEL_ID.toString() + "\",\n" + "\t\"configParameters\":{\n" + - "\t\t\"timeZone\": \"Europe/Oslo\",\n" + "\t\t\"observations\":[\n" + "\t\t{\n" + "\t\t\t\t\"timeMeasured\": \"2015-01-01T00:00:00+02:00\",\n" + @@ -224,95 +195,35 @@ public class DayDegreeModel extends I18nImpl implements Model { public void setConfiguration(ModelConfiguration config) throws ConfigValidationException { // Initialize the weather data collections this.TM = new ArrayList<>(); - - // Init data matrix - this.dataMatrix = new DataMatrix(); + ObjectMapper mapper = new ObjectMapper(); - // Setting timezone - this.timeZone = TimeZone.getTimeZone((String) config.getConfigParameter("timeZone")); - //System.out.println("TimeZone=" + this.timeZone); + List<WeatherObservation> observations = this.modelUtil.extractWeatherObservationList(config.getConfigParameter("observations")); - // Importing weather data, creating collections - // Can accept both hourly and daily data + // Must be complete set of daily mean temperatures WeatherUtil wUtil = new WeatherUtil(); - - List<WeatherObservation> observations = modelUtil.extractWeatherObservationList(config.getConfigParameter("observations")); - if(observations == null || observations.isEmpty()) + Date potentialHole = wUtil.findFirstHoleInObservationSeries(observations, WeatherObservation.LOG_INTERVAL_ID_1D, DayDegreeModel.DEFAULT_TIME_ZONE); + if(potentialHole != null) { - throw new ConfigValidationException("Please provide weather data."); + throw new ConfigValidationException("Hole found in temperature series at = " + potentialHole); } + for(WeatherObservation o:observations) - { + { switch(o.getElementMeasurementTypeId()) { case WeatherElements.TEMPERATURE_MEAN: - if(o.getLogIntervalId().equals(WeatherObservation.LOG_INTERVAL_ID_1H)) + if(o.getLogIntervalId().equals(WeatherObservation.LOG_INTERVAL_ID_1D)) { - this.TM.add(o); - }else { - o.setTimeMeasured(wUtil.pragmaticAdjustmentToMidnight(o.getTimeMeasured(), timeZone)); - this.dataMatrix.setParamValueForDate(o.getTimeMeasured(), DataMatrix.TMD, o); - }break; + this.TM.add(o); + } + break; default: - // Keep calm and continue importing data + // TODO: Throw validation error? break; } } - - // If we've received hourly weather data, create and store daily values - // Air temperature - if(dataMatrix.getFirstDateWithParameterValue(DataMatrix.TMD) == null) - { - try { - List<WeatherObservation> dailyTemperatures = new WeatherUtil().getAggregatedDailyValues( - this.TM, - this.timeZone, - 15, - WeatherUtil.AGGREGATION_TYPE_AVERAGE, - 0, - true); - for(WeatherObservation obs:dailyTemperatures) - { - this.dataMatrix.setParamValueForDate(obs.getTimeMeasured(), DataMatrix.TMD, obs); - } - } catch (WeatherObservationListException | InvalidAggregationTypeException ex) { - throw new ConfigValidationException(ex.getMessage()); - } - } - - //System.out.println("DataMatrix"); - //System.out.println(this.dataMatrix.toString()); - } - - /** - * Operates on the datamatrix - * @param inputParameterName the parameter to sum - * @param outputParameterName the result - */ - private void calculateTemperatureSum(String inputParameterName, String outputParameterName) throws ModelExcecutionException { - Date today = this.dataMatrix.getFirstDateWithParameterValue(inputParameterName); - Date lastDate = this.dataMatrix.getLastDateWithParameterValue(inputParameterName); - Calendar cal = Calendar.getInstance(this.timeZone); - - Double sum = 0.0; - while(today.compareTo(lastDate) <= 0) - { - WeatherObservation todayTemp = (WeatherObservation)this.dataMatrix.getParamValueForDate(today, inputParameterName); - if(todayTemp == null) - { - throw new ModelExcecutionException("Missing weather data at " + today + ": " + inputParameterName); - } - //System.out.println("today=" + today + ",todayTemp=" + todayTemp); - Double dailyContribution = Math.max(0.0, todayTemp.getValue() - this.dayDegreeBaseTemp); - this.dataMatrix.setParamDoubleValueForDate(today, DataMatrix.TMD0C, dailyContribution); - sum += dailyContribution; - this.dataMatrix.setParamDoubleValueForDate(today, outputParameterName, sum); - cal.setTime(today); - cal.add(Calendar.DATE, 1); - today = cal.getTime(); - } + } - }