From a39d6957d3a9852728b799449128c6dfec44c439 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Fri, 27 May 2022 14:03:17 -0600 Subject: [PATCH 01/25] updated lib --- gradle.properties | 2 +- src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java | 3 +-- .../java/gov/usgs/earthquake/nshmp/www/ServletUtil.java | 2 +- .../java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java | 6 +++--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index 336a4f52d..a3b34da6d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ micronautVersion = 3.2.3 micronautRxVersion = 2.1.1 nodePluginVersion = 3.0.1 nodeVersion = 16.3.0 -nshmpLibVersion = 1.1.5 +nshmpLibVersion = 1.1.6 nshmpWsUtilsVersion = 0.3.11 openApiVersion = 4.0.0 shadowVersion = 7.1.2 diff --git a/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java b/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java index b4580ef94..bb5733e2f 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/HazardMaps.java @@ -15,7 +15,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import gov.usgs.earthquake.nshmp.data.Interpolator; -import gov.usgs.earthquake.nshmp.internal.Parsing; /** * Utility class to create hazard map datasets from a hazard curve results. @@ -38,7 +37,7 @@ public class HazardMaps { private static final String PROGRAM = HazardMaps.class.getSimpleName(); private static final String VALUE_FMT = "%.8e"; private static final Function<Double, String> VALUE_FORMATTER = - Parsing.formatDoubleFunction(VALUE_FMT); + Text.formatDoubleFunction(VALUE_FMT); private HazardMaps() {} diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java index 8eaadb353..759006914 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java @@ -33,7 +33,6 @@ import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.model.SiteData; import gov.usgs.earthquake.nshmp.www.meta.MetaUtil; - import io.micronaut.context.annotation.Value; import io.micronaut.context.event.ShutdownEvent; import io.micronaut.context.event.StartupEvent; @@ -49,6 +48,7 @@ import jakarta.inject.Singleton; @Singleton public class ServletUtil { + @Deprecated public static final Gson GSON; public static final Gson GSON2; diff --git a/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java index b18913f72..d4fea0777 100644 --- a/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java +++ b/src/test/java/gov/usgs/earthquake/nshmp/model/peer/PeerTest.java @@ -2,7 +2,7 @@ package gov.usgs.earthquake.nshmp.model.peer; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; -import static gov.usgs.earthquake.nshmp.internal.Parsing.Delimiter.COMMA; +import static gov.usgs.earthquake.nshmp.Text.Delimiter.COMMA; import static java.lang.Math.abs; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertArrayEquals; @@ -31,13 +31,13 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import gov.usgs.earthquake.nshmp.Maths; +import gov.usgs.earthquake.nshmp.Text; import gov.usgs.earthquake.nshmp.calc.CalcConfig; import gov.usgs.earthquake.nshmp.calc.Hazard; import gov.usgs.earthquake.nshmp.calc.HazardCalcs; import gov.usgs.earthquake.nshmp.calc.Site; import gov.usgs.earthquake.nshmp.calc.Sites; import gov.usgs.earthquake.nshmp.gmm.Imt; -import gov.usgs.earthquake.nshmp.internal.Parsing; import gov.usgs.earthquake.nshmp.model.HazardModel; class PeerTest { @@ -164,7 +164,7 @@ class PeerTest { for (String line : Iterables.skip(lines, 1)) { String[] splitLine = line.split(",", 4); String siteName = splitLine[0]; - List<Double> values = Parsing.splitToDoubleList(splitLine[3], COMMA); + List<Double> values = Text.splitToDoubleList(splitLine[3], COMMA); siteValuesMap.put(siteName, Doubles.toArray(values)); } return siteValuesMap; -- GitLab From dc5950e3d919e206c8bbbee55d3862a4e1bb2c93 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Fri, 27 May 2022 14:05:13 -0600 Subject: [PATCH 02/25] relocated source services to own package --- .../usgs/earthquake/nshmp/www/hazard/HazardService.java | 3 +-- .../nshmp/www/{services => source}/SourceController.java | 5 ++--- .../{services => source}/SourceLogicTreesController.java | 7 +++---- .../www/{services => source}/SourceLogicTreesService.java | 5 ++--- .../nshmp/www/{services => source}/SourceServices.java | 4 ++-- 5 files changed, 10 insertions(+), 14 deletions(-) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => source}/SourceController.java (94%) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => source}/SourceLogicTreesController.java (91%) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => source}/SourceLogicTreesService.java (95%) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => source}/SourceServices.java (97%) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index 3f06ebd44..b9524c8ba 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -41,8 +41,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.meta.Parameter; -import gov.usgs.earthquake.nshmp.www.services.SourceServices.SourceModel; - +import gov.usgs.earthquake.nshmp.www.source.SourceServices.SourceModel; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java similarity index 94% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceController.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index b6fe870b5..c1483066f 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -1,9 +1,8 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www.source; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; -import gov.usgs.earthquake.nshmp.www.services.SourceServices.ResponseData; - +import gov.usgs.earthquake.nshmp.www.source.SourceServices.ResponseData; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java similarity index 91% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesController.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index 253647039..fc9a8fd62 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -1,10 +1,9 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www.source; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; -import gov.usgs.earthquake.nshmp.www.services.SourceLogicTreesService.Metadata; -import gov.usgs.earthquake.nshmp.www.services.SourceLogicTreesService.RequestData; - +import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.Metadata; +import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.RequestData; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java similarity index 95% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index 97de1486d..d8b648a23 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -1,4 +1,4 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www.source; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,8 +9,7 @@ import gov.usgs.earthquake.nshmp.www.HazVersion; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; -import gov.usgs.earthquake.nshmp.www.services.SourceServices.SourceModel; - +import gov.usgs.earthquake.nshmp.www.source.SourceServices.SourceModel; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java similarity index 97% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java index 525ed76b3..342f12048 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SourceServices.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java @@ -1,4 +1,4 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www.source; import static java.util.stream.Collectors.toList; @@ -22,7 +22,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.WsUtils; import gov.usgs.earthquake.nshmp.www.meta.Parameter; - +import gov.usgs.earthquake.nshmp.www.services.RateService; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; -- GitLab From 8bc352e0efff06aaa15eb01b7817b69caad59453 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 09:05:28 -0600 Subject: [PATCH 03/25] removed stale comments --- build.gradle | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/build.gradle b/build.gradle index d501fb01b..c3b7e91b1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,32 +1,3 @@ -/* - * In order to build and run services locally, - * one needs to include the following directorie(s) in the root project (they - * are ignored by git): - * - * models/ - * ak/ - * 2007/ - * wus/ - * 2008/ - * 2014/ - * 2014b/ - * 2018/ - * ceus/ - * 2008/ - * 2014/ - * 2018/ - * - * ...with each 'year' directory being an alias to the corresponding - * git repository. One only needs to include the model they will run in the services. - * - * Then build the JAR file: ./gradlew assemble - * - * One can then specify the model to run in the services: - * java -jar build/libs/nshmp-haz.jar --models=/path/to/models - * - * Where <MODEL> is one of the model enums in nshmp.www.Model - */ - plugins { id "application" id "com.diffplug.spotless" version "${spotlessVersion}" -- GitLab From ba41091d7416b6036c096e57f61092159fcdc52f Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 09:05:53 -0600 Subject: [PATCH 04/25] consistent controller javadocs --- .../nshmp/www/hazard/DisaggController.java | 7 ++++++- .../nshmp/www/hazard/HazardController.java | 7 ++++++- .../nshmp/www/services/RateController.java | 9 ++++++--- .../nshmp/www/source/SourceController.java | 12 ++++++------ .../nshmp/www/source/SourceLogicTreesController.java | 10 ++++++++-- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java index 3f2fdc3f1..abbdf3986 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java @@ -15,7 +15,6 @@ import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestIml; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestRp; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.Response; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; - import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -35,6 +34,12 @@ import jakarta.inject.Inject; * Micronaut web service controller for disaggregation of probabilistic seismic * hazard. * + * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed + * model. + * + * <p>To run the Micronaut jar file with a model: java -jar + * path/to/nshmp-haz.jar --model=<path/to/model> + * * @author U.S. Geological Survey */ @Tag( diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java index e6680a3a9..813d5cb25 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java @@ -9,7 +9,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Response; - import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -29,6 +28,12 @@ import jakarta.inject.Inject; * Micronaut web service controller for probabilistic seismic hazard * calculations. * + * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed + * model. + * + * <p>To run the Micronaut jar file with a model: java -jar + * path/to/nshmp-haz.jar --model=<path/to/model> + * * @author U.S. Geological Survey */ @Tag( diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java index 489614777..067e9dfb2 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java @@ -11,7 +11,6 @@ import gov.usgs.earthquake.nshmp.www.services.RateService.RequestData; import gov.usgs.earthquake.nshmp.www.services.RateService.ResponseData; import gov.usgs.earthquake.nshmp.www.services.RateService.Service; import gov.usgs.earthquake.nshmp.www.services.RateService.Usage; - import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -27,9 +26,13 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.inject.Inject; /** - * Micronaut controller for rate and probability services. + * Micronaut web service controller for rate and probability calcuations. + * + * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed + * model. * - * @see RateService + * <p>To run the Micronaut jar file with a model: java -jar + * path/to/nshmp-haz.jar --model=<path/to/model> * * @author U.S. Geological Survey */ diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index c1483066f..0029222ec 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -16,14 +16,14 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.inject.Inject; /** - * Source model service to return the current installed model. + * Micronaut web service controller to return metadata on the current installed + * model. * - * <p> See src/main/resources/applicaiton.yml nshmp-haz.installed-model for - * default model used - * - * <p> To run the Micronaut jar file with a model: java -jar - * path/to/nshmp-haz.jar -model=<{@code Model}> + * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed + * model. * + * <p>To run the Micronaut jar file with a model: java -jar + * path/to/nshmp-haz.jar --model=<path/to/model> * * @author U.S. Geological Survey */ diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index fc9a8fd62..d53e722a6 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -17,9 +17,15 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.inject.Inject; /** - * Micronaut controller for NSHM source logic trees. + * Micronaut web service controller for the source logic trees in the current + * installed model. + * + * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed + * model. + * + * <p>To run the Micronaut jar file with a model: java -jar + * path/to/nshmp-haz.jar --model=<path/to/model> * - * @see SourceLogicTreesService * @author U.S. Geological Survey */ @Tag( -- GitLab From 3aa4d1b03d901a35d283d4eae03a15831082180e Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 10:33:18 -0600 Subject: [PATCH 05/25] updated swagger metadata for consistency --- .../nshmp/www/hazard/DisaggController.java | 23 +++++++++++-------- .../nshmp/www/hazard/HazardController.java | 19 +++++++-------- .../nshmp/www/services/SwaggerController.java | 5 +--- .../nshmp/www/source/SourceController.java | 18 +++++++-------- .../source/SourceLogicTreesController.java | 22 +++++++++--------- .../www/source/SourceLogicTreesService.java | 4 ++-- .../nshmp/www/source/SourceServices.java | 2 +- 7 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java index abbdf3986..ec4b3e120 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java @@ -43,8 +43,8 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Disaggregation", - description = "USGS NSHMP hazard disaggregation service") + name = "Hazard Disaggregation", + description = "USGS NSHM hazard disaggregation service") @Controller("/disagg") public class DisaggController { @@ -73,9 +73,9 @@ public class DisaggController { } /** - * @param longitude Longitude in the range - * @param latitude Latitude in the range - * @param vs30 Site Vs30 value in the range [150..3000] m/s. + * @param longitude Longitude in decimal degrees in the range + * @param latitude Latitude in decimal degrees in the range + * @param vs30 Site Vs30 value in the range [150..3000] m/s * @param returnPeriod The return period of the target ground motion, or * intensity measure level (IML), in the range [1..20000] years. * @param imt Optional IMTs at which to compute hazard. If none are supplied, @@ -85,7 +85,8 @@ public class DisaggController { */ @Operation( summary = "Disaggregate hazard at a specified return period", - description = "Returns a hazard disaggregation computed from the installed model") + description = "Returns a hazard disaggregation computed from the installed model", + operationId = "disagg-calc-rp") @ApiResponse( description = "Disaggregation", responseCode = "200", @@ -124,14 +125,16 @@ public class DisaggController { } /** - * @param longitude Longitude in the range - * @param latitude Latitude in decimal degrees - * @param vs30 Site Vs30 value in the range [150..3000] m/s. + * @param longitude Longitude in decimal degrees in the range + * @param latitude Latitude in decimal degrees in the range + * @param vs30 Site Vs30 value in the range [150..3000] m/s + * @param imls Mapping of IMTs to disaggregation intensity measure levels * @param out The data types to output */ @Operation( summary = "Disaggregate hazard at specified IMLs", - description = "Returns a hazard disaggregation computed from the installed model") + description = "Returns a hazard disaggregation computed from the installed model", + operationId = "disagg-calc-iml") @ApiResponse( description = "Disaggregation", responseCode = "200", diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java index 813d5cb25..67796e5ec 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java @@ -37,8 +37,8 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Hazard", - description = "USGS NSHMP hazard calculation service") + name = "Hazard Calculation", + description = "USGS NSHM hazard calculation service") @Controller("/hazard") public class HazardController { @@ -46,7 +46,7 @@ public class HazardController { private NshmpMicronautServlet servlet; @Operation( - summary = "Hazard model and service metadata", + summary = "Hazard calculation model and service metadata", description = "Returns details of the installed model and service request parameters", operationId = "hazard-metadata") @ApiResponse( @@ -67,18 +67,19 @@ public class HazardController { } /** - * @param longitude Longitude in decimal degrees - * @param latitude Latitude in decimal degrees - * @param vs30 Site Vs30 value in m/s [150..3000] - * @param truncate Truncate curves at return periods below ~10,000 years - * @param maxdir Apply max-direction scaling + * @param longitude Longitude in decimal degrees in the range + * @param latitude Latitude in decimal degrees in the range + * @param vs30 Site Vs30 value in the range [150..3000] m/s + * @param truncate Truncate curves at return periods below ~10,000 years. + * @param maxdir Apply max-direction scaling. * @param imt Optional IMTs at which to compute hazard. If none are supplied, * then the supported set for the installed model is used. Responses * for numerous IMT's are quite large, on the order of MB. */ @Operation( summary = "Compute probabilisitic hazard at a site", - description = "Returns hazard curves computed from the installed model") + description = "Returns hazard curves computed from the installed model", + operationId = "hazard-calc") @ApiResponse( description = "Hazard curves", responseCode = "200", diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java index cae6aed6c..294bac975 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java @@ -3,7 +3,6 @@ package gov.usgs.earthquake.nshmp.www.services; import java.util.List; import java.util.Map; import java.util.logging.Logger; -import java.util.stream.Collectors; import org.slf4j.LoggerFactory; @@ -12,7 +11,6 @@ import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.SwaggerUtils; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -62,8 +60,7 @@ public class SwaggerController { var components = openApi.getComponents(); var schemas = components.getSchemas(); SwaggerUtils.siteClassSchema(schemas, List.copyOf(model.siteClasses().keySet())); - SwaggerUtils.imtSchema(schemas, - model.config().hazard.imts.stream().collect(Collectors.toList())); + SwaggerUtils.imtSchema(schemas, List.copyOf(model.config().hazard.imts)); openApi.servers(null); openApi.getInfo().setTitle(model.name() + " Web Services"); diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 0029222ec..05b8c8fc0 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -16,7 +16,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.inject.Inject; /** - * Micronaut web service controller to return metadata on the current installed + * Micronaut web service controller to return metadata for the current installed * model. * * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed @@ -27,7 +27,9 @@ import jakarta.inject.Inject; * * @author U.S. Geological Survey */ -@Tag(name = "Source Model") +@Tag( + name = "Source Model Information", + description = "USGS NSHM source model metadata service") @Controller("/source") public class SourceController { @@ -35,15 +37,13 @@ public class SourceController { private NshmpMicronautServlet servlet; /** - * GET method to return the source model usage - * * @param request The HTTP request */ @Operation( - summary = "Returns the metadata about the current installed NSHM", + summary = "Returns metadata about the current installed NSHM", description = "Returns the install National Hazard Model with supported:\n" + - "* Intensity measure types (IMT)\n * VS30\n * Region bounds\n * Return period", - operationId = "source_doGetUsage") + "* Intensity measure types (IMT)\n * Vs30\n * Region bounds\n * Return period", + operationId = "source-model-metadata") @ApiResponse( description = "Installed source model", responseCode = "200", @@ -51,8 +51,8 @@ public class SourceController { schema = @Schema( implementation = MetadataResponse.class))) @Get(produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetUsage(HttpRequest<?> request) { - return SourceServices.handleDoGetUsage(request); + public HttpResponse<String> doGetMetadata(HttpRequest<?> request) { + return SourceServices.getMetadata(request); } // For Swagger schemas diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index d53e722a6..1fedc59f2 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -29,8 +29,8 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Source Logic Trees", - description = "NSHM source logic trees service") + name = "Source Model Logic Trees", + description = "USGS NSHM source model logic trees service") @Controller("/trees") public class SourceLogicTreesController { @@ -38,9 +38,9 @@ public class SourceLogicTreesController { private NshmpMicronautServlet servlet; @Operation( - description = "Returns the tectonic setting to source logic trees in the NSHM", - operationId = "trees_doGetMetadata", - summary = "Hazard model source logic trees") + summary = "Source model logic tree listing", + description = "Returns the ID's of logic trees in the model", + operationId = "trees-metadata") @ApiResponse( description = "Source logic trees metadata", responseCode = "200", @@ -49,24 +49,24 @@ public class SourceLogicTreesController { implementation = MetadataResponse.class))) @Get public HttpResponse<String> doGetMetadata(HttpRequest<?> request) { - return SourceLogicTreesService.handleDoGetMetadata(request); + return SourceLogicTreesService.getMetadata(request); } /** * @param id Source tree id */ @Operation( - description = "Returns the source logic tree for an id", - operationId = "trees_goGetTrees", - summary = "Get NSHM source logic tree") + summary = "Get a source model MFD logic tree", + description = "Returns the logic tree of MFDs for the supplied ID", + operationId = "trees-mfds") @ApiResponse( description = "NSHM source logic tree", responseCode = "200", content = @Content( schema = @Schema(implementation = TreeResponse.class))) @Get(uri = "/{id}") - public HttpResponse<String> doGetTrees(HttpRequest<?> request, @PathVariable int id) { - return SourceLogicTreesService.handleDoGetTrees(request, id); + public HttpResponse<String> doGetTree(HttpRequest<?> request, @PathVariable int id) { + return SourceLogicTreesService.getTree(request, id); } // For Swagger schemas diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index d8b648a23..78659016e 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -27,7 +27,7 @@ public class SourceLogicTreesService { private static final String NAME = "Source Logic Trees"; /** SourceLogicTreesController.doGetMetadata() handler */ - public static HttpResponse<String> handleDoGetMetadata(HttpRequest<?> request) { + public static HttpResponse<String> getMetadata(HttpRequest<?> request) { var url = request.getUri().getPath(); try { @@ -46,7 +46,7 @@ public class SourceLogicTreesService { } /** SourceLogicTreesController.doGetTrees() handler */ - public static HttpResponse<String> handleDoGetTrees(HttpRequest<?> request, Integer id) { + public static HttpResponse<String> getTree(HttpRequest<?> request, Integer id) { var url = request.getUri().getPath(); try { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java index 342f12048..14c157245 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java @@ -51,7 +51,7 @@ public class SourceServices { .create(); } - static HttpResponse<String> handleDoGetUsage(HttpRequest<?> request) { + static HttpResponse<String> getMetadata(HttpRequest<?> request) { var url = request.getUri().getPath(); try { var response = ResponseBody.usage() -- GitLab From 578d18ff167502e2206560b9bf08e32f69536647 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 10:35:15 -0600 Subject: [PATCH 06/25] renamed sourceServices --- .../gov/usgs/earthquake/nshmp/www/hazard/HazardService.java | 2 +- .../usgs/earthquake/nshmp/www/source/SourceController.java | 4 ++-- .../earthquake/nshmp/www/source/SourceLogicTreesService.java | 2 +- .../www/source/{SourceServices.java => SourceService.java} | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/gov/usgs/earthquake/nshmp/www/source/{SourceServices.java => SourceService.java} (99%) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index b9524c8ba..ad1783434 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -41,7 +41,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.meta.Parameter; -import gov.usgs.earthquake.nshmp.www.source.SourceServices.SourceModel; +import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 05b8c8fc0..a3f9fc712 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -2,7 +2,7 @@ package gov.usgs.earthquake.nshmp.www.source; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; -import gov.usgs.earthquake.nshmp.www.source.SourceServices.ResponseData; +import gov.usgs.earthquake.nshmp.www.source.SourceService.ResponseData; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -52,7 +52,7 @@ public class SourceController { implementation = MetadataResponse.class))) @Get(produces = MediaType.APPLICATION_JSON) public HttpResponse<String> doGetMetadata(HttpRequest<?> request) { - return SourceServices.getMetadata(request); + return SourceService.getMetadata(request); } // For Swagger schemas diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index 78659016e..223bc6b09 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -9,7 +9,7 @@ import gov.usgs.earthquake.nshmp.www.HazVersion; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; -import gov.usgs.earthquake.nshmp.www.source.SourceServices.SourceModel; +import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java similarity index 99% rename from src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index 14c157245..1640ea8f6 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceServices.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -34,7 +34,7 @@ import jakarta.inject.Singleton; * @author U.S. Geological Survey */ @Singleton -public class SourceServices { +public class SourceService { private static final String NAME = "Source Model"; -- GitLab From ea61c10ed742cc4f953306984b4e790a759de633 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 11:20:59 -0600 Subject: [PATCH 07/25] source service edits --- .../nshmp/www/hazard/DisaggService.java | 6 +- .../nshmp/www/hazard/HazardService.java | 4 +- .../nshmp/www/source/SourceController.java | 12 +++- .../source/SourceLogicTreesController.java | 23 ++++++-- .../www/source/SourceLogicTreesService.java | 57 +++++++------------ .../nshmp/www/source/SourceService.java | 51 +++++------------ 6 files changed, 68 insertions(+), 85 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java index abd46fdc8..fc33e3c0b 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java @@ -36,7 +36,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.HazardRequest; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.meta.Parameter; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -60,6 +59,7 @@ public final class DisaggService { static final String NAME = "Disaggregation Service"; static final Logger LOG = LoggerFactory.getLogger(DisaggService.class); + // TODO range check return periods and imls private static Range<Double> rpRange = Range.closed(1.0, 20000.0); private static Range<Double> imlRange = Range.closed(0.0001, 8.0); @@ -70,7 +70,6 @@ public final class DisaggService { DISAGG_DATA; } - /** HazardController.doGetMetadata() handler. */ static HttpResponse<String> getMetadata(HttpRequest<?> request) { var url = request.getUri().toString(); var usage = new Metadata(ServletUtil.model()); @@ -85,7 +84,6 @@ public final class DisaggService { return HttpResponse.ok(svcResponse); } - /** HazardController.doGetDisaggIml() handler. */ static HttpResponse<String> getDisaggIml(RequestIml request) throws InterruptedException, ExecutionException { var stopwatch = Stopwatch.createStarted(); @@ -106,7 +104,6 @@ public final class DisaggService { return HttpResponse.ok(svcResponse); } - /** HazardController.doGetDisaggRp() handler. */ static HttpResponse<String> getDisaggRp(RequestRp request) throws InterruptedException, ExecutionException { var stopwatch = Stopwatch.createStarted(); @@ -132,7 +129,6 @@ public final class DisaggService { * * If disaggIml, we need to do the calculation for single XySeqs if disaggRp, * we don't know the imls so must compute hazard over the full curve - * */ private static Disaggregation calcDisaggIml(RequestIml request) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index ad1783434..91d18f9f0 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -60,7 +60,6 @@ public final class HazardService { private static final String TOTAL_KEY = "Total"; - /** HazardController.doGetUsage() handler. */ public static HttpResponse<String> getMetadata(HttpRequest<?> request) { var url = request.getUri().toString(); var usage = new Metadata(ServletUtil.model()); @@ -75,7 +74,6 @@ public final class HazardService { return HttpResponse.ok(json); } - /** HazardController.doGetHazard() handler. */ public static HttpResponse<String> getHazard(Request request) throws InterruptedException, ExecutionException { var stopwatch = Stopwatch.createStarted(); @@ -105,7 +103,7 @@ public final class HazardService { * apply truncation and scaling on the client. */ - public static Hazard calcHazard(Request request) + static Hazard calcHazard(Request request) throws InterruptedException, ExecutionException { HazardModel model = ServletUtil.model(); diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index a3f9fc712..498a0f05f 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -2,6 +2,7 @@ package gov.usgs.earthquake.nshmp.www.source; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; +import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.ResponseData; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -51,8 +52,15 @@ public class SourceController { schema = @Schema( implementation = MetadataResponse.class))) @Get(produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetMetadata(HttpRequest<?> request) { - return SourceService.getMetadata(request); + public HttpResponse<String> doGetMetadata(HttpRequest<?> http) { + try { + return SourceService.getMetadata(http); + } catch (Exception e) { + return ServletUtil.error( + SourceService.LOG, e, + SourceService.NAME, + http.getUri().toString()); + } } // For Swagger schemas diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index 1fedc59f2..54b94e597 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -2,6 +2,7 @@ package gov.usgs.earthquake.nshmp.www.source; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; +import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.Metadata; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.RequestData; import io.micronaut.http.HttpRequest; @@ -48,8 +49,15 @@ public class SourceLogicTreesController { schema = @Schema( implementation = MetadataResponse.class))) @Get - public HttpResponse<String> doGetMetadata(HttpRequest<?> request) { - return SourceLogicTreesService.getMetadata(request); + public HttpResponse<String> doGetMetadata(HttpRequest<?> http) { + try { + return SourceLogicTreesService.getMetadata(http); + } catch (Exception e) { + return ServletUtil.error( + SourceLogicTreesService.LOG, e, + SourceLogicTreesService.NAME, + http.getUri().toString()); + } } /** @@ -65,8 +73,15 @@ public class SourceLogicTreesController { content = @Content( schema = @Schema(implementation = TreeResponse.class))) @Get(uri = "/{id}") - public HttpResponse<String> doGetTree(HttpRequest<?> request, @PathVariable int id) { - return SourceLogicTreesService.getTree(request, id); + public HttpResponse<String> doGetTree(HttpRequest<?> http, @PathVariable int id) { + try { + return SourceLogicTreesService.getTree(http, id); + } catch (Exception e) { + return ServletUtil.error( + SourceLogicTreesService.LOG, e, + SourceLogicTreesService.NAME, + http.getUri().toString()); + } } // For Swagger schemas diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index 223bc6b09..8fca5403a 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -22,47 +22,34 @@ import jakarta.inject.Singleton; @Singleton public class SourceLogicTreesService { + static final String NAME = "Source Logic Trees"; static final Logger LOG = LoggerFactory.getLogger(SourceLogicTreesService.class); - private static final String NAME = "Source Logic Trees"; - - /** SourceLogicTreesController.doGetMetadata() handler */ public static HttpResponse<String> getMetadata(HttpRequest<?> request) { - var url = request.getUri().getPath(); - - try { - var metadata = new Metadata(ServletUtil.model()); - var response = ResponseBody.usage() - .name(NAME) - .url(url) - .metadata(new ResponseMetadata(HazVersion.appVersions())) - .request(url) - .response(metadata) - .build(); - return HttpResponse.ok(ServletUtil.GSON.toJson(response)); - } catch (Exception e) { - return ServletUtil.error(LOG, e, NAME, url); - } + var url = request.getUri().toString(); + var metadata = new Metadata(ServletUtil.model()); + var response = ResponseBody.usage() + .name(NAME) + .url(url) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(url) + .response(metadata) + .build(); + return HttpResponse.ok(ServletUtil.GSON2.toJson(response)); } - /** SourceLogicTreesController.doGetTrees() handler */ public static HttpResponse<String> getTree(HttpRequest<?> request, Integer id) { - var url = request.getUri().getPath(); - - try { - var tree = Models.tree(ServletUtil.model(), id); - var requestData = new RequestData(id); - var response = ResponseBody.success() - .name(NAME) - .url(url) - .metadata(new ResponseMetadata(HazVersion.appVersions())) - .request(requestData) - .response(tree) - .build(); - return HttpResponse.ok(ServletUtil.GSON.toJson(response)); - } catch (Exception e) { - return ServletUtil.error(LOG, e, NAME, url); - } + var url = request.getUri().toString(); + var tree = Models.tree(ServletUtil.model(), id); + var requestData = new RequestData(id); + var response = ResponseBody.success() + .name(NAME) + .url(url) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(requestData) + .response(tree) + .build(); + return HttpResponse.ok(ServletUtil.GSON2.toJson(response)); } static class RequestData { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index 1640ea8f6..c725ecb00 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -9,63 +9,42 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - import gov.usgs.earthquake.nshmp.gmm.Gmm; -import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.www.HazVersion; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; -import gov.usgs.earthquake.nshmp.www.WsUtils; import gov.usgs.earthquake.nshmp.www.meta.Parameter; -import gov.usgs.earthquake.nshmp.www.services.RateService; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; /** - * Entry point for services related to source models. Current services: - * <ul><li>/source/</li></ul> + * Source model service. * * @author U.S. Geological Survey */ @Singleton public class SourceService { - private static final String NAME = "Source Model"; - - static final Logger LOG = LoggerFactory.getLogger(RateService.class); - - public static final Gson GSON; - - static { - GSON = new GsonBuilder() - .registerTypeAdapter(Imt.class, new WsUtils.EnumSerializer<Imt>()) - .disableHtmlEscaping() - .serializeNulls() - .setPrettyPrinting() - .create(); - } + static final String NAME = "Source Model"; + static final Logger LOG = LoggerFactory.getLogger(SourceService.class); static HttpResponse<String> getMetadata(HttpRequest<?> request) { - var url = request.getUri().getPath(); - try { - var response = ResponseBody.usage() - .name(NAME) - .url(url) - .metadata(new ResponseMetadata(HazVersion.appVersions())) - .request(url) - .response(new ResponseData()) - .build(); - var json = GSON.toJson(response); - return HttpResponse.ok(json); - } catch (Exception e) { - return ServletUtil.error(LOG, e, NAME, url); - } + var url = request.getUri().toString(); + var response = ResponseBody.usage() + .name(NAME) + .url(url) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(url) + .response(new ResponseData()) + .build(); + // TODO check other services for url) and + // request() passing in the same url obj + var json = ServletUtil.GSON2.toJson(response); + return HttpResponse.ok(json); } static class ResponseData { -- GitLab From 96c9fe873b417f305835697dcd92e1e19f926691 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 11:24:40 -0600 Subject: [PATCH 08/25] relocated swagger and rate services --- .../www/{services => }/SwaggerController.java | 3 +-- .../www/{services => source}/RateController.java | 16 ++++++++-------- .../www/{services => source}/RateService.java | 2 +- .../nshmp/www/source/SourceController.java | 2 ++ 4 files changed, 12 insertions(+), 11 deletions(-) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => }/SwaggerController.java (96%) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => source}/RateController.java (93%) rename src/main/java/gov/usgs/earthquake/nshmp/www/{services => source}/RateService.java (99%) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java similarity index 96% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java index 294bac975..169c4488a 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/SwaggerController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java @@ -1,4 +1,4 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www; import java.util.List; import java.util.Map; @@ -9,7 +9,6 @@ import org.slf4j.LoggerFactory; import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; -import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.SwaggerUtils; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java similarity index 93% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java index 067e9dfb2..611d078d3 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java @@ -1,16 +1,16 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www.source; import java.util.Optional; import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; -import gov.usgs.earthquake.nshmp.www.services.RateService.ProbabilityParameters; -import gov.usgs.earthquake.nshmp.www.services.RateService.Query; -import gov.usgs.earthquake.nshmp.www.services.RateService.RateParameters; -import gov.usgs.earthquake.nshmp.www.services.RateService.RequestData; -import gov.usgs.earthquake.nshmp.www.services.RateService.ResponseData; -import gov.usgs.earthquake.nshmp.www.services.RateService.Service; -import gov.usgs.earthquake.nshmp.www.services.RateService.Usage; +import gov.usgs.earthquake.nshmp.www.source.RateService.ProbabilityParameters; +import gov.usgs.earthquake.nshmp.www.source.RateService.Query; +import gov.usgs.earthquake.nshmp.www.source.RateService.RateParameters; +import gov.usgs.earthquake.nshmp.www.source.RateService.RequestData; +import gov.usgs.earthquake.nshmp.www.source.RateService.ResponseData; +import gov.usgs.earthquake.nshmp.www.source.RateService.Service; +import gov.usgs.earthquake.nshmp.www.source.RateService.Usage; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java similarity index 99% rename from src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java rename to src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java index a084a6a0a..bc380cf4d 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/services/RateService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java @@ -1,4 +1,4 @@ -package gov.usgs.earthquake.nshmp.www.services; +package gov.usgs.earthquake.nshmp.www.source; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 498a0f05f..831019296 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -34,6 +34,8 @@ import jakarta.inject.Inject; @Controller("/source") public class SourceController { + // TODO consider renaming to /model + @Inject private NshmpMicronautServlet servlet; -- GitLab From e0217a8b2be6ad793abcf87642d95d395d6b1d18 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Mon, 30 May 2022 11:48:00 -0600 Subject: [PATCH 09/25] removed query based rate and prob endpoints --- .../nshmp/www/source/RateController.java | 101 +----------------- .../source/SourceLogicTreesController.java | 10 +- 2 files changed, 9 insertions(+), 102 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java index 611d078d3..38c8dc751 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java @@ -18,11 +18,11 @@ import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.PathVariable; -import io.micronaut.http.annotation.QueryValue; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.inject.Inject; /** @@ -36,57 +36,15 @@ import jakarta.inject.Inject; * * @author U.S. Geological Survey */ +@Tag( + name = "Rate Calculation", + description = "USGS NSHM hazard calculation service") @Controller("/") public class RateController { @Inject private NshmpMicronautServlet servlet; - /** - * GET method to compute annual-rate, query based. - * - * @param request The HTTP request - * @param longitude Longitude (in decimal degrees) - * @param latitude Latitude (in decimal degrees) - * @param distance Cutoff distance (in km) ([0.01, 1000]) - */ - @Operation( - summary = "Compute earthquake annual-rates", - description = "Compute incremental earthquake annual-rates at a location", - operationId = "rate_doGetRate", - tags = { "Rate Service" }) - @ApiResponse( - description = "Earthquake annual-rates service metadata", - responseCode = "20x", - content = { - @Content( - schema = @Schema(implementation = RateMetadataResponse.class)) - }) - @ApiResponse( - description = "Earthquake annual-rates calculation response", - responseCode = "200", - content = { - @Content( - schema = @Schema(implementation = CalcResponse.class)) - }) - @Get( - uri = "/rate{?longitude,latitude,distance}", - produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetRate( - HttpRequest<?> request, - @Schema( - required = true) @QueryValue @Nullable Double longitude, - @Schema( - required = true) @QueryValue @Nullable Double latitude, - @Schema( - required = true, - minimum = "0.01", - maximum = "1000") @QueryValue @Nullable Double distance) { - var service = Service.RATE; - var query = new Query(service, longitude, latitude, distance, Optional.empty()); - return RateService.handleDoGetCalc(request, query); - } - /** * GET method to compute annual-rate, slash based * @@ -123,57 +81,6 @@ public class RateController { return RateService.handleDoGetCalc(request, query); } - /** - * GET method to compute probability, query based. - * - * @param request The HTTP request - * @param longitude Longitude (in decimal degrees) - * @param latitude Latitude (in decimal degrees) - * @param distance Cutoff distance (in km) ([0.01, 1000]) - * @param timespan Forcast time span (in years) ([1, 10000]) - */ - @Operation( - summary = "Compute earthquake probabilities", - description = "Compute cumulative earthquake probabilities P(M ≥ x) at a location", - operationId = "probability_doGetProbability", - tags = { "Probability Service" }) - @ApiResponse( - description = "Earthquake probabilities service metadata", - responseCode = "20x", - content = { - @Content( - schema = @Schema(implementation = ProbMetadataResponse.class)) - }) - @ApiResponse( - description = "Earthquake probabilities calculation response", - responseCode = "200", - content = { - @Content( - schema = @Schema( - implementation = CalcResponse.class)) - }) - @Get( - uri = "/probability{?longitude,latitude,distance,timespan}", - produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetProbability( - HttpRequest<?> request, - @Schema( - required = true) @QueryValue @Nullable Double longitude, - @Schema( - required = true) @QueryValue @Nullable Double latitude, - @Schema( - required = true, - minimum = "0.01", - maximum = "1000") @QueryValue @Nullable Double distance, - @Schema( - required = true, - minimum = "1", - maximum = "10000") @QueryValue @Nullable Double timespan) { - var service = Service.PROBABILITY; - var query = new Query(service, longitude, latitude, distance, Optional.ofNullable(timespan)); - return RateService.handleDoGetCalc(request, query); - } - /** * GET method to compute probability, slash based * diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index 54b94e597..4d4ad88d3 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -30,8 +30,8 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Source Model Logic Trees", - description = "USGS NSHM source model logic trees service") + name = "Source Model Logic Tree", + description = "USGS NSHM source model logic tree service") @Controller("/trees") public class SourceLogicTreesController { @@ -41,9 +41,9 @@ public class SourceLogicTreesController { @Operation( summary = "Source model logic tree listing", description = "Returns the ID's of logic trees in the model", - operationId = "trees-metadata") + operationId = "source-tree-metadata") @ApiResponse( - description = "Source logic trees metadata", + description = "Source logic tree metadata", responseCode = "200", content = @Content( schema = @Schema( @@ -66,7 +66,7 @@ public class SourceLogicTreesController { @Operation( summary = "Get a source model MFD logic tree", description = "Returns the logic tree of MFDs for the supplied ID", - operationId = "trees-mfds") + operationId = "source-tree-mfds") @ApiResponse( description = "NSHM source logic tree", responseCode = "200", -- GitLab From dca28e6712bbf1353c583464adc8f9cf6061973d Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Tue, 31 May 2022 11:39:02 -0600 Subject: [PATCH 10/25] refactored rate and probability to match other services --- .../nshmp/www/hazard/DisaggController.java | 16 +- .../nshmp/www/hazard/HazardController.java | 9 +- .../nshmp/www/hazard/HazardService.java | 2 +- .../nshmp/www/source/RateController.java | 131 ++- .../nshmp/www/source/RateService.java | 830 +++++++++++++----- .../nshmp/www/source/SourceController.java | 2 +- .../source/SourceLogicTreesController.java | 4 +- 7 files changed, 654 insertions(+), 340 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java index ec4b3e120..7cfabb08b 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java @@ -111,10 +111,7 @@ public class DisaggController { Set<Imt> imts = HazardService.readImts(http); Set<DataType> dataTypes = HazardService.readDataTypes(http); DisaggService.RequestRp request = new DisaggService.RequestRp( - http, - longitude, latitude, vs30, imts, - returnPeriod, - dataTypes); + http, longitude, latitude, vs30, imts, returnPeriod, dataTypes); return DisaggService.getDisaggRp(request); } catch (Exception e) { return ServletUtil.error( @@ -158,10 +155,7 @@ public class DisaggController { checkArgument(!imtImlMap.isEmpty(), "No IMLs supplied"); Set<DataType> dataTypes = HazardService.readDataTypes(http); DisaggService.RequestIml request = new DisaggService.RequestIml( - http, - longitude, latitude, vs30, - imtImlMap, - dataTypes); + http, longitude, latitude, vs30, imtImlMap, dataTypes); return DisaggService.getDisaggIml(request); } catch (Exception e) { return ServletUtil.error( @@ -171,12 +165,12 @@ public class DisaggController { } } - // For Swagger schema + // Swagger schema private static class DisaggResponseIml extends ResponseBody<RequestIml, Response> {} - // For Swagger schema + // Swagger schema private static class DisaggResponseReturnPeriod extends ResponseBody<RequestRp, Response> {} - // For Swagger schema + // Swagger schema private static class MetadataResponse extends ResponseBody<String, Metadata> {}; } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java index 67796e5ec..2bf31c566 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java @@ -103,10 +103,7 @@ public class HazardController { try { Set<Imt> imts = HazardService.readImts(http); HazardService.Request request = new HazardService.Request( - http, - longitude, latitude, vs30, - imts, - truncate, maxdir); + http, longitude, latitude, vs30, imts, truncate, maxdir); return HazardService.getHazard(request); } catch (Exception e) { return ServletUtil.error( @@ -116,9 +113,9 @@ public class HazardController { } } - // For Swagger schemas + // Swagger schema private static class HazardResponse extends ResponseBody<Request, Response> {} - // For Swagger schemas + // Swagger schema private static class MetadataResponse extends ResponseBody<String, Metadata> {}; } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index 91d18f9f0..68c8a4e90 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -134,7 +134,7 @@ public final class HazardService { Metadata(HazardModel model) { this.model = new SourceModel(model); - // should get min max from model + // TODO should get min max from model (fix via swagger openapi injection) longitude = new DoubleParameter( "Longitude", "°", diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java index 38c8dc751..9b73ab2ac 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java @@ -1,17 +1,11 @@ package gov.usgs.earthquake.nshmp.www.source; -import java.util.Optional; - import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; -import gov.usgs.earthquake.nshmp.www.source.RateService.ProbabilityParameters; -import gov.usgs.earthquake.nshmp.www.source.RateService.Query; -import gov.usgs.earthquake.nshmp.www.source.RateService.RateParameters; -import gov.usgs.earthquake.nshmp.www.source.RateService.RequestData; -import gov.usgs.earthquake.nshmp.www.source.RateService.ResponseData; -import gov.usgs.earthquake.nshmp.www.source.RateService.Service; -import gov.usgs.earthquake.nshmp.www.source.RateService.Usage; -import io.micronaut.core.annotation.Nullable; +import gov.usgs.earthquake.nshmp.www.ServletUtil; +import gov.usgs.earthquake.nshmp.www.source.RateService.Metadata; +import gov.usgs.earthquake.nshmp.www.source.RateService.Request; +import gov.usgs.earthquake.nshmp.www.source.RateService.Response; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -26,7 +20,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.inject.Inject; /** - * Micronaut web service controller for rate and probability calcuations. + * Micronaut web service controller for rate calcuations. * * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed * model. @@ -37,97 +31,74 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Rate Calculation", - description = "USGS NSHM hazard calculation service") -@Controller("/") + name = "Earthquake Rate Calculation", + description = "USGS NSHM earthquake rate calculation service") +@Controller("/rate") public class RateController { @Inject private NshmpMicronautServlet servlet; - /** - * GET method to compute annual-rate, slash based - * - * @param request The HTTP request - * @param longitude Longitude (in decimal degrees) - * @param latitude Latitude (in decimal degrees) - * @param distance Cutoff distance (in km) ([0.01, 1000]) - */ @Operation( - summary = "Compute earthquake annual-rates", - description = "Compute incremental earthquake annual-rates at a location", - operationId = "rate_doGetRateSlash", - tags = { "Rate Service" }) + summary = "Earthquake rate calculation model and service metadata", + description = "Returns details of the installed model and service request parameters", + operationId = "rate-metadata") @ApiResponse( - description = "Earthquake annual-rates calculation response", + description = "Rate service metadata", responseCode = "200", content = @Content( - schema = @Schema(implementation = CalcResponse.class))) - @Get( - uri = "/rate{/longitude}{/latitude}{/distance}", - produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetRateSlash( - HttpRequest<?> request, - @Schema( - required = true) @PathVariable @Nullable Double longitude, - @Schema( - required = true) @PathVariable @Nullable Double latitude, - @Schema( - required = true, - minimum = "0.01", - maximum = "1000") @PathVariable @Nullable Double distance) { - var service = Service.RATE; - var query = new Query(service, longitude, latitude, distance, Optional.empty()); - return RateService.handleDoGetCalc(request, query); + schema = @Schema(implementation = RateMetadata.class))) + @Get(produces = MediaType.APPLICATION_JSON) + public HttpResponse<String> doGetRateMetadata(HttpRequest<?> http) { + try { + return RateService.getRateMetadata(http); + } catch (Exception e) { + return ServletUtil.error( + RateService.LOG, e, + RateService.NAME_RATE, + http.getUri().toString()); + } } /** - * GET method to compute probability, slash based - * - * @param request The HTTP request - * @param longitude Longitude (in decimal degrees) - * @param latitude Latitude (in decimal degrees) - * @param distance Cutoff distance (in km) ([0.01, 1000]) - * @param timespan Forecast time span (in years) ([1, 10000]) + * @param longitude Longitude in decimal degrees in the range + * @param latitude Latitude in decimal degrees in the range + * @param distance Cutoff distance in the range [0.01, 1000] km. */ @Operation( - summary = "Compute earthquake probabilities", - description = "Compute cumulative earthquake probabilities P(M ≥ x) at a location", - operationId = "probability_doGetProbabilitySlash", - tags = { "Probability Service" }) + summary = "Compute annual earthquake rates", + description = "Compute incremental annual earthquake rates at a location", + operationId = "rate-calc") @ApiResponse( - description = "Earthquake probabilities calculation response", + description = "Earthquake annual rate calculation response", responseCode = "200", content = @Content( - schema = @Schema( - implementation = CalcResponse.class))) + schema = @Schema(implementation = RateResponse.class))) @Get( - uri = "/probability{/longitude}{/latitude}{/distance}{/timespan}", + uri = "/{longitude}/{latitude}/{distance}", produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetProbabilitySlash( - HttpRequest<?> request, - @Schema( - required = true) @PathVariable @Nullable Double longitude, + public HttpResponse<String> doGetRate( + HttpRequest<?> http, + @PathVariable double longitude, + @PathVariable double latitude, @Schema( - required = true) @PathVariable @Nullable Double latitude, - @Schema( - required = true, minimum = "0.01", - maximum = "1000") @PathVariable @Nullable Double distance, - @Schema( - required = true, - minimum = "1", - maximum = "10000") @PathVariable @Nullable Double timespan) { - var service = Service.PROBABILITY; - var query = new Query(service, longitude, latitude, distance, Optional.ofNullable(timespan)); - return RateService.handleDoGetCalc(request, query); + maximum = "1000") @PathVariable double distance) { + try { + RateService.Request request = new RateService.Request( + http, longitude, latitude, distance); + return RateService.getRate(request); + } catch (Exception e) { + return ServletUtil.error( + RateService.LOG, e, + RateService.NAME_RATE, + http.getUri().toString()); + } } - // Swagger schemas - private static class CalcResponse extends ResponseBody<RequestData, ResponseData> {} - - private static class RateMetadataResponse extends ResponseBody<String, Usage<RateParameters>> {}; + // Swagger schema + private static class RateResponse extends ResponseBody<Request, Response> {} - private static class ProbMetadataResponse extends - ResponseBody<String, Usage<ProbabilityParameters>> {}; + // Swagger schema + private static class RateMetadata extends ResponseBody<String, Metadata> {}; } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java index bc380cf4d..b8dff8e38 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java @@ -1,8 +1,12 @@ package gov.usgs.earthquake.nshmp.www.source; +import static gov.usgs.earthquake.nshmp.data.DoubleData.checkInRange; +import static gov.usgs.earthquake.nshmp.geo.Coordinates.checkLatitude; +import static gov.usgs.earthquake.nshmp.geo.Coordinates.checkLongitude; + import java.util.ArrayList; import java.util.List; -import java.util.Optional; +import java.util.OptionalDouble; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; @@ -10,26 +14,22 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Stopwatch; +import com.google.common.collect.Range; import com.google.common.util.concurrent.ListenableFuture; -import gov.usgs.earthquake.nshmp.Maths; import gov.usgs.earthquake.nshmp.calc.CalcConfig; import gov.usgs.earthquake.nshmp.calc.EqRate; import gov.usgs.earthquake.nshmp.calc.Site; +import gov.usgs.earthquake.nshmp.geo.Coordinates; import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.www.HazVersion; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; -import gov.usgs.earthquake.nshmp.www.ServicesUtil.Key; -import gov.usgs.earthquake.nshmp.www.ServicesUtil.ServiceQueryData; -import gov.usgs.earthquake.nshmp.www.ServicesUtil.ServiceRequestData; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; -import gov.usgs.earthquake.nshmp.www.WsUtils; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; -import gov.usgs.earthquake.nshmp.www.meta.Metadata.DefaultParameters; - +import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -43,6 +43,8 @@ import jakarta.inject.Singleton; @Singleton public final class RateService { + static final String NAME_RATE = "Earthquake Rate Service"; + static final String NAME_PROBABILITY = "Earthquake Probability Service"; static final Logger LOG = LoggerFactory.getLogger(RateService.class); /* @@ -56,6 +58,44 @@ public final class RateService { private static final String TOTAL_KEY = "Total"; + public static HttpResponse<String> getRate(Request request) { + var stopwatch = Stopwatch.createStarted(); + var rates = calcRate(request); + var response = new Response.Builder() + .timer(stopwatch) + .request(request) + .rates(rates) + .build(); + var body = ResponseBody.success() + .name(NAME_RATE) + .url(request.http.getUri().toString()) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(request) + .response(response) + .build(); + String json = ServletUtil.GSON2.toJson(body); + return HttpResponse.ok(json); + } + + public static HttpResponse<String> getProbability(ProbRequest request) { + var stopwatch = Stopwatch.createStarted(); + var rates = calcProbability(request); + var response = new Response.Builder() + .timer(stopwatch) + .request(request) + .rates(rates) + .build(); + var body = ResponseBody.success() + .name(NAME_PROBABILITY) + .url(request.http.getUri().toString()) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(request) + .response(response) + .build(); + String json = ServletUtil.GSON2.toJson(body); + return HttpResponse.ok(json); + } + /** * Handler for {@link RateController#doGetProbability}, * {@link RateController#doGetProbabilitySlash}, @@ -66,58 +106,70 @@ public final class RateService { * @param urlHelper The url helper * @return */ - static HttpResponse<String> handleDoGetCalc(HttpRequest<?> request, Query query) { - var service = query.service; - - try { - - if (query.isNull()) { - return handleDoGetUsage(request, service); - } - - query.checkValues(); - var requestData = new RequestData(query); - var response = processRequest(request, service, requestData); - var svcResponse = ServletUtil.GSON.toJson(response); - return HttpResponse.ok(svcResponse); - } catch (Exception e) { - return ServletUtil.error(LOG, e, service.name, request.getUri().getPath()); - } + // static HttpResponse<String> handleDoGetCalc(HttpRequest<?> request, Query + // query) { + // var service = query.service; + // + // try { + // + // if (query.isNull()) { + // return handleDoGetUsage(request, service); + // } + // + // query.checkValues(); + // var requestData = new RequestData(query); + // var response = processRequest(request, service, requestData); + // var svcResponse = ServletUtil.GSON.toJson(response); + // return HttpResponse.ok(svcResponse); + // } catch (Exception e) { + // return ServletUtil.error(LOG, e, service.name, request.getUri().getPath()); + // } + // } + + // static ResponseBody<String, Usage<DefaultParameters>> + // metadata(HttpRequest<?> request, + // Service service) { + // var parameters = service == Service.RATE ? new RateParameters() : new + // ProbabilityParameters(); + // var usage = new Usage<DefaultParameters>(service, parameters); + // var url = request.getUri().getPath(); + // return ResponseBody.<String, Usage<DefaultParameters>> usage() + // .name(service.name) + // .url(url) + // .metadata(new ResponseMetadata(HazVersion.appVersions())) + // .request(url) + // .response(usage) + // .build(); + // } + // + // static ResponseBody<RequestData, ResponseData> processRequest( + // HttpRequest<?> request, + // Service service, + // RequestData data) throws InterruptedException, ExecutionException { + // var timer = Stopwatch.createStarted(); + // var rates = calc(service, data); + // var response = new Response.Builder() + // + // new ServiceResponseMetadata(service, data), rates, timer); + // return ResponseBody.<RequestData, ResponseData> success() + // .name(service.name) + // .request(data) + // .metadata(new ResponseMetadata(HazVersion.appVersions())) + // .response(responseData) + // .url(request.getUri().getPath()) + // .build(); + // } + + private static EqRate calcRate(Request request) { + return calc(request, OptionalDouble.empty()); } - static ResponseBody<String, Usage<DefaultParameters>> metadata(HttpRequest<?> request, - Service service) { - var parameters = service == Service.RATE ? new RateParameters() : new ProbabilityParameters(); - var usage = new Usage<DefaultParameters>(service, parameters); - var url = request.getUri().getPath(); - return ResponseBody.<String, Usage<DefaultParameters>> usage() - .name(service.name) - .url(url) - .metadata(new ResponseMetadata(HazVersion.appVersions())) - .request(url) - .response(usage) - .build(); + private static EqRate calcProbability(ProbRequest request) { + return calc(request, OptionalDouble.of(request.timespan)); } - static ResponseBody<RequestData, ResponseData> processRequest( - HttpRequest<?> request, - Service service, - RequestData data) throws InterruptedException, ExecutionException { - var timer = Stopwatch.createStarted(); - var rates = calc(service, data); - var responseData = new ResponseData(new ServiceResponseMetadata(service, data), rates, timer); - return ResponseBody.<RequestData, ResponseData> success() - .name(service.name) - .request(data) - .metadata(new ResponseMetadata(HazVersion.appVersions())) - .response(responseData) - .url(request.getUri().getPath()) - .build(); - } - - private static EqRate calc(Service service, RequestData data) - throws InterruptedException, ExecutionException { - var location = Location.create(data.longitude, data.latitude); + private static EqRate calc(Request request, OptionalDouble timespan) { + var location = Location.create(request.longitude, request.latitude); var site = Site.builder().location(location).build(); var futureRates = new ArrayList<ListenableFuture<EqRate>>(); @@ -128,7 +180,7 @@ public final class RateService { */ var model = ServletUtil.model(); - var rate = process(service, model, site, data.distance, data.timespan); + var rate = process(model, site, request.distance, timespan); futureRates.add(rate); var rates = futureRates.stream() @@ -143,209 +195,361 @@ public final class RateService { var ratesCombined = EqRate.combine(rates); - if (service == Service.PROBABILITY) { + if (timespan.isPresent()) { ratesCombined = EqRate.toCumulative(ratesCombined); - ratesCombined = EqRate.toPoissonProbability(ratesCombined, data.timespan.get()); + ratesCombined = EqRate.toPoissonProbability(ratesCombined, timespan.orElseThrow()); } return ratesCombined; } - private static HttpResponse<String> handleDoGetUsage(HttpRequest<?> request, Service service) { - var response = metadata(request, service); - var json = ServletUtil.GSON.toJson(response); - return HttpResponse.ok(json); - } + // private static EqRate calc(Service service, RequestData data) + // throws InterruptedException, ExecutionException { + // var location = Location.create(data.longitude, data.latitude); + // var site = Site.builder().location(location).build(); + // var futureRates = new ArrayList<ListenableFuture<EqRate>>(); + // + // /* + // * Because we need to combine model results, intially calculate incremental + // * annual rates and only convert to cumulative probabilities at the end if + // * probability service has been called. + // */ + // + // var model = ServletUtil.model(); + // var rate = process(service, model, site, data.distance, data.timespan); + // futureRates.add(rate); + // + // var rates = futureRates.stream() + // .map((future) -> { + // try { + // return future.get(); + // } catch (InterruptedException | ExecutionException e) { + // throw new RuntimeException(e); + // } + // }).collect(Collectors.toList()) + // .toArray(new EqRate[] {}); + // + // var ratesCombined = EqRate.combine(rates); + // + // if (service == Service.PROBABILITY) { + // ratesCombined = EqRate.toCumulative(ratesCombined); + // ratesCombined = EqRate.toPoissonProbability(ratesCombined, + // data.timespan.get()); + // } + // + // return ratesCombined; + // } + + // private static HttpResponse<String> handleDoGetUsage(HttpRequest<?> + // request, Service service) { + // var response = metadata(request, service); + // var json = ServletUtil.GSON.toJson(response); + // return HttpResponse.ok(json); + // } private static ListenableFuture<EqRate> process( - Service service, HazardModel model, Site site, double distance, - Optional<Double> timespan) { + OptionalDouble timespan) { var configBuilder = CalcConfig.copyOf(model.config()).distance(distance); - if (service == Service.PROBABILITY) { + if (timespan.isPresent()) { /* Also sets value format to Poisson probability. */ - configBuilder.timespan(timespan.get()); + configBuilder.timespan(timespan.getAsDouble()); } var config = configBuilder.build(); var task = EqRate.callable(model, config, site); return ServletUtil.CALC_EXECUTOR.submit(task); } - public static enum Service { - RATE( - "Earthquake Rate Service", - "Compute incremental earthquake annual-rates at a location", - List.of( - "%srate/{longitude}/{latitude}/{distance}", - "%srate?longitude={longitude}&latitude={latitude}&distance={distance}")), - - PROBABILITY( - "Earthquake Probability Service", - "Compute cumulative earthquake probabilities P(M ≥ x) at a location", - List.of( - "%sprobability/{longitude}/{latitude}/{distance}/{timespan}", - "%sprobability?longitude=<double>&latitude=<double>&distance=<double>×pan=<double>")); - - private final String name; - private final String description; - private final List<String> syntax; - - private Service(String name, String description, List<String> syntax) { - this.name = name; - this.description = description; - this.syntax = syntax; - } - } - - public static class Query extends ServiceQueryData { - final Double distance; - final Optional<Double> timespan; - final Service service; - - public Query( - Service service, - Double longitude, - Double latitude, - Double distance, - Optional<Double> timespan) { - super(longitude, latitude); - this.service = service; - this.distance = distance; - this.timespan = timespan; - } - - @Override - public boolean isNull() { - return super.isNull() && distance == null && - ((service == Service.PROBABILITY && timespan.isEmpty()) || service == Service.RATE); - } - - @Override - public void checkValues() { - super.checkValues(); - WsUtils.checkValue(Key.DISTANCE, distance); - if (service == Service.PROBABILITY) { - WsUtils.checkValue(Key.TIMESPAN, timespan.get()); - } - } - } - - static final class RequestData extends ServiceRequestData { - final double distance; - final Optional<Double> timespan; - - RequestData(Query query) { - super(query); - this.distance = query.distance; - this.timespan = query.timespan; - } - - public double getDistance() { - return distance; - } + // private static ListenableFuture<EqRate> process( + // Service service, + // HazardModel model, + // Site site, + // double distance, + // Optional<Double> timespan) { + // var configBuilder = CalcConfig.copyOf(model.config()).distance(distance); + // if (service == Service.PROBABILITY) { + // /* Also sets value format to Poisson probability. */ + // configBuilder.timespan(timespan.get()); + // } + // var config = configBuilder.build(); + // var task = EqRate.callable(model, config, site); + // return ServletUtil.CALC_EXECUTOR.submit(task); + // } + + // public static enum Service { + // RATE( + // "Earthquake Rate Service", + // "Compute incremental earthquake annual-rates at a location", + // List.of( + // "%srate/{longitude}/{latitude}/{distance}", + // "%srate?longitude={longitude}&latitude={latitude}&distance={distance}")), + // + // PROBABILITY( + // "Earthquake Probability Service", + // "Compute cumulative earthquake probabilities P(M ≥ x) at a location", + // List.of( + // "%sprobability/{longitude}/{latitude}/{distance}/{timespan}", + // "%sprobability?longitude=<double>&latitude=<double>&distance=<double>×pan=<double>")); + // + // private final String name; + // private final String description; + // private final List<String> syntax; + // + // private Service(String name, String description, List<String> syntax) { + // this.name = name; + // this.description = description; + // this.syntax = syntax; + // } + // } + + // public static class Query extends ServiceQueryData { + // final Double distance; + // final Optional<Double> timespan; + // final Service service; + // + // public Query( + // Service service, + // Double longitude, + // Double latitude, + // Double distance, + // Optional<Double> timespan) { + // super(longitude, latitude); + // this.service = service; + // this.distance = distance; + // this.timespan = timespan; + // } + // + // @Override + // public boolean isNull() { + // return super.isNull() && distance == null && + // ((service == Service.PROBABILITY && timespan.isEmpty()) || service == + // Service.RATE); + // } + // + // @Override + // public void checkValues() { + // super.checkValues(); + // WsUtils.checkValue(Key.DISTANCE, distance); + // if (service == Service.PROBABILITY) { + // WsUtils.checkValue(Key.TIMESPAN, timespan.get()); + // } + // } + // } + + // static final class RequestData extends ServiceRequestData { + // final double distance; + // final Optional<Double> timespan; + // + // RequestData(Query query) { + // super(query); + // this.distance = query.distance; + // this.timespan = query.timespan; + // } + // + // public double getDistance() { + // return distance; + // } + // + // public Optional<Double> getTimespan() { + // return timespan; + // } + // } + + static class Response { + + final Metadata metadata; + final List<Sequence> data; - public Optional<Double> getTimespan() { - return timespan; + Response(Metadata metadata, List<Sequence> data) { + this.metadata = metadata; + this.data = data; } - } - private static final class ServiceResponseMetadata { - final double latitude; - final double longitude; - final double distance; - final Double timespan; - - final String xlabel = "Magnitude (Mw)"; - final String ylabel; - - ServiceResponseMetadata(Service service, RequestData request) { - var isProbability = service == Service.PROBABILITY; - this.longitude = request.longitude; - this.latitude = request.latitude; - this.distance = request.distance; - this.ylabel = isProbability ? "Probability" : "Annual Rate (yrâ»Â¹)"; - this.timespan = request.timespan.orElse(null); + public Metadata getMetadata() { + return metadata; } - public double getLatitude() { - return latitude; + public List<Sequence> getData() { + return data; } - public double getLongitude() { - return longitude; - } + private static final class Metadata { + final Server server; + final String xlabel = "Ground Motion (g)"; + final String ylabel = "Annual Frequency of Exceedance"; - public double getDistance() { - return distance; - } + Metadata(Server server) { + this.server = server; + } - public Double getTimespan() { - return timespan; - } + public Server getServer() { + return server; + } - public String getXlabel() { - return xlabel; - } + public String getXLabel() { + return xlabel; + } - public String getYLabel() { - return ylabel; + public String getYLabel() { + return ylabel; + } } - } - static final class ResponseData { - final Server server; - final ServiceResponseMetadata metadata; - final List<Sequence> data; + private static final class Builder { - ResponseData(ServiceResponseMetadata metadata, EqRate rates, Stopwatch timer) { - server = ServletUtil.serverData(ServletUtil.THREAD_COUNT, timer); - this.metadata = metadata; - this.data = buildSequence(rates); - } + Stopwatch timer; + Request request; + List<Sequence> data; - public Server getServer() { - return server; - } + Builder timer(Stopwatch timer) { + this.timer = timer; + return this; + } - public ServiceResponseMetadata getMetadata() { - return metadata; - } + Builder request(Request request) { + this.request = request; + return this; + } - public List<Sequence> getData() { - return data; - } + Builder rates(EqRate rates) { + this.data = buildSequences(rates); + return this; + } - List<Sequence> buildSequence(EqRate rates) { - var sequences = new ArrayList<Sequence>(); - - /* Total mfd. */ - var total = (!rates.totalMfd.isClear()) ? rates.totalMfd.trim() : rates.totalMfd; - var totalOut = new Sequence( - TOTAL_KEY, - total.xValues().boxed().collect(Collectors.toList()), - total.yValues().boxed().collect(Collectors.toList())); - sequences.add(totalOut); - - /* Source type mfds. */ - for (var entry : rates.typeMfds.entrySet()) { - var type = entry.getValue(); - if (type.isClear()) { - continue; + private List<Sequence> buildSequences(EqRate rates) { + var sequences = new ArrayList<Sequence>(); + + /* Total mfd. */ + var total = (!rates.totalMfd.isClear()) ? rates.totalMfd.trim() : rates.totalMfd; + var totalOut = new Sequence( + TOTAL_KEY, + total.xValues().boxed().collect(Collectors.toList()), + total.yValues().boxed().collect(Collectors.toList())); + sequences.add(totalOut); + + /* Source type mfds. */ + for (var entry : rates.typeMfds.entrySet()) { + var type = entry.getValue(); + if (type.isClear()) { + continue; + } + type = type.trim(); + var typeOut = new Sequence( + entry.getKey().toString(), + type.xValues().boxed().collect(Collectors.toList()), + type.yValues().boxed().collect(Collectors.toList())); + sequences.add(typeOut); } - type = type.trim(); - var typeOut = new Sequence( - entry.getKey().toString(), - type.xValues().boxed().collect(Collectors.toList()), - type.yValues().boxed().collect(Collectors.toList())); - sequences.add(typeOut); + + return List.copyOf(sequences); } - return List.copyOf(sequences); + Response build() { + Server server = ServletUtil.serverData(ServletUtil.THREAD_COUNT, timer); + return new Response(new Response.Metadata(server), data); + } } } + // private static final class ServiceResponseMetadata { + // final double latitude; + // final double longitude; + // final double distance; + // final Double timespan; + // + // final String xlabel = "Magnitude (Mw)"; + // final String ylabel; + // + // ServiceResponseMetadata(Service service, RequestData request) { + // var isProbability = service == Service.PROBABILITY; + // this.longitude = request.longitude; + // this.latitude = request.latitude; + // this.distance = request.distance; + // this.ylabel = isProbability ? "Probability" : "Annual Rate (yrâ»Â¹)"; + // this.timespan = request.timespan.orElse(null); + // } + // + // public double getLatitude() { + // return latitude; + // } + // + // public double getLongitude() { + // return longitude; + // } + // + // public double getDistance() { + // return distance; + // } + // + // public Double getTimespan() { + // return timespan; + // } + // + // public String getXlabel() { + // return xlabel; + // } + // + // public String getYLabel() { + // return ylabel; + // } + // } + + // static final class ResponseData { + // final Server server; + // final ServiceResponseMetadata metadata; + // final List<Sequence> data; + // + // ResponseData(ServiceResponseMetadata metadata, EqRate rates, Stopwatch + // timer) { + // server = ServletUtil.serverData(ServletUtil.THREAD_COUNT, timer); + // this.metadata = metadata; + // this.data = buildSequence(rates); + // } + // + // public Server getServer() { + // return server; + // } + // + // public ServiceResponseMetadata getMetadata() { + // return metadata; + // } + // + // public List<Sequence> getData() { + // return data; + // } + // + // List<Sequence> buildSequence(EqRate rates) { + // var sequences = new ArrayList<Sequence>(); + // + // /* Total mfd. */ + // var total = (!rates.totalMfd.isClear()) ? rates.totalMfd.trim() : + // rates.totalMfd; + // var totalOut = new Sequence( + // TOTAL_KEY, + // total.xValues().boxed().collect(Collectors.toList()), + // total.yValues().boxed().collect(Collectors.toList())); + // sequences.add(totalOut); + // + // /* Source type mfds. */ + // for (var entry : rates.typeMfds.entrySet()) { + // var type = entry.getValue(); + // if (type.isClear()) { + // continue; + // } + // type = type.trim(); + // var typeOut = new Sequence( + // entry.getKey().toString(), + // type.xValues().boxed().collect(Collectors.toList()), + // type.yValues().boxed().collect(Collectors.toList())); + // sequences.add(typeOut); + // } + // + // return List.copyOf(sequences); + // } + // } + /* * Would rather use this a general container for mfds and hazard curves. See * HazardService.Curve @@ -374,35 +578,168 @@ public final class RateService { } } - static class Usage<T extends DefaultParameters> { - final String description; - final List<String> syntax; - final T parameters; + // static class Usage<T extends DefaultParameters> { + // final String description; + // final List<String> syntax; + // final T parameters; + // + // private Usage(Service service, T parameters) { + // description = service.description; + // this.syntax = service.syntax; + // this.parameters = parameters; + // } + // + // public String getDescription() { + // return description; + // } + // + // public List<String> getSyntax() { + // return syntax; + // } + // + // public T getParameters() { + // return parameters; + // } + // } + + // static class RateParameters extends DefaultParameters { + // final DoubleParameter distance; + // + // RateParameters() { + // super(); + // distance = new DoubleParameter( + // "Cutoff distance", + // "km", + // 0.01, + // 1000.0); + // } + // + // public DoubleParameter getDistance() { + // return distance; + // } + // } + // + // static class ProbabilityParameters extends RateParameters { + // final DoubleParameter timespan; + // + // ProbabilityParameters() { + // timespan = new DoubleParameter( + // "Forecast time span", + // "years", + // Maths.TIMESPAN_RANGE.lowerEndpoint(), + // Maths.TIMESPAN_RANGE.upperEndpoint()); + // } + // + // public DoubleParameter getTimespan() { + // return timespan; + // } + // } + + /*********************/ + + private static final Range<Double> DISTANCE_RANGE = Range.closed(0.01, 1000.0); + private static final Range<Double> TIMESPAN_RANGE = Range.closed(1.0, 10000.0); + + static class Request { + + final transient HttpRequest<?> http; + final double longitude; + final double latitude; + final double distance; - private Usage(Service service, T parameters) { - description = service.description; - this.syntax = service.syntax; - this.parameters = parameters; + public Request( + HttpRequest<?> http, + double longitude, + double latitude, + double distance) { + this.http = http; + this.longitude = checkLongitude(longitude); + this.latitude = checkLatitude(latitude); + this.distance = checkInRange(DISTANCE_RANGE, "Distance cutoff", distance); } - public String getDescription() { - return description; + public double getLongitude() { + return longitude; } - public List<String> getSyntax() { - return syntax; + public double getLatitude() { + return latitude; } - public T getParameters() { - return parameters; + public double getDistance() { + return distance; } } - static class RateParameters extends DefaultParameters { + static class ProbRequest extends Request { + + final double timespan; + + public ProbRequest( + HttpRequest<?> http, + double longitude, + double latitude, + double distance, + double timespan) { + super(http, longitude, latitude, distance); + this.timespan = checkInRange(TIMESPAN_RANGE, "Forecast timespan", timespan); + } + + public double getTimespan() { + return timespan; + } + } + + public static HttpResponse<String> getRateMetadata(HttpRequest<?> request) { + var url = request.getUri().toString(); + var usage = new Metadata(ServletUtil.model()); + var body = ResponseBody.usage() + .name(NAME_RATE) + .url(url) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(url) + .response(usage) + .build(); + var json = ServletUtil.GSON2.toJson(body); + return HttpResponse.ok(json); + } + + public static HttpResponse<String> getProbMetadata(HttpRequest<?> request) { + var url = request.getUri().toString(); + var usage = new ProbMetadata(ServletUtil.model()); + var body = ResponseBody.usage() + .name(NAME_RATE) + .url(url) + .metadata(new ResponseMetadata(HazVersion.appVersions())) + .request(url) + .response(usage) + .build(); + var json = ServletUtil.GSON2.toJson(body); + return HttpResponse.ok(json); + } + + static class Metadata { + + final SourceModel model; + final DoubleParameter longitude; + final DoubleParameter latitude; final DoubleParameter distance; - RateParameters() { - super(); + Metadata(HazardModel model) { + this.model = new SourceModel(model); + // TODO should get min max from model (fix via swagger openapi injection) + longitude = new DoubleParameter( + "Longitude", + "°", + Coordinates.LON_RANGE.lowerEndpoint(), + Coordinates.LON_RANGE.upperEndpoint()); + + latitude = new DoubleParameter( + "Latitude", + "°", + Coordinates.LAT_RANGE.lowerEndpoint(), + Coordinates.LAT_RANGE.upperEndpoint()); + distance = new DoubleParameter( "Cutoff distance", "km", @@ -410,24 +747,39 @@ public final class RateService { 1000.0); } + public SourceModel getModel() { + return model; + } + + public DoubleParameter getLongitude() { + return longitude; + } + + public DoubleParameter getLatitude() { + return latitude; + } + public DoubleParameter getDistance() { return distance; } } - static class ProbabilityParameters extends RateParameters { + static class ProbMetadata extends Metadata { + final DoubleParameter timespan; - ProbabilityParameters() { + ProbMetadata(HazardModel model) { + super(model); timespan = new DoubleParameter( - "Forecast time span", + "Forecast timespan", "years", - Maths.TIMESPAN_RANGE.lowerEndpoint(), - Maths.TIMESPAN_RANGE.upperEndpoint()); + 1.0, + 10000.0); } public DoubleParameter getTimespan() { return timespan; } } + } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 831019296..076cb1e3c 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -65,6 +65,6 @@ public class SourceController { } } - // For Swagger schemas + // Swagger schema private static class MetadataResponse extends ResponseBody<String, ResponseData> {} } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index 4d4ad88d3..a3cde3bf0 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -84,9 +84,9 @@ public class SourceLogicTreesController { } } - // For Swagger schemas + // Swagger schema private static class MetadataResponse extends ResponseBody<String, Metadata> {} - // For Swagger schemas + // Swagger schema private static class TreeResponse extends ResponseBody<RequestData, Object> {} } -- GitLab From 39159d9a1d2d195dbf6a80efa12ca10fc47e703b Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Tue, 31 May 2022 11:40:16 -0600 Subject: [PATCH 11/25] separated probability controller --- .../www/source/ProbabilityController.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java new file mode 100644 index 000000000..5fd4d68ec --- /dev/null +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java @@ -0,0 +1,109 @@ +package gov.usgs.earthquake.nshmp.www.source; + +import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; +import gov.usgs.earthquake.nshmp.www.ResponseBody; +import gov.usgs.earthquake.nshmp.www.ServletUtil; +import gov.usgs.earthquake.nshmp.www.source.RateService.ProbMetadata; +import gov.usgs.earthquake.nshmp.www.source.RateService.Request; +import gov.usgs.earthquake.nshmp.www.source.RateService.Response; +import io.micronaut.http.HttpRequest; +import io.micronaut.http.HttpResponse; +import io.micronaut.http.MediaType; +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.http.annotation.PathVariable; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.inject.Inject; + +/** + * Micronaut web service controller for probability calcuations. + * + * <p>See src/main/resources/application.yml nshmp-haz.model-path for installed + * model. + * + * <p>To run the Micronaut jar file with a model: java -jar + * path/to/nshmp-haz.jar --model=<path/to/model> + * + * @author U.S. Geological Survey + */ +@Tag( + name = "Earthquake Probability Calculation", + description = "USGS NSHM earthquake probability calculation service") +@Controller("/probability") +public class ProbabilityController { + + @Inject + private NshmpMicronautServlet servlet; + + @Operation( + summary = "Earthquake probability calculation model and service metadata", + description = "Returns details of the installed model and service request parameters", + operationId = "probability-metadata") + @ApiResponse( + description = "Probability service metadata", + responseCode = "200", + content = @Content( + schema = @Schema(implementation = ProbabilityMetadata.class))) + @Get(produces = MediaType.APPLICATION_JSON) + public HttpResponse<String> doGetProbabilityMetadata(HttpRequest<?> http) { + try { + return RateService.getProbMetadata(http); + } catch (Exception e) { + return ServletUtil.error( + RateService.LOG, e, + RateService.NAME_PROBABILITY, + http.getUri().toString()); + } + } + + /** + * @param longitude Longitude in decimal degrees in the range + * @param latitude Latitude in decimal degrees in the range + * @param distance Cutoff distance in the range [0.01..1000] km. + * @param timespan Forecast time span in the range [1..10000] years. + */ + @Operation( + summary = "Compute earthquake probabilities", + description = "Compute cumulative earthquake probabilities P(M ≥ x) at a location", + operationId = "probability-calc") + @ApiResponse( + description = "Earthquake probability calculation response", + responseCode = "200", + content = @Content( + schema = @Schema( + implementation = ProbabilityResponse.class))) + @Get( + uri = "/{longitude}/{latitude}/{distance}/{timespan}", + produces = MediaType.APPLICATION_JSON) + public HttpResponse<String> doGetProbability( + HttpRequest<?> http, + @PathVariable double longitude, + @PathVariable double latitude, + @Schema( + minimum = "0.01", + maximum = "1000") @PathVariable double distance, + @Schema( + minimum = "1", + maximum = "10000") @PathVariable double timespan) { + try { + RateService.ProbRequest request = new RateService.ProbRequest( + http, longitude, latitude, distance, timespan); + return RateService.getProbability(request); + } catch (Exception e) { + return ServletUtil.error( + RateService.LOG, e, + RateService.NAME_PROBABILITY, + http.getUri().toString()); + } + } + + // Swagger schema + private static class ProbabilityResponse extends ResponseBody<Request, Response> {} + + // Swagger schema + private static class ProbabilityMetadata extends ResponseBody<String, ProbMetadata> {}; +} -- GitLab From d48b1ffd626789a049435efb762ac29a1e839bc8 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Tue, 31 May 2022 11:43:37 -0600 Subject: [PATCH 12/25] spotless edits --- package-lock.json | 1 - src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java | 1 + .../java/gov/usgs/earthquake/nshmp/www/SwaggerController.java | 3 +-- .../gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java | 1 + .../gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java | 1 + .../gov/usgs/earthquake/nshmp/www/hazard/HazardController.java | 1 + .../gov/usgs/earthquake/nshmp/www/hazard/HazardService.java | 1 + .../earthquake/nshmp/www/source/ProbabilityController.java | 1 + .../gov/usgs/earthquake/nshmp/www/source/RateController.java | 1 + .../java/gov/usgs/earthquake/nshmp/www/source/RateService.java | 1 + .../gov/usgs/earthquake/nshmp/www/source/SourceController.java | 1 + .../nshmp/www/source/SourceLogicTreesController.java | 1 + .../earthquake/nshmp/www/source/SourceLogicTreesService.java | 1 + .../gov/usgs/earthquake/nshmp/www/source/SourceService.java | 1 + 14 files changed, 13 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc72624ba..fd03b78e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "nshmp-haz", "version": "2.0.0", "devDependencies": { "markdownlint-cli": "^0.31.1", diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java index 759006914..134c57ef8 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/ServletUtil.java @@ -33,6 +33,7 @@ import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.model.SiteData; import gov.usgs.earthquake.nshmp.www.meta.MetaUtil; + import io.micronaut.context.annotation.Value; import io.micronaut.context.event.ShutdownEvent; import io.micronaut.context.event.StartupEvent; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java index 169c4488a..2f7fddb74 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java @@ -8,8 +8,7 @@ import org.slf4j.LoggerFactory; import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.model.HazardModel; -import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; -import gov.usgs.earthquake.nshmp.www.SwaggerUtils; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java index 7cfabb08b..6a1d8de39 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java @@ -15,6 +15,7 @@ import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestIml; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestRp; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.Response; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; + import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java index fc33e3c0b..124d9bcfb 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java @@ -36,6 +36,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.HazardRequest; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.meta.Parameter; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java index 2bf31c566..9dbddb3a2 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java @@ -9,6 +9,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Response; + import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index 68c8a4e90..b102cece9 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -42,6 +42,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.meta.Parameter; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java index 5fd4d68ec..202e71e23 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java @@ -6,6 +6,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.RateService.ProbMetadata; import gov.usgs.earthquake.nshmp.www.source.RateService.Request; import gov.usgs.earthquake.nshmp.www.source.RateService.Response; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java index 9b73ab2ac..c77d04303 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java @@ -6,6 +6,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.RateService.Metadata; import gov.usgs.earthquake.nshmp.www.source.RateService.Request; import gov.usgs.earthquake.nshmp.www.source.RateService.Response; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java index b8dff8e38..79d856a10 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java @@ -30,6 +30,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 076cb1e3c..7c4c8b571 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -4,6 +4,7 @@ import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.ResponseData; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index a3cde3bf0..5f995e9fb 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -5,6 +5,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.Metadata; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.RequestData; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index 8fca5403a..d2bfdef9b 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -10,6 +10,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index c725ecb00..0e35411b4 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -17,6 +17,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.meta.Parameter; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; -- GitLab From 8ee5dae8548908dec49ae497109abfeb283fc11c Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 06:46:34 -0600 Subject: [PATCH 13/25] lib update --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a3b34da6d..edb602673 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ micronautVersion = 3.2.3 micronautRxVersion = 2.1.1 nodePluginVersion = 3.0.1 nodeVersion = 16.3.0 -nshmpLibVersion = 1.1.6 +nshmpLibVersion = 1.1.7 nshmpWsUtilsVersion = 0.3.11 openApiVersion = 4.0.0 shadowVersion = 7.1.2 -- GitLab From 7db87c9712e13b0f23f0d2bf516bc2a1e1e0d5a3 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 06:46:42 -0600 Subject: [PATCH 14/25] service cleaning --- .../earthquake/nshmp/www/hazard/HazardService.java | 10 +--------- .../nshmp/www/source/SourceLogicTreesController.java | 3 +-- .../earthquake/nshmp/www/source/SourceService.java | 3 ++- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index b102cece9..281521292 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -1,6 +1,5 @@ package gov.usgs.earthquake.nshmp.www.hazard; -import static com.google.common.base.Preconditions.checkState; import static gov.usgs.earthquake.nshmp.calc.HazardExport.curvesBySource; import static gov.usgs.earthquake.nshmp.data.DoubleData.checkInRange; import static gov.usgs.earthquake.nshmp.geo.Coordinates.checkLatitude; @@ -42,7 +41,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.meta.Parameter; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -135,7 +133,6 @@ public final class HazardService { Metadata(HazardModel model) { this.model = new SourceModel(model); - // TODO should get min max from model (fix via swagger openapi injection) longitude = new DoubleParameter( "Longitude", "°", @@ -294,12 +291,8 @@ public final class HazardService { } Builder hazard(Hazard hazard) { - // necessary?? - checkState(totalMap == null, "Hazard has already been added to this builder"); - componentMaps = new EnumMap<>(Imt.class); totalMap = new EnumMap<>(Imt.class); - var typeTotalMaps = curvesBySource(hazard); for (var imt : hazard.curves().keySet()) { @@ -320,7 +313,6 @@ public final class HazardService { XySequence.addToMap(type, componentMap, typeTotalMap.get(type)); } } - return this; } @@ -440,7 +432,7 @@ public final class HazardService { .collect(toCollection(() -> EnumSet.noneOf(Imt.class))); } - /* Read the 'imt' query values; can be comma-delimited. */ + /* Read the 'out'put type query values; can be comma-delimited. */ static Set<DataType> readDataTypes(HttpRequest<?> http) { return http.getParameters().getAll("out").stream() .map(s -> s.split(",")) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index 5f995e9fb..e15433041 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -5,7 +5,6 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.Metadata; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.RequestData; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; @@ -31,7 +30,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Source Model Logic Tree", + name = "Source Model Logic Trees", description = "USGS NSHM source model logic tree service") @Controller("/trees") public class SourceLogicTreesController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index 0e35411b4..3ecba39d3 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -17,7 +17,6 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.meta.Parameter; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -72,6 +71,8 @@ public class SourceService { final Map<NehrpSiteClass, Double> siteClasses; final List<Parameter> imts; + // final Bounds + public SourceModel(HazardModel model) { name = model.name(); gmms = model.gmms(); -- GitLab From 660aa6d437ad78603911f422a997be8d21cd873b Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 06:50:47 -0600 Subject: [PATCH 15/25] removed Bounds; using bounds from model --- .../nshmp/www/SwaggerController.java | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java index 2f7fddb74..a5a278300 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java @@ -1,14 +1,10 @@ package gov.usgs.earthquake.nshmp.www; import java.util.List; -import java.util.Map; -import java.util.logging.Logger; import org.slf4j.LoggerFactory; -import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.model.HazardModel; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -53,7 +49,7 @@ public class SwaggerController { HttpRequest<?> request, HazardModel model) { var openApi = new OpenAPIV3Parser().read("META-INF/swagger/nshmp-haz.yml"); - var bounds = new Bounds(model.bounds()); + var bounds = model.bounds(); SwaggerUtils.addLocationBounds(openApi, bounds.min, bounds.max); var components = openApi.getComponents(); var schemas = components.getSchemas(); @@ -69,18 +65,4 @@ public class SwaggerController { return openApi; } - private static class Bounds { - final Location min; - final Location max; - - Bounds(Map<String, Double> bounds) { - var log = Logger.getAnonymousLogger(); - - bounds.entrySet().forEach(entry -> { - log.info(entry.getKey() + ", " + entry.getValue()); - }); - min = Location.create(bounds.get("min-longitude"), bounds.get("min-latitude")); - max = Location.create(bounds.get("max-longitude"), bounds.get("max-latitude")); - } - } } -- GitLab From c68f57796fd0d7eeb1e2ad8a0c7e0c25017937db Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 07:13:34 -0600 Subject: [PATCH 16/25] cleaned rate service; updated metadata bounds --- .../nshmp/www/hazard/HazardService.java | 9 +- .../nshmp/www/source/RateService.java | 369 +----------------- 2 files changed, 8 insertions(+), 370 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index 281521292..a0d5792ea 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -28,7 +28,6 @@ import gov.usgs.earthquake.nshmp.calc.HazardCalcs; import gov.usgs.earthquake.nshmp.calc.Site; import gov.usgs.earthquake.nshmp.data.MutableXySequence; import gov.usgs.earthquake.nshmp.data.XySequence; -import gov.usgs.earthquake.nshmp.geo.Coordinates; import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.model.HazardModel; @@ -136,14 +135,14 @@ public final class HazardService { longitude = new DoubleParameter( "Longitude", "°", - Coordinates.LON_RANGE.lowerEndpoint(), - Coordinates.LON_RANGE.upperEndpoint()); + model.bounds().min.longitude, + model.bounds().max.longitude); latitude = new DoubleParameter( "Latitude", "°", - Coordinates.LAT_RANGE.lowerEndpoint(), - Coordinates.LAT_RANGE.upperEndpoint()); + model.bounds().min.latitude, + model.bounds().max.latitude); vs30 = new DoubleParameter( "Vs30", diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java index 79d856a10..924070e7e 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java @@ -20,7 +20,6 @@ import com.google.common.util.concurrent.ListenableFuture; import gov.usgs.earthquake.nshmp.calc.CalcConfig; import gov.usgs.earthquake.nshmp.calc.EqRate; import gov.usgs.earthquake.nshmp.calc.Site; -import gov.usgs.earthquake.nshmp.geo.Coordinates; import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.model.HazardModel; import gov.usgs.earthquake.nshmp.www.HazVersion; @@ -30,7 +29,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -97,70 +95,6 @@ public final class RateService { return HttpResponse.ok(json); } - /** - * Handler for {@link RateController#doGetProbability}, - * {@link RateController#doGetProbabilitySlash}, - * {@link RateController#doGetRate}, and {@link RateController#doGetRateSlash} - * - * @param service The service - * @param query The query - * @param urlHelper The url helper - * @return - */ - // static HttpResponse<String> handleDoGetCalc(HttpRequest<?> request, Query - // query) { - // var service = query.service; - // - // try { - // - // if (query.isNull()) { - // return handleDoGetUsage(request, service); - // } - // - // query.checkValues(); - // var requestData = new RequestData(query); - // var response = processRequest(request, service, requestData); - // var svcResponse = ServletUtil.GSON.toJson(response); - // return HttpResponse.ok(svcResponse); - // } catch (Exception e) { - // return ServletUtil.error(LOG, e, service.name, request.getUri().getPath()); - // } - // } - - // static ResponseBody<String, Usage<DefaultParameters>> - // metadata(HttpRequest<?> request, - // Service service) { - // var parameters = service == Service.RATE ? new RateParameters() : new - // ProbabilityParameters(); - // var usage = new Usage<DefaultParameters>(service, parameters); - // var url = request.getUri().getPath(); - // return ResponseBody.<String, Usage<DefaultParameters>> usage() - // .name(service.name) - // .url(url) - // .metadata(new ResponseMetadata(HazVersion.appVersions())) - // .request(url) - // .response(usage) - // .build(); - // } - // - // static ResponseBody<RequestData, ResponseData> processRequest( - // HttpRequest<?> request, - // Service service, - // RequestData data) throws InterruptedException, ExecutionException { - // var timer = Stopwatch.createStarted(); - // var rates = calc(service, data); - // var response = new Response.Builder() - // - // new ServiceResponseMetadata(service, data), rates, timer); - // return ResponseBody.<RequestData, ResponseData> success() - // .name(service.name) - // .request(data) - // .metadata(new ResponseMetadata(HazVersion.appVersions())) - // .response(responseData) - // .url(request.getUri().getPath()) - // .build(); - // } - private static EqRate calcRate(Request request) { return calc(request, OptionalDouble.empty()); } @@ -204,50 +138,6 @@ public final class RateService { return ratesCombined; } - // private static EqRate calc(Service service, RequestData data) - // throws InterruptedException, ExecutionException { - // var location = Location.create(data.longitude, data.latitude); - // var site = Site.builder().location(location).build(); - // var futureRates = new ArrayList<ListenableFuture<EqRate>>(); - // - // /* - // * Because we need to combine model results, intially calculate incremental - // * annual rates and only convert to cumulative probabilities at the end if - // * probability service has been called. - // */ - // - // var model = ServletUtil.model(); - // var rate = process(service, model, site, data.distance, data.timespan); - // futureRates.add(rate); - // - // var rates = futureRates.stream() - // .map((future) -> { - // try { - // return future.get(); - // } catch (InterruptedException | ExecutionException e) { - // throw new RuntimeException(e); - // } - // }).collect(Collectors.toList()) - // .toArray(new EqRate[] {}); - // - // var ratesCombined = EqRate.combine(rates); - // - // if (service == Service.PROBABILITY) { - // ratesCombined = EqRate.toCumulative(ratesCombined); - // ratesCombined = EqRate.toPoissonProbability(ratesCombined, - // data.timespan.get()); - // } - // - // return ratesCombined; - // } - - // private static HttpResponse<String> handleDoGetUsage(HttpRequest<?> - // request, Service service) { - // var response = metadata(request, service); - // var json = ServletUtil.GSON.toJson(response); - // return HttpResponse.ok(json); - // } - private static ListenableFuture<EqRate> process( HazardModel model, Site site, @@ -263,101 +153,6 @@ public final class RateService { return ServletUtil.CALC_EXECUTOR.submit(task); } - // private static ListenableFuture<EqRate> process( - // Service service, - // HazardModel model, - // Site site, - // double distance, - // Optional<Double> timespan) { - // var configBuilder = CalcConfig.copyOf(model.config()).distance(distance); - // if (service == Service.PROBABILITY) { - // /* Also sets value format to Poisson probability. */ - // configBuilder.timespan(timespan.get()); - // } - // var config = configBuilder.build(); - // var task = EqRate.callable(model, config, site); - // return ServletUtil.CALC_EXECUTOR.submit(task); - // } - - // public static enum Service { - // RATE( - // "Earthquake Rate Service", - // "Compute incremental earthquake annual-rates at a location", - // List.of( - // "%srate/{longitude}/{latitude}/{distance}", - // "%srate?longitude={longitude}&latitude={latitude}&distance={distance}")), - // - // PROBABILITY( - // "Earthquake Probability Service", - // "Compute cumulative earthquake probabilities P(M ≥ x) at a location", - // List.of( - // "%sprobability/{longitude}/{latitude}/{distance}/{timespan}", - // "%sprobability?longitude=<double>&latitude=<double>&distance=<double>×pan=<double>")); - // - // private final String name; - // private final String description; - // private final List<String> syntax; - // - // private Service(String name, String description, List<String> syntax) { - // this.name = name; - // this.description = description; - // this.syntax = syntax; - // } - // } - - // public static class Query extends ServiceQueryData { - // final Double distance; - // final Optional<Double> timespan; - // final Service service; - // - // public Query( - // Service service, - // Double longitude, - // Double latitude, - // Double distance, - // Optional<Double> timespan) { - // super(longitude, latitude); - // this.service = service; - // this.distance = distance; - // this.timespan = timespan; - // } - // - // @Override - // public boolean isNull() { - // return super.isNull() && distance == null && - // ((service == Service.PROBABILITY && timespan.isEmpty()) || service == - // Service.RATE); - // } - // - // @Override - // public void checkValues() { - // super.checkValues(); - // WsUtils.checkValue(Key.DISTANCE, distance); - // if (service == Service.PROBABILITY) { - // WsUtils.checkValue(Key.TIMESPAN, timespan.get()); - // } - // } - // } - - // static final class RequestData extends ServiceRequestData { - // final double distance; - // final Optional<Double> timespan; - // - // RequestData(Query query) { - // super(query); - // this.distance = query.distance; - // this.timespan = query.timespan; - // } - // - // public double getDistance() { - // return distance; - // } - // - // public Optional<Double> getTimespan() { - // return timespan; - // } - // } - static class Response { final Metadata metadata; @@ -454,103 +249,6 @@ public final class RateService { } } - // private static final class ServiceResponseMetadata { - // final double latitude; - // final double longitude; - // final double distance; - // final Double timespan; - // - // final String xlabel = "Magnitude (Mw)"; - // final String ylabel; - // - // ServiceResponseMetadata(Service service, RequestData request) { - // var isProbability = service == Service.PROBABILITY; - // this.longitude = request.longitude; - // this.latitude = request.latitude; - // this.distance = request.distance; - // this.ylabel = isProbability ? "Probability" : "Annual Rate (yrâ»Â¹)"; - // this.timespan = request.timespan.orElse(null); - // } - // - // public double getLatitude() { - // return latitude; - // } - // - // public double getLongitude() { - // return longitude; - // } - // - // public double getDistance() { - // return distance; - // } - // - // public Double getTimespan() { - // return timespan; - // } - // - // public String getXlabel() { - // return xlabel; - // } - // - // public String getYLabel() { - // return ylabel; - // } - // } - - // static final class ResponseData { - // final Server server; - // final ServiceResponseMetadata metadata; - // final List<Sequence> data; - // - // ResponseData(ServiceResponseMetadata metadata, EqRate rates, Stopwatch - // timer) { - // server = ServletUtil.serverData(ServletUtil.THREAD_COUNT, timer); - // this.metadata = metadata; - // this.data = buildSequence(rates); - // } - // - // public Server getServer() { - // return server; - // } - // - // public ServiceResponseMetadata getMetadata() { - // return metadata; - // } - // - // public List<Sequence> getData() { - // return data; - // } - // - // List<Sequence> buildSequence(EqRate rates) { - // var sequences = new ArrayList<Sequence>(); - // - // /* Total mfd. */ - // var total = (!rates.totalMfd.isClear()) ? rates.totalMfd.trim() : - // rates.totalMfd; - // var totalOut = new Sequence( - // TOTAL_KEY, - // total.xValues().boxed().collect(Collectors.toList()), - // total.yValues().boxed().collect(Collectors.toList())); - // sequences.add(totalOut); - // - // /* Source type mfds. */ - // for (var entry : rates.typeMfds.entrySet()) { - // var type = entry.getValue(); - // if (type.isClear()) { - // continue; - // } - // type = type.trim(); - // var typeOut = new Sequence( - // entry.getKey().toString(), - // type.xValues().boxed().collect(Collectors.toList()), - // type.yValues().boxed().collect(Collectors.toList())); - // sequences.add(typeOut); - // } - // - // return List.copyOf(sequences); - // } - // } - /* * Would rather use this a general container for mfds and hazard curves. See * HazardService.Curve @@ -579,65 +277,6 @@ public final class RateService { } } - // static class Usage<T extends DefaultParameters> { - // final String description; - // final List<String> syntax; - // final T parameters; - // - // private Usage(Service service, T parameters) { - // description = service.description; - // this.syntax = service.syntax; - // this.parameters = parameters; - // } - // - // public String getDescription() { - // return description; - // } - // - // public List<String> getSyntax() { - // return syntax; - // } - // - // public T getParameters() { - // return parameters; - // } - // } - - // static class RateParameters extends DefaultParameters { - // final DoubleParameter distance; - // - // RateParameters() { - // super(); - // distance = new DoubleParameter( - // "Cutoff distance", - // "km", - // 0.01, - // 1000.0); - // } - // - // public DoubleParameter getDistance() { - // return distance; - // } - // } - // - // static class ProbabilityParameters extends RateParameters { - // final DoubleParameter timespan; - // - // ProbabilityParameters() { - // timespan = new DoubleParameter( - // "Forecast time span", - // "years", - // Maths.TIMESPAN_RANGE.lowerEndpoint(), - // Maths.TIMESPAN_RANGE.upperEndpoint()); - // } - // - // public DoubleParameter getTimespan() { - // return timespan; - // } - // } - - /*********************/ - private static final Range<Double> DISTANCE_RANGE = Range.closed(0.01, 1000.0); private static final Range<Double> TIMESPAN_RANGE = Range.closed(1.0, 10000.0); @@ -732,14 +371,14 @@ public final class RateService { longitude = new DoubleParameter( "Longitude", "°", - Coordinates.LON_RANGE.lowerEndpoint(), - Coordinates.LON_RANGE.upperEndpoint()); + model.bounds().min.longitude, + model.bounds().max.longitude); latitude = new DoubleParameter( "Latitude", "°", - Coordinates.LAT_RANGE.lowerEndpoint(), - Coordinates.LAT_RANGE.upperEndpoint()); + model.bounds().min.latitude, + model.bounds().max.latitude); distance = new DoubleParameter( "Cutoff distance", -- GitLab From 6623fa3397ab6a82b374d9caa1fd46b16bce58e6 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 08:28:06 -0600 Subject: [PATCH 17/25] service and response names consistent --- .../usgs/earthquake/nshmp/www/hazard/DisaggController.java | 3 +-- .../usgs/earthquake/nshmp/www/hazard/DisaggService.java | 3 +-- .../usgs/earthquake/nshmp/www/hazard/HazardController.java | 3 +-- .../usgs/earthquake/nshmp/www/hazard/HazardService.java | 2 +- .../earthquake/nshmp/www/source/ProbabilityController.java | 3 +-- .../usgs/earthquake/nshmp/www/source/RateController.java | 3 +-- .../gov/usgs/earthquake/nshmp/www/source/RateService.java | 7 +++---- .../usgs/earthquake/nshmp/www/source/SourceController.java | 3 +-- .../nshmp/www/source/SourceLogicTreesController.java | 2 +- .../nshmp/www/source/SourceLogicTreesService.java | 3 +-- .../usgs/earthquake/nshmp/www/source/SourceService.java | 2 +- 11 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java index 6a1d8de39..26e18c2f0 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java @@ -15,7 +15,6 @@ import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestIml; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestRp; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.Response; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; - import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -44,7 +43,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Hazard Disaggregation", + name = DisaggService.NAME, description = "USGS NSHM hazard disaggregation service") @Controller("/disagg") public class DisaggController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java index 124d9bcfb..94d502dec 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java @@ -36,7 +36,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.HazardRequest; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.meta.Parameter; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -57,7 +56,7 @@ public final class DisaggService { * OR imt=iml pairs */ - static final String NAME = "Disaggregation Service"; + static final String NAME = "Hazard Disaggregation"; static final Logger LOG = LoggerFactory.getLogger(DisaggService.class); // TODO range check return periods and imls diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java index 9dbddb3a2..628a48269 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java @@ -9,7 +9,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Response; - import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -38,7 +37,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Hazard Calculation", + name = HazardService.NAME, description = "USGS NSHM hazard calculation service") @Controller("/hazard") public class HazardController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index a0d5792ea..58ac15e46 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -53,7 +53,7 @@ import jakarta.inject.Singleton; @Singleton public final class HazardService { - static final String NAME = "Hazard Service"; + static final String NAME = "Hazard Curves"; static final Logger LOG = LoggerFactory.getLogger(HazardService.class); private static final String TOTAL_KEY = "Total"; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java index 202e71e23..471bf2f47 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java @@ -6,7 +6,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.RateService.ProbMetadata; import gov.usgs.earthquake.nshmp.www.source.RateService.Request; import gov.usgs.earthquake.nshmp.www.source.RateService.Response; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -32,7 +31,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Earthquake Probability Calculation", + name = RateService.NAME_PROBABILITY, description = "USGS NSHM earthquake probability calculation service") @Controller("/probability") public class ProbabilityController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java index c77d04303..b82dac9d5 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java @@ -6,7 +6,6 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.RateService.Metadata; import gov.usgs.earthquake.nshmp.www.source.RateService.Request; import gov.usgs.earthquake.nshmp.www.source.RateService.Response; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -32,7 +31,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Earthquake Rate Calculation", + name = RateService.NAME_RATE, description = "USGS NSHM earthquake rate calculation service") @Controller("/rate") public class RateController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java index 924070e7e..debaff320 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java @@ -42,8 +42,8 @@ import jakarta.inject.Singleton; @Singleton public final class RateService { - static final String NAME_RATE = "Earthquake Rate Service"; - static final String NAME_PROBABILITY = "Earthquake Probability Service"; + static final String NAME_RATE = "Earthquake Rates"; + static final String NAME_PROBABILITY = "Earthquake Probabilities"; static final Logger LOG = LoggerFactory.getLogger(RateService.class); /* @@ -348,7 +348,7 @@ public final class RateService { var url = request.getUri().toString(); var usage = new ProbMetadata(ServletUtil.model()); var body = ResponseBody.usage() - .name(NAME_RATE) + .name(NAME_PROBABILITY) .url(url) .metadata(new ResponseMetadata(HazVersion.appVersions())) .request(url) @@ -367,7 +367,6 @@ public final class RateService { Metadata(HazardModel model) { this.model = new SourceModel(model); - // TODO should get min max from model (fix via swagger openapi injection) longitude = new DoubleParameter( "Longitude", "°", diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 7c4c8b571..4c67995ba 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -4,7 +4,6 @@ import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.ResponseData; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; @@ -30,7 +29,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Source Model Information", + name = SourceService.NAME, description = "USGS NSHM source model metadata service") @Controller("/source") public class SourceController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index e15433041..0c239d4a5 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -30,7 +30,7 @@ import jakarta.inject.Inject; * @author U.S. Geological Survey */ @Tag( - name = "Source Model Logic Trees", + name = SourceLogicTreesService.NAME, description = "USGS NSHM source model logic tree service") @Controller("/trees") public class SourceLogicTreesController { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index d2bfdef9b..0777b148c 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -10,7 +10,6 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; - import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; @@ -23,7 +22,7 @@ import jakarta.inject.Singleton; @Singleton public class SourceLogicTreesService { - static final String NAME = "Source Logic Trees"; + static final String NAME = "Model Logic Trees"; static final Logger LOG = LoggerFactory.getLogger(SourceLogicTreesService.class); public static HttpResponse<String> getMetadata(HttpRequest<?> request) { diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index 3ecba39d3..777cd4b06 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -29,7 +29,7 @@ import jakarta.inject.Singleton; @Singleton public class SourceService { - static final String NAME = "Source Model"; + static final String NAME = "Model Contents"; static final Logger LOG = LoggerFactory.getLogger(SourceService.class); static HttpResponse<String> getMetadata(HttpRequest<?> request) { -- GitLab From 8a110dd31e6ad6d0e8e2daba529a381c20f49efc Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 08:28:35 -0600 Subject: [PATCH 18/25] removed unused enum --- .../nshmp/www/source/SourceService.java | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index 777cd4b06..f689f11f8 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -70,7 +70,6 @@ public class SourceService { final Set<Gmm> gmms; final Map<NehrpSiteClass, Double> siteClasses; final List<Parameter> imts; - // final Bounds public SourceModel(HazardModel model) { @@ -102,35 +101,4 @@ public class SourceService { return imts; } } - - enum Attributes { - /* Source model service */ - MODEL, - - /* Serializing */ - ID, - VALUE, - DISPLAY, - DISPLAYORDER, - YEAR, - PATH, - REGION, - IMT, - VS30, - SUPPORTS, - MINLATITUDE, - MINLONGITUDE, - MAXLATITUDE, - MAXLONGITUDE; - - /** Return upper case string */ - String toUpperCase() { - return name().toUpperCase(); - } - - /** Return lower case string */ - String toLowerCase() { - return name().toLowerCase(); - } - } } -- GitLab From 00e8780a71221e9064be06d743fd1255efa3f54d Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 09:14:01 -0600 Subject: [PATCH 19/25] added bounds to modle metadata --- .../usgs/earthquake/nshmp/www/source/SourceService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index f689f11f8..8e0d11fd8 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -5,6 +5,7 @@ import static java.util.stream.Collectors.toList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.DoubleStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,7 +71,7 @@ public class SourceService { final Set<Gmm> gmms; final Map<NehrpSiteClass, Double> siteClasses; final List<Parameter> imts; - // final Bounds + final List<Double> bounds; public SourceModel(HazardModel model) { name = model.name(); @@ -83,6 +84,7 @@ public class SourceService { .sorted() .map(imt -> new Parameter(ServletUtil.imtShortLabel(imt), imt.name())) .collect(toList()); + bounds = DoubleStream.of(model.bounds().toArray()).boxed().collect(toList()); } public String getName() { @@ -100,5 +102,9 @@ public class SourceService { public List<Parameter> getImts() { return imts; } + + public List<Double> getBounds() { + return bounds; + } } } -- GitLab From 58ed559e63e7b5b61a92bd3167c87252e21ed897 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 09:15:00 -0600 Subject: [PATCH 20/25] updated test model-info with bounds --- etc/peer/models/Set1-Case1/model-info.json | 8 +++++++- etc/peer/models/Set1-Case10-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case10/model-info.json | 8 +++++++- etc/peer/models/Set1-Case11-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case11/model-info.json | 8 +++++++- etc/peer/models/Set1-Case2-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case2/model-info.json | 8 +++++++- etc/peer/models/Set1-Case3-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case3/model-info.json | 8 +++++++- etc/peer/models/Set1-Case4-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case4/model-info.json | 8 +++++++- etc/peer/models/Set1-Case5-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case5/model-info.json | 8 +++++++- etc/peer/models/Set1-Case6-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case6/model-info.json | 8 +++++++- etc/peer/models/Set1-Case7-fast/model-info.json | 8 +++++++- etc/peer/models/Set1-Case7/model-info.json | 8 +++++++- etc/peer/models/Set1-Case8a/model-info.json | 8 +++++++- etc/peer/models/Set1-Case8b/model-info.json | 8 +++++++- etc/peer/models/Set1-Case8c/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2a-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2a/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2b-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2b/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2c-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2c/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2d-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case2d/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3a-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3a/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3b-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3b/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3c-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3c/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3d-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case3d/model-info.json | 8 +++++++- etc/peer/models/Set2-Case4a-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case4a/model-info.json | 8 +++++++- etc/peer/models/Set2-Case4b-fast/model-info.json | 8 +++++++- etc/peer/models/Set2-Case4b/model-info.json | 8 +++++++- etc/peer/models/Set2-Case5a/model-info.json | 8 +++++++- etc/peer/models/Set2-Case5b/model-info.json | 8 +++++++- 42 files changed, 294 insertions(+), 42 deletions(-) diff --git a/etc/peer/models/Set1-Case1/model-info.json b/etc/peer/models/Set1-Case1/model-info.json index 3b829666c..7df15efda 100644 --- a/etc/peer/models/Set1-Case1/model-info.json +++ b/etc/peer/models/Set1-Case1/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case1", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case10-fast/model-info.json b/etc/peer/models/Set1-Case10-fast/model-info.json index 694ee43da..c5fb0564a 100644 --- a/etc/peer/models/Set1-Case10-fast/model-info.json +++ b/etc/peer/models/Set1-Case10-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case10-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case10/model-info.json b/etc/peer/models/Set1-Case10/model-info.json index de753fa4c..fe35bed24 100644 --- a/etc/peer/models/Set1-Case10/model-info.json +++ b/etc/peer/models/Set1-Case10/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case10", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case11-fast/model-info.json b/etc/peer/models/Set1-Case11-fast/model-info.json index 2dacce72a..cfd96ad84 100644 --- a/etc/peer/models/Set1-Case11-fast/model-info.json +++ b/etc/peer/models/Set1-Case11-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case11-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case11/model-info.json b/etc/peer/models/Set1-Case11/model-info.json index 409dfa0b5..448442e2f 100644 --- a/etc/peer/models/Set1-Case11/model-info.json +++ b/etc/peer/models/Set1-Case11/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case11", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case2-fast/model-info.json b/etc/peer/models/Set1-Case2-fast/model-info.json index 9370e654d..3a9a2be59 100644 --- a/etc/peer/models/Set1-Case2-fast/model-info.json +++ b/etc/peer/models/Set1-Case2-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case2-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case2/model-info.json b/etc/peer/models/Set1-Case2/model-info.json index b3d26fbdd..70bc644a3 100644 --- a/etc/peer/models/Set1-Case2/model-info.json +++ b/etc/peer/models/Set1-Case2/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case2", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case3-fast/model-info.json b/etc/peer/models/Set1-Case3-fast/model-info.json index d4eeae0b2..a89a4123a 100644 --- a/etc/peer/models/Set1-Case3-fast/model-info.json +++ b/etc/peer/models/Set1-Case3-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case3-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case3/model-info.json b/etc/peer/models/Set1-Case3/model-info.json index d4eeae0b2..a89a4123a 100644 --- a/etc/peer/models/Set1-Case3/model-info.json +++ b/etc/peer/models/Set1-Case3/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case3-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case4-fast/model-info.json b/etc/peer/models/Set1-Case4-fast/model-info.json index 10ef01740..e6d0a7318 100644 --- a/etc/peer/models/Set1-Case4-fast/model-info.json +++ b/etc/peer/models/Set1-Case4-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case4-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case4/model-info.json b/etc/peer/models/Set1-Case4/model-info.json index c21277c9c..f36badfad 100644 --- a/etc/peer/models/Set1-Case4/model-info.json +++ b/etc/peer/models/Set1-Case4/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case4", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case5-fast/model-info.json b/etc/peer/models/Set1-Case5-fast/model-info.json index 853a2a136..26f0d0651 100644 --- a/etc/peer/models/Set1-Case5-fast/model-info.json +++ b/etc/peer/models/Set1-Case5-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case5-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case5/model-info.json b/etc/peer/models/Set1-Case5/model-info.json index 853a2a136..26f0d0651 100644 --- a/etc/peer/models/Set1-Case5/model-info.json +++ b/etc/peer/models/Set1-Case5/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case5-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case6-fast/model-info.json b/etc/peer/models/Set1-Case6-fast/model-info.json index 796efa335..6d30fa748 100644 --- a/etc/peer/models/Set1-Case6-fast/model-info.json +++ b/etc/peer/models/Set1-Case6-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case6-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case6/model-info.json b/etc/peer/models/Set1-Case6/model-info.json index 796efa335..6d30fa748 100644 --- a/etc/peer/models/Set1-Case6/model-info.json +++ b/etc/peer/models/Set1-Case6/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case6-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case7-fast/model-info.json b/etc/peer/models/Set1-Case7-fast/model-info.json index 89050cd2b..89447337c 100644 --- a/etc/peer/models/Set1-Case7-fast/model-info.json +++ b/etc/peer/models/Set1-Case7-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case7-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case7/model-info.json b/etc/peer/models/Set1-Case7/model-info.json index 89050cd2b..89447337c 100644 --- a/etc/peer/models/Set1-Case7/model-info.json +++ b/etc/peer/models/Set1-Case7/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case7-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case8a/model-info.json b/etc/peer/models/Set1-Case8a/model-info.json index abb6a5ec2..bcb8f124a 100644 --- a/etc/peer/models/Set1-Case8a/model-info.json +++ b/etc/peer/models/Set1-Case8a/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case8a", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case8b/model-info.json b/etc/peer/models/Set1-Case8b/model-info.json index 4aad25644..b02d84ea6 100644 --- a/etc/peer/models/Set1-Case8b/model-info.json +++ b/etc/peer/models/Set1-Case8b/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case8b", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set1-Case8c/model-info.json b/etc/peer/models/Set1-Case8c/model-info.json index 4aad25644..b02d84ea6 100644 --- a/etc/peer/models/Set1-Case8c/model-info.json +++ b/etc/peer/models/Set1-Case8c/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set1-Case8b", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": 36.0, + "min-longitude": -124.0, + "max-latitude": 40.0, + "max-longitude": -118.0 + } } diff --git a/etc/peer/models/Set2-Case2a-fast/model-info.json b/etc/peer/models/Set2-Case2a-fast/model-info.json index 8cc0e12f4..f8f95470c 100644 --- a/etc/peer/models/Set2-Case2a-fast/model-info.json +++ b/etc/peer/models/Set2-Case2a-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2a-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2a/model-info.json b/etc/peer/models/Set2-Case2a/model-info.json index 43538f814..f4e4ce90d 100644 --- a/etc/peer/models/Set2-Case2a/model-info.json +++ b/etc/peer/models/Set2-Case2a/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2a", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2b-fast/model-info.json b/etc/peer/models/Set2-Case2b-fast/model-info.json index f6794d3c6..5453bac3d 100644 --- a/etc/peer/models/Set2-Case2b-fast/model-info.json +++ b/etc/peer/models/Set2-Case2b-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2b-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2b/model-info.json b/etc/peer/models/Set2-Case2b/model-info.json index f6794d3c6..5453bac3d 100644 --- a/etc/peer/models/Set2-Case2b/model-info.json +++ b/etc/peer/models/Set2-Case2b/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2b-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2c-fast/model-info.json b/etc/peer/models/Set2-Case2c-fast/model-info.json index fb52af866..6a7b86f90 100644 --- a/etc/peer/models/Set2-Case2c-fast/model-info.json +++ b/etc/peer/models/Set2-Case2c-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2c-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2c/model-info.json b/etc/peer/models/Set2-Case2c/model-info.json index fb52af866..6a7b86f90 100644 --- a/etc/peer/models/Set2-Case2c/model-info.json +++ b/etc/peer/models/Set2-Case2c/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2c-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2d-fast/model-info.json b/etc/peer/models/Set2-Case2d-fast/model-info.json index 3bba48c39..517513126 100644 --- a/etc/peer/models/Set2-Case2d-fast/model-info.json +++ b/etc/peer/models/Set2-Case2d-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2d-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case2d/model-info.json b/etc/peer/models/Set2-Case2d/model-info.json index 3bba48c39..517513126 100644 --- a/etc/peer/models/Set2-Case2d/model-info.json +++ b/etc/peer/models/Set2-Case2d/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case2d-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3a-fast/model-info.json b/etc/peer/models/Set2-Case3a-fast/model-info.json index 07da7d081..6bb7beb0e 100644 --- a/etc/peer/models/Set2-Case3a-fast/model-info.json +++ b/etc/peer/models/Set2-Case3a-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3a-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3a/model-info.json b/etc/peer/models/Set2-Case3a/model-info.json index 42cd89f35..55edbc36e 100644 --- a/etc/peer/models/Set2-Case3a/model-info.json +++ b/etc/peer/models/Set2-Case3a/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3a", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3b-fast/model-info.json b/etc/peer/models/Set2-Case3b-fast/model-info.json index bb0c7e5e1..d4ae4c5cf 100644 --- a/etc/peer/models/Set2-Case3b-fast/model-info.json +++ b/etc/peer/models/Set2-Case3b-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3b-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3b/model-info.json b/etc/peer/models/Set2-Case3b/model-info.json index f5443c831..df2040827 100644 --- a/etc/peer/models/Set2-Case3b/model-info.json +++ b/etc/peer/models/Set2-Case3b/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3b", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3c-fast/model-info.json b/etc/peer/models/Set2-Case3c-fast/model-info.json index 21c15e1b3..64c155eff 100644 --- a/etc/peer/models/Set2-Case3c-fast/model-info.json +++ b/etc/peer/models/Set2-Case3c-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3c-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3c/model-info.json b/etc/peer/models/Set2-Case3c/model-info.json index 13a04b53a..39fa646e2 100644 --- a/etc/peer/models/Set2-Case3c/model-info.json +++ b/etc/peer/models/Set2-Case3c/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3c", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3d-fast/model-info.json b/etc/peer/models/Set2-Case3d-fast/model-info.json index 0ef2a77ce..0df777e6e 100644 --- a/etc/peer/models/Set2-Case3d-fast/model-info.json +++ b/etc/peer/models/Set2-Case3d-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3d-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case3d/model-info.json b/etc/peer/models/Set2-Case3d/model-info.json index 72e9a02e5..70ce5f198 100644 --- a/etc/peer/models/Set2-Case3d/model-info.json +++ b/etc/peer/models/Set2-Case3d/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case3d", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case4a-fast/model-info.json b/etc/peer/models/Set2-Case4a-fast/model-info.json index b5430f610..287e070f0 100644 --- a/etc/peer/models/Set2-Case4a-fast/model-info.json +++ b/etc/peer/models/Set2-Case4a-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case4a-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case4a/model-info.json b/etc/peer/models/Set2-Case4a/model-info.json index 06323a365..f025d7780 100644 --- a/etc/peer/models/Set2-Case4a/model-info.json +++ b/etc/peer/models/Set2-Case4a/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case4a", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case4b-fast/model-info.json b/etc/peer/models/Set2-Case4b-fast/model-info.json index 76594bccb..e2fd9dc5b 100644 --- a/etc/peer/models/Set2-Case4b-fast/model-info.json +++ b/etc/peer/models/Set2-Case4b-fast/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case4b-fast", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case4b/model-info.json b/etc/peer/models/Set2-Case4b/model-info.json index 67785f305..ac2e148bb 100644 --- a/etc/peer/models/Set2-Case4b/model-info.json +++ b/etc/peer/models/Set2-Case4b/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case4b", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case5a/model-info.json b/etc/peer/models/Set2-Case5a/model-info.json index b802ee2bd..014aef2f2 100644 --- a/etc/peer/models/Set2-Case5a/model-info.json +++ b/etc/peer/models/Set2-Case5a/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case5a", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } diff --git a/etc/peer/models/Set2-Case5b/model-info.json b/etc/peer/models/Set2-Case5b/model-info.json index a452ae449..ebd21d8ad 100644 --- a/etc/peer/models/Set2-Case5b/model-info.json +++ b/etc/peer/models/Set2-Case5b/model-info.json @@ -1,4 +1,10 @@ { "name": "PEER Set2-Case5b", - "site-class-vs30": { "BC": 760 } + "site-class-vs30": { "BC": 760 }, + "bounds": { + "min-latitude": -5.0, + "min-longitude": -70.0, + "max-latitude": 5.0, + "max-longitude": -50.0 + } } -- GitLab From 19f25f7c9f293492739bbe96b92ca8ae1883d9df Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 09:17:40 -0600 Subject: [PATCH 21/25] updated haz/disagg request class name --- .../usgs/earthquake/nshmp/www/hazard/DisaggService.java | 6 +++--- .../usgs/earthquake/nshmp/www/hazard/HazardService.java | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java index 94d502dec..6326db413 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java @@ -33,7 +33,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; -import gov.usgs.earthquake.nshmp.www.hazard.HazardService.HazardRequest; +import gov.usgs.earthquake.nshmp.www.hazard.HazardService.BaseRequest; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.meta.Parameter; import io.micronaut.http.HttpRequest; @@ -200,7 +200,7 @@ public final class DisaggService { return disagg; } - static final class RequestIml extends HazardRequest { + static final class RequestIml extends BaseRequest { final Map<Imt, Double> imls; final Set<DataType> dataTypes; @@ -226,7 +226,7 @@ public final class DisaggService { } } - static final class RequestRp extends HazardRequest { + static final class RequestRp extends BaseRequest { final double returnPeriod; final Set<DataType> dataTypes; final Set<Imt> imts; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index 58ac15e46..a177375ef 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -168,13 +168,14 @@ public final class HazardService { } } - static class HazardRequest { + /* Base request class for both hazard and disagg. */ + static class BaseRequest { final transient HttpRequest<?> http; final double longitude; final double latitude; final double vs30; - public HazardRequest( + public BaseRequest( HttpRequest<?> http, double longitude, double latitude, @@ -198,7 +199,7 @@ public final class HazardService { } } - static final class Request extends HazardRequest { + static final class Request extends BaseRequest { final boolean truncate; final boolean maxdir; final Set<Imt> imts; -- GitLab From e53da65361bcfb838290cd780304dee45d872f16 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 2 Jun 2022 09:19:57 -0600 Subject: [PATCH 22/25] spotless cleanup --- .../java/gov/usgs/earthquake/nshmp/www/SwaggerController.java | 1 + .../gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java | 1 + .../java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java | 1 + .../gov/usgs/earthquake/nshmp/www/hazard/HazardController.java | 1 + .../java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java | 1 + .../usgs/earthquake/nshmp/www/source/ProbabilityController.java | 1 + .../gov/usgs/earthquake/nshmp/www/source/RateController.java | 1 + .../java/gov/usgs/earthquake/nshmp/www/source/RateService.java | 1 + .../gov/usgs/earthquake/nshmp/www/source/SourceController.java | 1 + .../earthquake/nshmp/www/source/SourceLogicTreesController.java | 1 + .../earthquake/nshmp/www/source/SourceLogicTreesService.java | 1 + .../java/gov/usgs/earthquake/nshmp/www/source/SourceService.java | 1 + 12 files changed, 12 insertions(+) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java index a5a278300..ad2efec94 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/SwaggerController.java @@ -5,6 +5,7 @@ import java.util.List; import org.slf4j.LoggerFactory; import gov.usgs.earthquake.nshmp.model.HazardModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java index 26e18c2f0..ba7c7c070 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggController.java @@ -15,6 +15,7 @@ import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestIml; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.RequestRp; import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.Response; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; + import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java index 6326db413..ffb8bbbbe 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java @@ -36,6 +36,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.BaseRequest; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.meta.Parameter; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java index 628a48269..261b62b69 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardController.java @@ -9,6 +9,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Request; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Response; + import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java index a177375ef..691d27f40 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/HazardService.java @@ -40,6 +40,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.meta.Parameter; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java index 471bf2f47..33dbd1b17 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/ProbabilityController.java @@ -6,6 +6,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.RateService.ProbMetadata; import gov.usgs.earthquake.nshmp.www.source.RateService.Request; import gov.usgs.earthquake.nshmp.www.source.RateService.Response; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java index b82dac9d5..8dffb0c1f 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateController.java @@ -6,6 +6,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.RateService.Metadata; import gov.usgs.earthquake.nshmp.www.source.RateService.Request; import gov.usgs.earthquake.nshmp.www.source.RateService.Response; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java index debaff320..b610a9935 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/RateService.java @@ -29,6 +29,7 @@ import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java index 4c67995ba..2bd63ae10 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceController.java @@ -4,6 +4,7 @@ import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet; import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.ResponseData; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.MediaType; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java index 0c239d4a5..971c66e80 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesController.java @@ -5,6 +5,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.Metadata; import gov.usgs.earthquake.nshmp.www.source.SourceLogicTreesService.RequestData; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Controller; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java index 0777b148c..3f0fe6541 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceLogicTreesService.java @@ -10,6 +10,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.source.SourceService.SourceModel; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java index 8e0d11fd8..6cedce847 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/source/SourceService.java @@ -18,6 +18,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseBody; import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.meta.Parameter; + import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import jakarta.inject.Singleton; -- GitLab From 56f55c1aa932ac8df150aecde752e7019788b110 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 16 Jun 2022 11:14:25 -0600 Subject: [PATCH 23/25] updated static files --- CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index aaf77a377..ce3bee95b 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -3,4 +3,4 @@ All contributions to and interactions surrounding this project will abide by the [USGS Code of Scientific Conduct][1]. -[1]: https://www.usgs.gov/about/organization/science-support/office-science-quality-and-integrity/code-scientific-conduct +[1]: https://www.usgs.gov/office-of-science-quality-and-integrity/fundamental-science-practices diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 13b639a18..677ba76f9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,5 +11,5 @@ into the project you can [fork this repository][2] and [submit a merge request][3] for review. [1]: https://code.usgs.gov/ghsc/nshmp/nshmp-haz/-/issues -[2]: https://docs.gitlab.com/ee/gitlab-basics/fork-project.html -[3]: https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html +[2]: https://docs.gitlab.com/ee/user/project/repository/forking_workflow.html#creating-a-fork +[3]: https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html -- GitLab From 2df1e290cda3995a3d83818aa114ef6577054790 Mon Sep 17 00:00:00 2001 From: Peter Powers <pmpowers@usgs.gov> Date: Thu, 16 Jun 2022 11:15:19 -0600 Subject: [PATCH 24/25] updated atten boundary --- ...wus-ceus-attenuation-boundary-2023.geojson | 57 +++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 etc/nshm/wus-ceus-attenuation-boundary-2023.geojson diff --git a/etc/nshm/wus-ceus-attenuation-boundary-2023.geojson b/etc/nshm/wus-ceus-attenuation-boundary-2023.geojson new file mode 100644 index 000000000..a69f5638c --- /dev/null +++ b/etc/nshm/wus-ceus-attenuation-boundary-2023.geojson @@ -0,0 +1,57 @@ +{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [-113.348, 48.997], + [-112.200, 47.550], + [-110.600, 46.850], + [-110.500, 46.450], + [-110.350, 45.750], + [-110.000, 45.500], + [-109.900, 44.900], + [-110.050, 44.150], + [-110.500, 43.000], + [-110.500, 42.180], + [-110.750, 41.000], + [-110.200, 40.000], + [-111.350, 39.550], + [-112.250, 38.000], + [-112.450, 37.000], + [-112.300, 36.200], + [-112.300, 35.700], + [-112.300, 35.250], + [-111.000, 34.500], + [-110.000, 34.400], + [-109.000, 34.250], + [-108.000, 34.600], + [-107.450, 35.000], + [-107.450, 36.500], + [-108.200, 37.000], + [-108.250, 38.000], + [-108.200, 38.750], + [-108.000, 39.100], + [-107.500, 39.550], + [-107.000, 39.650], + [-106.500, 39.800], + [-106.000, 39.850], + [-105.400, 39.800], + [-104.800, 38.450], + [-105.100, 37.900], + [-104.500, 37.100], + [-104.600, 36.950], + [-105.120, 36.810], + [-105.170, 36.590], + [-105.300, 35.950], + [-105.250, 34.450], + [-105.550, 33.850], + [-105.350, 33.250], + [-104.500, 31.700], + [-102.361, 29.828] + ] + }, + "properties": { + "stroke": "#FC4445", + "title": "WUS-CEUS Attenuation Boundary (2023)" + } +} diff --git a/gradle.properties b/gradle.properties index edb602673..3f4883535 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ micronautVersion = 3.2.3 micronautRxVersion = 2.1.1 nodePluginVersion = 3.0.1 nodeVersion = 16.3.0 -nshmpLibVersion = 1.1.7 +nshmpLibVersion = 1.1.8 nshmpWsUtilsVersion = 0.3.11 openApiVersion = 4.0.0 shadowVersion = 7.1.2 -- GitLab From 3d5bb66c5d631bddda2975c40d80c3a770c5bc43 Mon Sep 17 00:00:00 2001 From: Brandon Clayton <bclayton@usgs.gov> Date: Tue, 21 Jun 2022 08:58:05 -0600 Subject: [PATCH 25/25] add metadata for usage --- .../nshmp/www/hazard/DisaggService.java | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java index ffb8bbbbe..f9b065a66 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/www/hazard/DisaggService.java @@ -34,7 +34,7 @@ import gov.usgs.earthquake.nshmp.www.ResponseMetadata; import gov.usgs.earthquake.nshmp.www.ServletUtil; import gov.usgs.earthquake.nshmp.www.ServletUtil.Server; import gov.usgs.earthquake.nshmp.www.hazard.HazardService.BaseRequest; -import gov.usgs.earthquake.nshmp.www.hazard.HazardService.Metadata; +import gov.usgs.earthquake.nshmp.www.meta.DoubleParameter; import gov.usgs.earthquake.nshmp.www.meta.Parameter; import io.micronaut.http.HttpRequest; @@ -263,15 +263,15 @@ public final class DisaggService { } static final class Response { - final Response.Metadata metadata; + final ResponseMetadata metadata; final List<ImtDisagg> disaggs; - Response(Response.Metadata metadata, List<ImtDisagg> disaggs) { + Response(ResponseMetadata metadata, List<ImtDisagg> disaggs) { this.metadata = metadata; this.disaggs = disaggs; } - public Response.Metadata getMetadata() { + public ResponseMetadata getMetadata() { return metadata; } @@ -279,14 +279,14 @@ public final class DisaggService { return disaggs; } - private static final class Metadata { + private static final class ResponseMetadata { final Server server; final String rlabel = "Closest Distance, rRup (km)"; final String mlabel = "Magnitude (Mw)"; final String εlabel = "% Contribution to Hazard"; final Object εbins; - Metadata(Server server, Object εbins) { + ResponseMetadata(Server server, Object εbins) { this.server = server; this.εbins = εbins; } @@ -361,7 +361,7 @@ public final class DisaggService { var server = ServletUtil.serverData(ServletUtil.THREAD_COUNT, timer); return new Response( - new Response.Metadata(server, disagg.εBins()), + new ResponseMetadata(server, disagg.εBins()), disaggs); } } @@ -386,4 +386,33 @@ public final class DisaggService { return data; } } + + private static class Metadata extends HazardService.Metadata { + final DoubleParameter iml; + final DoubleParameter returnPeriod; + + Metadata(HazardModel model) { + super(model); + + iml = new DoubleParameter( + "Intensity Measure Level", + "", + imlRange.lowerEndpoint(), + imlRange.upperEndpoint()); + + returnPeriod = new DoubleParameter( + "Return Period", + "yr", + rpRange.lowerEndpoint(), + rpRange.upperEndpoint()); + } + + public DoubleParameter getIml() { + return iml; + } + + public DoubleParameter getReturnPeriod() { + return returnPeriod; + } + } } -- GitLab