Skip to content
Snippets Groups Projects
Commit 0cb5cd82 authored by Tucker Siegel's avatar Tucker Siegel
Browse files

change endpoint

parent b0161022
No related branches found
No related tags found
No related merge requests found
package controllers
import (
"github.com/gofiber/fiber/v2"
"gitlab.cs.umd.edu/dawn/dawn-go-common/common"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/services"
)
// ForecastStages godoc
// @Summary Get stages
// @Tags Maturity
// @Description Get stages
// @Accept json
// @Produce json
// @Success 200 {object} map[string][]time.Time
// @Failure 400 {object} common.StandardError
// @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for"
// @Param plant_date query string true "Plant date, ISO8601 or RFC3339 format"
// @Param mode query string true "Mode, rm or gdds_to_maturity"
// @Param value query int true "Value of mode"
// @Router /gdd/forecast/stages [get]
func ForecastStages(c *fiber.Ctx) error {
ctx := common.DawnCtx{FiberCtx: c}
request := models.BuildStageRequest(ctx)
return c.Status(fiber.StatusOK).JSON(services.CalculateStages(ctx, request))
}
......@@ -85,24 +85,3 @@ func GetRMToMaturity(c *fiber.Ctx) error {
request := models.BuildCornRMMaturityRequest(ctx)
return c.Status(fiber.StatusOK).JSON(services.CalculateRMMaturity(ctx, request))
}
// Stages godoc
// @Summary Get stages
// @Tags Maturity
// @Description Get stages
// @Accept json
// @Produce json
// @Success 200 {object} map[string][]time.Time
// @Failure 400 {object} common.StandardError
// @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for"
// @Param plant_date query string true "Plant date, ISO8601 or RFC3339 format"
// @Param mode query string true "Mode, rm or gdds_to_maturity"
// @Param value query int true "Value of mode"
// @Router /gdd/stages [get]
func Stages(c *fiber.Ctx) error {
ctx := common.DawnCtx{FiberCtx: c}
request := models.BuildStageRequest(ctx)
return c.Status(fiber.StatusOK).JSON(services.CalculateStages(ctx, request))
}
......@@ -20,6 +20,6 @@ func GddRoutes(route fiber.Router) {
route.Get("gdd/maturity/corn/relative", GetRMToMaturity)
route.Get("gdd/maturity/corn/cultivars", GetCultivars)
route.Get("gdd/stages", Stages)
route.Get("gdd/forecast/stages", ForecastStages)
// route.Get("gdd/seeds", GetSeedList)
}
package services
import (
"math"
"time"
"gitlab.cs.umd.edu/dawn/dawn-go-common/common"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models/enums"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence"
"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/utils"
)
func GetStageYearData(ctx common.DawnCtx, request models.GddRequest) models.StageData {
product := enums.GetProductFromString(request.Product)
gddData := persistence.CurrentGddFindFirstByYearAndLocation(ctx, request.BuildLocation())
gdds := utils.CalculateGddValues(gddData.MinTemps, gddData.MaxTemps, product, false)
cfsData := GetCfsGddValues(request)
request.Year = gddData.AnalogYear
analogYearData := GetGddValues(ctx, request)
meanGdds := append(gdds, cfsData.GddValues...)
maxGdds := append(gdds, cfsData.UpperBound...)
minGdds := append(gdds, cfsData.LowerBound...)
if len(meanGdds) != len(analogYearData.GddValues) {
meanGdds = append(meanGdds, analogYearData.GddValues[len(meanGdds):]...)
minGdds = append(minGdds, analogYearData.GddValues[len(minGdds):]...)
maxGdds = append(maxGdds, analogYearData.GddValues[len(maxGdds):]...)
}
returnData := models.StageData{
MeanGdds: meanGdds,
MaxGdds: maxGdds,
MinGdds: minGdds,
}
return returnData
}
func CalculateStages(ctx common.DawnCtx, request models.StageRequest) map[string][]time.Time {
gddReq := models.GddRequest{
Year: request.PlantDate.Year(),
Latitude: request.Latitude,
Longitude: request.Longitude,
Accumulate: false,
Product: "corn",
}
fyData := GetStageYearData(ctx, gddReq)
start := request.PlantDate.YearDay()
year := request.PlantDate.Year()
if year%4 == 0 && year%100 != 0 || year%400 == 0 {
start -= 1
}
accMin := 0.0
accMax := 0.0
accMean := 0.0
state := map[string]models.StageStateInner{}
stageMatches := models.BuildStageMatches(request.Mode, request.Value)
for i := start; i < len(fyData.MaxGdds); i++ {
accMin += fyData.MinGdds[i]
accMax += fyData.MaxGdds[i]
accMean += fyData.MeanGdds[i]
for stage, stageVal := range stageMatches {
if val, ok := state[stage]; !ok {
state[stage] = models.StageStateInner{
MinDist: math.Abs(accMin - stageVal),
MaxDist: math.Abs(accMax - stageVal),
MeanDist: math.Abs(accMean - stageVal),
FoundMin: i,
FoundMax: i,
FoundMean: i,
}
} else {
if math.Abs(accMin-stageVal) < val.MinDist {
val.FoundMin = i
val.MinDist = math.Abs(accMin - stageVal)
state[stage] = val
}
if math.Abs(accMean-stageVal) < val.MeanDist {
val.FoundMean = i
val.MeanDist = math.Abs(accMean - stageVal)
state[stage] = val
}
if math.Abs(accMax-stageVal) < val.MaxDist {
val.FoundMax = i
val.MaxDist = math.Abs(accMax - stageVal)
state[stage] = val
}
}
}
}
ret := map[string][]time.Time{}
for stage := range stageMatches {
if year%4 == 0 && year%100 != 0 || year%400 == 0 {
state[stage] = state[stage].AddToAllFound(1)
}
ret[stage] = state[stage].ExtractDates(request.PlantDate, start)
}
return ret
}
......@@ -188,102 +188,3 @@ func CalculateRMMaturity(ctx common.DawnCtx, request models.CornRMMaturityReques
}
}
func GetStageYearData(ctx common.DawnCtx, request models.GddRequest) models.StageData {
product := enums.GetProductFromString(request.Product)
gddData := persistence.CurrentGddFindFirstByYearAndLocation(ctx, request.BuildLocation())
gdds := utils.CalculateGddValues(gddData.MinTemps, gddData.MaxTemps, product, false)
cfsData := GetCfsGddValues(request)
request.Year = gddData.AnalogYear
analogYearData := GetGddValues(ctx, request)
meanGdds := append(gdds, cfsData.GddValues...)
maxGdds := append(gdds, cfsData.UpperBound...)
minGdds := append(gdds, cfsData.LowerBound...)
if len(meanGdds) != len(analogYearData.GddValues) {
meanGdds = append(meanGdds, analogYearData.GddValues[len(meanGdds):]...)
minGdds = append(minGdds, analogYearData.GddValues[len(minGdds):]...)
maxGdds = append(maxGdds, analogYearData.GddValues[len(maxGdds):]...)
}
returnData := models.StageData{
MeanGdds: meanGdds,
MaxGdds: maxGdds,
MinGdds: minGdds,
}
return returnData
}
func CalculateStages(ctx common.DawnCtx, request models.StageRequest) map[string][]time.Time {
gddReq := models.GddRequest{
Year: request.PlantDate.Year(),
Latitude: request.Latitude,
Longitude: request.Longitude,
Accumulate: false,
Product: "corn",
}
fyData := GetStageYearData(ctx, gddReq)
start := request.PlantDate.YearDay()
year := request.PlantDate.Year()
if year%4 == 0 && year%100 != 0 || year%400 == 0 {
start -= 1
}
accMin := 0.0
accMax := 0.0
accMean := 0.0
state := map[string]models.StageStateInner{}
stageMatches := models.BuildStageMatches(request.Mode, request.Value)
for i := start; i < len(fyData.MaxGdds); i++ {
accMin += fyData.MinGdds[i]
accMax += fyData.MaxGdds[i]
accMean += fyData.MeanGdds[i]
for stage, stageVal := range stageMatches {
if val, ok := state[stage]; !ok {
state[stage] = models.StageStateInner{
MinDist: math.Abs(accMin - stageVal),
MaxDist: math.Abs(accMax - stageVal),
MeanDist: math.Abs(accMean - stageVal),
FoundMin: i,
FoundMax: i,
FoundMean: i,
}
} else {
if math.Abs(accMin-stageVal) < val.MinDist {
val.FoundMin = i
val.MinDist = math.Abs(accMin - stageVal)
state[stage] = val
}
if math.Abs(accMean-stageVal) < val.MeanDist {
val.FoundMean = i
val.MeanDist = math.Abs(accMean - stageVal)
state[stage] = val
}
if math.Abs(accMax-stageVal) < val.MaxDist {
val.FoundMax = i
val.MaxDist = math.Abs(accMax - stageVal)
state[stage] = val
}
}
}
}
ret := map[string][]time.Time{}
for stage := range stageMatches {
if year%4 == 0 && year%100 != 0 || year%400 == 0 {
state[stage] = state[stage].AddToAllFound(1)
}
ret[stage] = state[stage].ExtractDates(request.PlantDate, start)
}
return ret
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment