From 3b0eb2b8323e14bf3b0c98ea84d3f2a453553fd4 Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Sun, 6 Feb 2022 13:38:21 -0700
Subject: [PATCH] updates for lib

---
 .../gov/usgs/earthquake/nshmp/DisaggCalc.java | 26 +++++++++++----
 .../nshmp/www/hazard/DisaggController.java    | 24 ++++++--------
 .../nshmp/www/hazard/DisaggService.java       | 32 +++++++++++++++----
 .../nshmp/www/hazard/HazardController.java    | 11 +++----
 .../nshmp/www/hazard/HazardService.java       | 27 ++++++++++++++++
 5 files changed, 85 insertions(+), 35 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java b/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
index ae5129376..de59f18b2 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/DisaggCalc.java
@@ -3,6 +3,9 @@ package gov.usgs.earthquake.nshmp;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static gov.usgs.earthquake.nshmp.Text.NEWLINE;
+import static gov.usgs.earthquake.nshmp.calc.DataType.DISAGG_DATA;
+import static gov.usgs.earthquake.nshmp.calc.DataType.GMM;
+import static gov.usgs.earthquake.nshmp.calc.DataType.SOURCE;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
 
@@ -292,16 +295,13 @@ public class DisaggCalc {
       Site site = sites.get(i);
 
       Hazard hazard = HazardCalcs.hazard(model, config, site, exec);
+      handler.write(hazard);
 
       Map<Imt, Double> imls = imlsForReturnPeriod(hazard, returnPeriod);
-
       Disaggregation disagg = Disaggregation.atImls(hazard, imls, exec);
 
-      // needs to handle disagg same way as iml
-      // handler.write(hazard, Optional.of(disagg));
-      handler.write(hazard, Optional.empty());
-
       Response response = new Response.Builder()
+          .config(config)
           .site(site)
           .returnPeriod(returnPeriod)
           .imls(imls)
@@ -392,6 +392,7 @@ public class DisaggCalc {
       Disaggregation disagg = Disaggregation.atImls(hazard, siteImls, exec);
 
       Response response = new Response.Builder()
+          .config(config)
           .site(site)
           .imls(siteImls)
           .disagg(disagg)
@@ -454,10 +455,11 @@ public class DisaggCalc {
 
     static final class Builder {
 
-      Disaggregation disagg;
       Site site;
+      Disaggregation disagg;
       Double returnPeriod; // optional
       Map<Imt, Double> imls;
+      CalcConfig config;
 
       Builder imls(Map<Imt, Double> imls) {
         this.imls = imls;
@@ -479,10 +481,20 @@ public class DisaggCalc {
         return this;
       }
 
+      Builder config(CalcConfig config) {
+        this.config = config;
+        return this;
+      }
+
       Response build() {
 
+        // default toJson(imt, false, false, false)
         List<ImtDisagg> disaggs = imls.keySet().stream()
-            .map(imt -> new ImtDisagg(imt, disagg.toJson(imt)))
+            .map(imt -> new ImtDisagg(imt, disagg.toJson(
+                imt,
+                config.output.dataTypes.contains(GMM),
+                config.output.dataTypes.contains(SOURCE),
+                config.output.dataTypes.contains(DISAGG_DATA))))
             .collect(toList());
 
         return new Response(
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 0642f7b0c..e2057cf1c 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
@@ -9,6 +9,8 @@ import gov.usgs.earthquake.nshmp.calc.DataType;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
 import gov.usgs.earthquake.nshmp.www.ServletUtil;
+import gov.usgs.earthquake.nshmp.www.hazard.DisaggService.DisaggDataType;
+import gov.usgs.earthquake.nshmp.www.hazard.HazardService.HazardImt;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
@@ -63,11 +65,9 @@ public class DisaggController {
    * @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,
-   *        then the supported set for the installed model is used. Note that a
-   *        model may not support all the values listed below (see
-   *        disagreggation metadata). Responses for numerous IMT's are quite
-   *        large, on the order of MB. Multiple IMTs may be comma delimited,
-   *        e.g. ?imt=PGA,SA0p2,SA1P0.
+   *        then the supported set for the installed model is used. Responses
+   *        for numerous IMT's are quite large, on the order of MB.
+   * @param out The data types to output
    */
   @Operation(
       summary = "Disaggregate hazard at a specified return period",
@@ -92,11 +92,8 @@ public class DisaggController {
       @Schema(
           minimum = "150",
           maximum = "3000") @PathVariable double returnPeriod,
-      @QueryValue @Nullable Set<Imt> imt,
-      @Schema(allowableValues = {
-          "DISAGG_DATA",
-          "GMM",
-          "SOURCE" }) @QueryValue @Nullable Set<DataType> out) {
+      @QueryValue @Nullable Set<HazardImt> imt,
+      @QueryValue @Nullable Set<DisaggDataType> out) {
     try {
       Set<Imt> imts = HazardService.readImts(http);
       Set<DataType> dataTypes = HazardService.readDataTypes(http);
@@ -141,17 +138,14 @@ public class DisaggController {
       @Schema(
           minimum = "150",
           maximum = "3000") @PathVariable double vs30,
-      @Schema(allowableValues = {
-          "DISAGG_DATA",
-          "GMM",
-          "SOURCE" }) @QueryValue @Nullable Set<DataType> out) {
+      @QueryValue @Nullable Set<DisaggDataType> out) {
 
     /*
      * Developer notes:
      *
      * It is awkward to support IMT=#; numerous unique keys that may or may not
      * be present yields a clunky swagger interface. The disagg-iml endpoint
-     * requires one or more IMT=# query arguments. Documented in example.
+     * requires one or more IMT=# query arguments. Document in example.
      */
 
     try {
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 d39349088..bb5dc96bb 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
@@ -1,5 +1,8 @@
 package gov.usgs.earthquake.nshmp.www.hazard;
 
+import static gov.usgs.earthquake.nshmp.calc.DataType.DISAGG_DATA;
+import static gov.usgs.earthquake.nshmp.calc.DataType.GMM;
+import static gov.usgs.earthquake.nshmp.calc.DataType.SOURCE;
 import static java.util.stream.Collectors.toList;
 
 import java.util.List;
@@ -15,6 +18,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.Range;
 
+import gov.usgs.earthquake.nshmp.DisaggCalc;
 import gov.usgs.earthquake.nshmp.calc.CalcConfig;
 import gov.usgs.earthquake.nshmp.calc.DataType;
 import gov.usgs.earthquake.nshmp.calc.Disaggregation;
@@ -54,6 +58,13 @@ public final class DisaggService {
   private static Range<Double> rpRange = Range.closed(1.0, 20000.0);
   private static Range<Double> imlRange = Range.closed(0.0001, 8.0);
 
+  /* For Swagger selctions */
+  enum DisaggDataType {
+    GMM,
+    SOURCE,
+    DISAGG_DATA;
+  }
+
   /** HazardController.doGetMetadata() handler. */
   static HttpResponse<String> getMetadata(HttpRequest<?> request) {
     var url = request.getUri().toString();
@@ -178,13 +189,13 @@ public final class DisaggService {
         ServletUtil.TASK_EXECUTOR);
 
     Hazard hazard = hazFuture.get();
-    // Map<Imt, Double> imls = DisaggCalc.imlsForReturnPeriod(
-    // hazard,
-    // request.returnPeriod);
+    Map<Imt, Double> imls = DisaggCalc.imlsForReturnPeriod(
+        hazard,
+        request.returnPeriod);
 
     CompletableFuture<Disaggregation> disaggfuture = CompletableFuture.supplyAsync(
-        () -> Disaggregation.atReturnPeriod(
-            hazard, request.returnPeriod,
+        () -> Disaggregation.atImls(
+            hazard, imls,
             ServletUtil.CALC_EXECUTOR),
         ServletUtil.TASK_EXECUTOR);
 
@@ -278,6 +289,7 @@ public final class DisaggService {
       Optional<RequestRp> requestRp = Optional.empty();
       Optional<RequestIml> requestIml = Optional.empty();
       Disaggregation disagg;
+      CalcConfig config;
 
       Builder timer(Stopwatch timer) {
         this.timer = timer;
@@ -304,8 +316,16 @@ public final class DisaggService {
             ? requestRp.orElseThrow().imts
             : requestIml.orElseThrow().imls.keySet();
 
+        Set<DataType> dataTypes = requestRp.isPresent()
+            ? requestRp.orElseThrow().dataTypes
+            : requestIml.orElseThrow().dataTypes;
+
         List<ImtDisagg> disaggs = imts.stream()
-            .map(imt -> new ImtDisagg(imt, disagg.toJson(imt)))
+            .map(imt -> new ImtDisagg(imt, disagg.toJson(
+                imt,
+                dataTypes.contains(GMM),
+                dataTypes.contains(SOURCE),
+                dataTypes.contains(DISAGG_DATA))))
             .collect(toList());
 
         Object server = ServletUtil.serverData(ServletUtil.THREAD_COUNT, timer);
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 1646f6ae2..68450a14f 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
@@ -5,7 +5,7 @@ import java.util.Set;
 import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.www.NshmpMicronautServlet;
 import gov.usgs.earthquake.nshmp.www.ServletUtil;
-
+import gov.usgs.earthquake.nshmp.www.hazard.HazardService.HazardImt;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.HttpResponse;
@@ -60,11 +60,8 @@ public class HazardController {
    * @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. Note that a
-   *        model may not support all the values listed below (see
-   *        disagreggation metadata). Responses for numerous IMT's are quite
-   *        large, on the order of MB. Multiple IMTs may be comma delimited,
-   *        e.g. ?imt=PGA,SA0p2,SA1P0.
+   *        then the supported set for the installed model is used. Responses
+   *        for numerous IMT's are quite large, on the order of MB.
    *
    */
   @Operation(
@@ -91,7 +88,7 @@ public class HazardController {
           defaultValue = "false") @Nullable Boolean truncate,
       @QueryValue(
           defaultValue = "false") @Nullable Boolean maxdir,
-      @QueryValue @Nullable Set<Imt> imt) {
+      @QueryValue @Nullable Set<HazardImt> imt) {
     try {
       Set<Imt> imts = HazardService.readImts(http);
       HazardService.Request request = new HazardService.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 5b41bbe78..f3f98aeac 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
@@ -57,6 +57,33 @@ public final class HazardService {
 
   private static final String TOTAL_KEY = "Total";
 
+  /* For Swagger selections; mprs + pgv */
+  enum HazardImt {
+    PGA,
+    PGV,
+    SA0P01,
+    SA0P02,
+    SA0P03,
+    SA0P05,
+    SA0P075,
+    SA0P1,
+    SA0P15,
+    SA0P2,
+    SA0P25,
+    SA0P3,
+    SA0P4,
+    SA0P5,
+    SA0P75,
+    SA1P0,
+    SA1P5,
+    SA2P0,
+    SA3P0,
+    SA4P0,
+    SA5P0,
+    SA7P5,
+    SA10P0;
+  }
+
   /** HazardController.doGetUsage() handler. */
   public static HttpResponse<String> getMetadata(HttpRequest<?> request) {
     var url = request.getUri().toString();
-- 
GitLab