From 1b930b0436701be947f752960d22553ff26e9964 Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Tue, 1 Mar 2022 09:58:39 -0700
Subject: [PATCH] zSed in site data now passed to chapman

---
 .../gov/usgs/earthquake/nshmp/calc/Sites.java |  8 +--
 .../nshmp/gmm/NgaEastUsgs_2017.java           |  8 +--
 .../usgs/earthquake/nshmp/model/SiteData.java | 53 +++++++++----------
 3 files changed, 33 insertions(+), 36 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/Sites.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/Sites.java
index a8ebc50d..33c7c541 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/Sites.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/Sites.java
@@ -118,10 +118,10 @@ public final class Sites {
       SiteData siteData) {
 
     Site.Builder builder = Site.builder().location(loc);
-    SiteData.Values sdValues = siteData.get(loc);
-    sdValues.z1p0.ifPresent(builder::z1p0);
-    sdValues.z2p5.ifPresent(builder::z2p5);
-
+    SiteData.Values values = siteData.get(loc);
+    values.z1p0.ifPresent(builder::z1p0);
+    values.z2p5.ifPresent(builder::z2p5);
+    values.zSed.ifPresent(builder::zSed);
     return builder;
   }
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEastUsgs_2017.java b/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEastUsgs_2017.java
index b5796f43..48005c04 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEastUsgs_2017.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/gmm/NgaEastUsgs_2017.java
@@ -409,9 +409,9 @@ public abstract class NgaEastUsgs_2017 implements GroundMotionModel {
 
     @Override
     public LogicTree<GroundMotion> calc(GmmInput in) {
-      double cpa = Double.isNaN(in.z2p5)
+      double cpa = Double.isNaN(in.zSed)
           ? 0.0
-          : log(ChapmanGuo_2021.cpaPsaRatio(imt, in.z2p5, in.Mw, in.rJB));
+          : log(ChapmanGuo_2021.cpaPsaRatio(imt, in.zSed, in.Mw, in.rJB));
       Position p = tables[0].position(in.rRup, in.Mw);
       double[] μs = new double[MODEL_COUNT];
       for (int i = 0; i < MODEL_COUNT; i++) {
@@ -542,9 +542,9 @@ public abstract class NgaEastUsgs_2017 implements GroundMotionModel {
     @Override
     public LogicTree<GroundMotion> calc(GmmInput in) {
       GmmInput inRock = GmmInput.builder().fromCopy(in).vs30(3000).build();
-      double cpa = Double.isNaN(in.z2p5)
+      double cpa = Double.isNaN(in.zSed)
           ? 0.0
-          : log(ChapmanGuo_2021.cpaPsaRatio(imt, in.z2p5, in.Mw, in.rJB));
+          : log(ChapmanGuo_2021.cpaPsaRatio(imt, in.zSed, in.Mw, in.rJB));
       Position p = tables.values().iterator().next().position(in.rRup, in.Mw);
       double[] μs = new double[GMMS.size()];
       for (int i = 0; i < GMMS.size(); i++) {
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java b/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java
index 83f72e77..54356f75 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/SiteData.java
@@ -71,27 +71,37 @@ public class SiteData {
   }
 
   /**
-   * Return the site data values for the specified location.
+   * Return the site data values for the specified location. Once a polygon
+   * 'hit' ocurs, method breaks out of search loops.
    *
    * @param location of interest
    */
   public Values get(Location location) {
     Values.Builder builder = new Values.Builder();
     for (Basin basin : basins) {
-      if (basin.contains(location)) {
-        builder.basinValues(basin.get(location));
+      Location snapped = snapToGrid(location, basin.spacing, basin.scale);
+      if (basin.contains(snapped)) {
+        builder.basinValues(basin.data.get(snapped));
         break;
       }
     }
     for (Margin margin : margins) {
-      if (margin.contains(location)) {
-        builder.marginValues(margin.get(location));
+      Location snapped = snapToGrid(location, margin.spacing, margin.scale);
+      if (margin.contains(snapped)) {
+        builder.marginValues(margin.data.get(snapped));
         break;
       }
     }
     return builder.build();
   }
 
+  /* Snap location to closest multiple of spacing. */
+  private static Location snapToGrid(Location loc, double spacing, int scale) {
+    return Location.create(
+        snapToGrid(loc.longitude, spacing, scale),
+        snapToGrid(loc.latitude, spacing, scale));
+  }
+
   /*
    * Snap value to closest multiple of spacing.
    *
@@ -184,10 +194,11 @@ public class SiteData {
     final String name;
     final String id;
     final String model;
+    final double spacing;
     final int scale;
     final Feature feature;
     final Area area;
-    final Map<Location, Values> dataMap;
+    final Map<Location, Values> data;
 
     private Basin(Path geojson) {
       Feature feature = GeoJson.from(geojson).toFeature();
@@ -195,12 +206,12 @@ public class SiteData {
       this.name = properties.getString(NAME).orElseThrow();
       this.id = properties.getString(ID).orElseThrow();
       this.model = properties.getString(MODEL).orElseThrow();
-      double spacing = properties.getDouble(SPACING).orElseThrow();
+      this.spacing = properties.getDouble(SPACING).orElseThrow();
       this.scale = BigDecimal.valueOf(spacing).scale();
       this.feature = feature;
       this.area = new Area(Locations.toPath(feature.asPolygonBorder()));
-      Path dataFile = geojson.resolveSibling(id + ".csv");
-      this.dataMap = loadData(dataFile);
+      Path csvpath = geojson.resolveSibling(id + ".csv");
+      this.data = loadData(csvpath);
     }
 
     /* Return whether the basin contains the supplied location. */
@@ -208,14 +219,6 @@ public class SiteData {
       return area.contains(loc.longitude, loc.latitude);
     }
 
-    Values get(Location loc) {
-
-      Location roundedLoc = Location.create(
-          Maths.round(loc.longitude, scale),
-          Maths.round(loc.latitude, scale));
-      return dataMap.get(roundedLoc);
-    }
-
     private Map<Location, Values> loadData(Path file) {
       DelimitedData csv = DelimitedData.comma(file);
       try (Stream<Record> stream = csv.records()) {
@@ -253,7 +256,7 @@ public class SiteData {
     final int scale;
     final Feature feature;
     final Area area;
-    final Map<Location, Values> dataMap;
+    final Map<Location, Values> data;
 
     private Margin(Path geojson) {
       Feature feature = GeoJson.from(geojson).toFeature();
@@ -265,8 +268,8 @@ public class SiteData {
       this.scale = BigDecimal.valueOf(spacing).scale();
       this.feature = feature;
       this.area = new Area(Locations.toPath(feature.asPolygonBorder()));
-      Path dataFile = geojson.resolveSibling(id + ".csv");
-      this.dataMap = loadData(dataFile);
+      Path csvpath = geojson.resolveSibling(id + ".csv");
+      this.data = loadData(csvpath);
     }
 
     /* Return whether the basin contains the supplied location. */
@@ -274,13 +277,6 @@ public class SiteData {
       return area.contains(loc.longitude, loc.latitude);
     }
 
-    Values get(Location loc) {
-      Location snappedLoc = Location.create(
-          snapToGrid(loc.longitude, spacing, scale),
-          snapToGrid(loc.latitude, spacing, scale));
-      return dataMap.get(snappedLoc);
-    }
-
     private Map<Location, Values> loadData(Path file) {
       DelimitedData csv = DelimitedData.comma(file);
       try (Stream<Record> stream = csv.records()) {
@@ -291,7 +287,8 @@ public class SiteData {
     }
 
     private static Values toValues(Record record) {
-      return new Values(record.getDouble("zsed"));
+      double value = Maths.round(record.getDouble("zsed") / 1000.0, 3);
+      return new Values(value);
     }
 
     static final class Values {
-- 
GitLab