From ae24414dfa1e89087493c7ff578779cd3f0f4cf8 Mon Sep 17 00:00:00 2001
From: Peter Powers <pmpowers@usgs.gov>
Date: Mon, 30 Sep 2024 14:44:03 -0600
Subject: [PATCH] added mag curve flags

---
 .../earthquake/nshmp/calc/HazardCurves.java   | 26 +++++----
 .../earthquake/nshmp/calc/Transforms.java     | 53 ++++++++++++-------
 2 files changed, 49 insertions(+), 30 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java b/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java
index b1f57bdf..2a7a090a 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/HazardCurves.java
@@ -50,13 +50,17 @@ final class HazardCurves {
    * Specialized constructor that creates a single HazardCurves from the results
    * of processing a partitioned InputList.
    */
-  static HazardCurves combine(InputList inputs, List<HazardCurves> curvesList) {
+  static HazardCurves combine(
+      InputList inputs,
+      List<HazardCurves> curvesList,
+      boolean magCurves) {
+
     List<GroundMotions> groundMotionsList = curvesList.stream()
         .map(curves -> curves.groundMotions)
         .collect(toList());
     GroundMotions groundMotions = GroundMotions.combine(inputs, groundMotionsList);
     return builder(groundMotions)
-        .addPartitioned(curvesList)
+        .addPartitioned(curvesList, magCurves)
         .build();
   }
 
@@ -112,7 +116,7 @@ final class HazardCurves {
      * the builder with a combined GroundMotions object previously created from
      * the supplied HazardCurves.
      */
-    private Builder addPartitioned(List<HazardCurves> curvesList) {
+    private Builder addPartitioned(List<HazardCurves> curvesList, boolean magCurves) {
 
       /* Add GMM curves. */
       Map<Imt, Map<Gmm, XySequence>> model = curvesList.get(0).curveMap;
@@ -128,13 +132,15 @@ final class HazardCurves {
         }
       }
 
-      /* Add magnitude curves. */
-      for (HazardCurves curves : curvesList) {
-        for (Imt imt : curves.magMap.keySet()) {
-          TreeMap<Double, MutableXySequence> dest = magCurveMap.get(imt);
-          curves.magMap.get(imt).entrySet().stream()
-              .filter(e -> e.getValue() != null)
-              .forEach(e -> dest.merge(e.getKey(), e.getValue(), MutableXySequence::add));
+      if (magCurves) {
+        /* Add magnitude curves. */
+        for (HazardCurves curves : curvesList) {
+          for (Imt imt : curves.magMap.keySet()) {
+            TreeMap<Double, MutableXySequence> dest = magCurveMap.get(imt);
+            curves.magMap.get(imt).entrySet().stream()
+                .filter(e -> e.getValue() != null)
+                .forEach(e -> dest.merge(e.getKey(), e.getValue(), MutableXySequence::add));
+          }
         }
       }
 
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 5bcebff9..b8c59a40 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/calc/Transforms.java
@@ -163,6 +163,7 @@ final class Transforms {
     private final double truncationLevel;
     private final double σScale;
     private final GmmTree gmms;
+    private final boolean magCurves;
 
     GroundMotionsToCurves(CalcConfig config, GmmTree gmms) {
       this.modelCurves = config.hazard.logModelCurves();
@@ -170,6 +171,7 @@ final class Transforms {
       this.truncationLevel = config.hazard.truncationLevel;
       this.σScale = config.gmm.sigmaScale;
       this.gmms = gmms;
+      this.magCurves = config.output.dataTypes.contains(DataType.MAGNITUDE);
     }
 
     @Override
@@ -209,12 +211,14 @@ final class Transforms {
             utilCurve.multiply(gms.inputs.get(i).rate);
             gmmCurve.add(utilCurve);
 
-            // utilCurve has been added to a receiver so we can modify it here
-            // to be added to the magnitude curve map
-            curveBuilder.addMagCurve(
-                imt,
-                gms.inputs.get(i).Mw,
-                utilCurve.multiply(gmms.gmmWeight(gmm)));
+            if (magCurves) {
+              // utilCurve has been added to a receiver so we can modify it here
+              // to be added to the magnitude curve map
+              curveBuilder.addMagCurve(
+                  imt,
+                  gms.inputs.get(i).Mw,
+                  utilCurve.multiply(gmms.gmmWeight(gmm)));
+            }
           }
           curveBuilder.addGmmCurve(imt, gmm, gmmCurve);
         }
@@ -405,7 +409,10 @@ final class Transforms {
       List<HazardCurves> curvesList = getUnchecked(allAsList(asyncCurvesList));
 
       // combine and consolidate
-      HazardCurves hazardCurves = HazardCurves.combine(master, curvesList);
+      HazardCurves hazardCurves = HazardCurves.combine(
+          master,
+          curvesList,
+          config.output.dataTypes.contains(DataType.MAGNITUDE));
       CurveConsolidator consolidator = new CurveConsolidator(
           ruptures, gmms, config);
 
@@ -511,6 +518,7 @@ final class Transforms {
     private final double truncationLevel;
     private final double σScale;
     private final GmmTree gmms;
+    private final boolean magCurves;
 
     ClusterGroundMotionsToCurves(CalcConfig config, GmmTree gmms) {
       this.logModelCurves = config.hazard.logModelCurves();
@@ -518,6 +526,7 @@ final class Transforms {
       this.truncationLevel = config.hazard.truncationLevel;
       this.σScale = config.gmm.sigmaScale;
       this.gmms = gmms;
+      this.magCurves = config.output.dataTypes.contains(DataType.MAGNITUDE);
     }
 
     @Override
@@ -594,18 +603,20 @@ final class Transforms {
             faultCurves.put(gmm, faultTreeCurves);
           }
 
-          /*
-           * The weighted average magnitudes of each rupture in the cluster for
-           * magnitude curve collection.
-           */
-          double wtMag = 0.0;
-          for (HazardInput in : groundMotions.inputs) {
-            wtMag += in.Mw * in.rate; // Mw weight is stored in rate
+          if (magCurves) {
+            /*
+             * The weighted average magnitudes of each rupture in the cluster
+             * for magnitude curve collection.
+             */
+            double wtMag = 0.0;
+            for (HazardInput in : groundMotions.inputs) {
+              wtMag += in.Mw * in.rate; // Mw weight is stored in rate
+            }
+            avgMag.add(wtMag);
           }
-          avgMag.add(wtMag);
         }
 
-        /* Average magnitude over a cluster. */
+        /* Average magnitude over a cluster. NaN if !magCurves */
         double clusterMag = DoubleData.sum(avgMag) / avgMag.size();
 
         /* Cluster exceedance */
@@ -630,10 +641,12 @@ final class Transforms {
           clusterCurve.multiply(rate);
           curveBuilder.addGmmCurve(imt, gmm, clusterCurve);
 
-          curveBuilder.addMagCurve(
-              imt,
-              clusterMag,
-              clusterCurve.multiply(gmms.gmmWeight(gmm)));
+          if (magCurves) {
+            curveBuilder.addMagCurve(
+                imt,
+                clusterMag,
+                clusterCurve.multiply(gmms.gmmWeight(gmm)));
+          }
         }
       }
       return curveBuilder.build();
-- 
GitLab