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>&timespan=<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>&timespan=<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>&timespan=<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