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