From e985183ee3afaf33b8f9a4865ac3f9e66249034d Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Fri, 4 Feb 2022 13:50:17 -0700
Subject: [PATCH] applied sigma scaling in gm2curves

---
 .../earthquake/nshmp/calc/CalcConfig.java     | 16 +++++++--------
 .../nshmp/calc/ExceedanceModel.java           |  6 ++++--
 .../earthquake/nshmp/calc/Transforms.java     | 20 +++++++++----------
 .../usgs/earthquake/nshmp/model/Distance.java |  9 ---------
 .../resources/calc/calc-config-defaults.json  |  2 +-
 .../nshmp/calc/CalcConfigTests.java           |  4 ++--
 .../resources/calc/calc-config-extends.json   |  2 +-
 7 files changed, 26 insertions(+), 33 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java
index 7ec631bf..48daad71 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/CalcConfig.java
@@ -233,7 +233,7 @@ public final class CalcConfig {
      * <p><b>Default:</b> 1.0<br><b>Range:</b> {@code 0.5} to {@code 1.0} (50%
      * to 100%, no scaling)
      */
-    public final double gmmSigmaScaling;
+    public final double gmmSigmaScale;
 
     /**
      * The value format for hazard curves.
@@ -256,7 +256,7 @@ public final class CalcConfig {
       this.sourceTypes = b.sourceTypes;
       this.vs30s = b.vs30s;
       this.gmmDampingRatio = b.gmmDampingRatio;
-      this.gmmSigmaScaling = b.gmmSigmaScaling;
+      this.gmmSigmaScale = b.gmmSigmaScale;
       this.valueFormat = b.valueFormat;
 
       this.customImls = b.customImls;
@@ -298,7 +298,7 @@ public final class CalcConfig {
       Set<SourceType> sourceTypes;
       Set<Double> vs30s;
       Double gmmDampingRatio;
-      Double gmmSigmaScaling;
+      Double gmmSigmaScale;
       ValueFormat valueFormat;
       Map<Imt, double[]> customImls;
       Map<Imt, XySequence> curveMap;
@@ -317,11 +317,11 @@ public final class CalcConfig {
             RezaeianDamping_2014.DAMPING_RATIO_RANGE,
             "gmmDampingRatio",
             gmmDampingRatio);
-        checkNotNull(gmmSigmaScaling);
+        checkNotNull(gmmSigmaScale);
         checkInRange(
             Range.closed(0.5, 1.0),
             "gmmSigmaScaling",
-            gmmSigmaScaling);
+            gmmSigmaScale);
         checkNotNull(valueFormat);
         checkNotNull(customImls);
         return new Hazard(this);
@@ -335,7 +335,7 @@ public final class CalcConfig {
         this.sourceTypes = that.sourceTypes;
         this.vs30s = that.vs30s;
         this.gmmDampingRatio = that.gmmDampingRatio;
-        this.gmmSigmaScaling = that.gmmSigmaScaling;
+        this.gmmSigmaScale = that.gmmSigmaScale;
         this.valueFormat = that.valueFormat;
         this.customImls = that.customImls;
       }
@@ -362,8 +362,8 @@ public final class CalcConfig {
         if (that.gmmDampingRatio != null) {
           this.gmmDampingRatio = that.gmmDampingRatio;
         }
-        if (that.gmmSigmaScaling != null) {
-          this.gmmSigmaScaling = that.gmmSigmaScaling;
+        if (that.gmmSigmaScale != null) {
+          this.gmmSigmaScale = that.gmmSigmaScale;
         }
         if (that.valueFormat != null) {
           this.valueFormat = that.valueFormat;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java
index 2921bcff..63bf9a35 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/ExceedanceModel.java
@@ -301,13 +301,14 @@ public enum ExceedanceModel {
   LogicTree<MutableXySequence> treeExceedance(
       LogicTree<GroundMotion> gmTree,
       double n,
+      double σScale,
       Imt imt,
       MutableXySequence sequence) {
 
     return Trees.transform(
         gmTree,
         gm -> exceedance(
-            gm.mean(), gm.sigma(), n, imt,
+            gm.mean(), gm.sigma() * σScale, n, imt,
             MutableXySequence.emptyCopyOf(sequence)),
         Optional.of(TREE_NAME));
   }
@@ -319,6 +320,7 @@ public enum ExceedanceModel {
   XySequence treeExceedanceCombined(
       LogicTree<GroundMotion> gmTree,
       double n,
+      double σScale,
       Imt imt,
       MutableXySequence sequence) {
 
@@ -327,7 +329,7 @@ public enum ExceedanceModel {
 
     for (Branch<GroundMotion> branch : gmTree) {
       GroundMotion gm = branch.value();
-      exceedance(gm.mean(), gm.sigma(), n, imt, branchCurve);
+      exceedance(gm.mean(), gm.sigma() * σScale, n, imt, branchCurve);
       sequence.add(branchCurve.multiply(branch.weight()));
     }
     return sequence;
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java
index 8e9988b8..27aecac8 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java
@@ -157,11 +157,13 @@ final class Transforms {
     private final Map<Imt, XySequence> modelCurves;
     private final ExceedanceModel exceedanceModel;
     private final double truncationLevel;
+    private final double σScale;
 
     GroundMotionsToCurves(CalcConfig config) {
       this.modelCurves = config.hazard.logModelCurves();
       this.exceedanceModel = config.hazard.exceedanceModel;
       this.truncationLevel = config.hazard.truncationLevel;
+      this.σScale = config.hazard.gmmSigmaScale;
     }
 
     @Override
@@ -174,7 +176,6 @@ final class Transforms {
         Imt imt = imtEntry.getKey();
         XySequence modelCurve = modelCurves.get(imt);
         MutableXySequence gmmCurve = MutableXySequence.copyOf(modelCurve);
-
         MutableXySequence utilCurve = MutableXySequence.emptyCopyOf(modelCurve);
 
         /*
@@ -184,20 +185,16 @@ final class Transforms {
 
         for (Entry<Gmm, List<LogicTree<GroundMotion>>> gmmEntry : imtEntry.getValue().entrySet()) {
           gmmCurve.clear();
-          int i = 0;
-          for (LogicTree<GroundMotion> gmTree : gmmEntry.getValue()) {
-
-            double rate = gms.inputs.get(i++).rate;
-
+          List<LogicTree<GroundMotion>> gmTrees = gmmEntry.getValue();
+          for (int i = 0; i < gmTrees.size(); i++) {
             exceedanceModel.treeExceedanceCombined(
-                gmTree,
+                gmTrees.get(i),
                 truncationLevel,
+                σScale,
                 imt,
                 utilCurve);
-
-            utilCurve.multiply(rate);
+            utilCurve.multiply(gms.inputs.get(i).rate);
             gmmCurve.add(utilCurve);
-
           }
           curveBuilder.addCurve(imt, gmmEntry.getKey(), gmmCurve);
         }
@@ -480,11 +477,13 @@ final class Transforms {
     private final Map<Imt, XySequence> logModelCurves;
     private final ExceedanceModel exceedanceModel;
     private final double truncationLevel;
+    private final double σScale;
 
     ClusterGroundMotionsToCurves(CalcConfig config) {
       this.logModelCurves = config.hazard.logModelCurves();
       this.exceedanceModel = config.hazard.exceedanceModel;
       this.truncationLevel = config.hazard.truncationLevel;
+      this.σScale = config.hazard.gmmSigmaScale;
     }
 
     @Override
@@ -531,6 +530,7 @@ final class Transforms {
               LogicTree<MutableXySequence> magTreeCurves = exceedanceModel.treeExceedance(
                   gmTree,
                   truncationLevel,
+                  σScale,
                   imt,
                   utilCurve);
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java b/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java
index 21065fbd..8e85bb70 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/model/Distance.java
@@ -67,19 +67,10 @@ public final class Distance {
 
     double horzDist, vertDist, rupDist;
 
-    // flag to project to seisDepth if only one row and depth is below
-    // seisDepth
-    // boolean projectToDepth = false;
-    // if (surface.getNumRows() == 1 && surface.getLocation(0,0).depth() <
-    // SEIS_DEPTH)
-    // projectToDepth = true;
-
     // get locations to iterate over depending on dip
     Iterator<Location> it;
     if (surface.dip() > 89) {
       it = surface.getColumnIterator(0);
-      // if (surface.getLocation(0,0).depth() < SEIS_DEPTH)
-      // projectToDepth = true;
     } else {
       it = surface.iterator();
     }
diff --git a/src/main/resources/calc/calc-config-defaults.json b/src/main/resources/calc/calc-config-defaults.json
index 2de80737..d23efcf3 100644
--- a/src/main/resources/calc/calc-config-defaults.json
+++ b/src/main/resources/calc/calc-config-defaults.json
@@ -13,7 +13,7 @@
     "sourceTypes": [],
     "vs30s": [],
     "gmmDampingRatio": 0.05,
-    "gmmSigmaScaling": 1.0,
+    "gmmSigmaScale": 1.0,
     "valueFormat": "ANNUAL_RATE",
     "customImls": {}
   },
diff --git a/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java b/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java
index 91bafd90..eb47edc7 100644
--- a/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java
+++ b/src/test/java/gov/usgs/earthquake/nshmp/calc/CalcConfigTests.java
@@ -249,7 +249,7 @@ class CalcConfigTests {
     assertEquals(EnumSet.of(FAULT, ZONE, SLAB), def.sourceTypes);
     assertEquals(Set.of(260.0, 760.0), def.vs30s);
     assertEquals(0.03, def.gmmDampingRatio);
-    assertEquals(0.85, def.gmmSigmaScaling);
+    assertEquals(0.85, def.gmmSigmaScale);
     assertEquals(ValueFormat.POISSON_PROBABILITY, def.valueFormat);
 
     assertArrayEquals(
@@ -264,7 +264,7 @@ class CalcConfigTests {
     assertEquals(EnumSet.noneOf(SourceType.class), def.tectonicSettings);
     assertEquals(Set.of(), def.vs30s);
     assertEquals(0.05, def.gmmDampingRatio);
-    assertEquals(1.0, def.gmmSigmaScaling);
+    assertEquals(1.0, def.gmmSigmaScale);
     assertEquals(ValueFormat.ANNUAL_RATE, def.valueFormat);
   }
 
diff --git a/src/test/resources/calc/calc-config-extends.json b/src/test/resources/calc/calc-config-extends.json
index 63a1758e..0c6c9071 100644
--- a/src/test/resources/calc/calc-config-extends.json
+++ b/src/test/resources/calc/calc-config-extends.json
@@ -9,7 +9,7 @@
     "sourceTypes": [ "FAULT", "ZONE", "SLAB" ],
     "vs30s": [ 260, 760 ],
     "gmmDampingRatio": 0.03,
-    "gmmSigmaScaling": 0.85,
+    "gmmSigmaScale": 0.85,
     "valueFormat": "POISSON_PROBABILITY",
     "customImls": {
       "PGA": [0.0025, 0.0075, 0.0169, 0.0380, 0.0854, 0.192, 0.432, 0.973, 2.19, 4.92]
-- 
GitLab