From 4ac0a6cb783316aedf626acdd445aae742057d1b Mon Sep 17 00:00:00 2001
From: Brandon Clayton <bclayton@usgs.gov>
Date: Wed, 26 Jan 2022 16:44:01 -0700
Subject: [PATCH] Update to new shape builder

---
 .../nshmp/netcdf/reader/BoundingReader.java   |  7 +-
 .../reader/BoundingReaderGroundMotions.java   | 56 +++++++++-------
 .../reader/BoundingReaderHazardCurves.java    | 66 ++++++++++++-------
 .../nshmp/netcdf/reader/Reader.java           |  4 ++
 4 files changed, 83 insertions(+), 50 deletions(-)

diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReader.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReader.java
index d750ea5..83f5c2e 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReader.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReader.java
@@ -101,9 +101,10 @@ public abstract class BoundingReader<T> {
         int longitudeIndex,
         int latitudeIndex) {
       this.location = location;
-      origin = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, latitudeIndex),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, longitudeIndex));
+      origin = netcdfShape.buildShape()
+          .add(IndexKey.LATITUDE, latitudeIndex)
+          .add(IndexKey.LONGITUDE, longitudeIndex)
+          .build();
     }
   }
 
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderGroundMotions.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderGroundMotions.java
index fc4b2f3..b509a99 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderGroundMotions.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderGroundMotions.java
@@ -9,7 +9,6 @@ import gov.usgs.earthquake.nshmp.gmm.Imt;
 import gov.usgs.earthquake.nshmp.netcdf.Netcdf;
 import gov.usgs.earthquake.nshmp.netcdf.NetcdfGroundMotions;
 import gov.usgs.earthquake.nshmp.netcdf.data.BoundingData;
-import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfShape;
 import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfShape.IndexKey;
 import gov.usgs.earthquake.nshmp.netcdf.data.StaticData;
 import gov.usgs.earthquake.nshmp.netcdf.reader.NetcdfUtils.Key;
@@ -65,29 +64,31 @@ public class BoundingReaderGroundMotions extends BoundingReader<XySequence> {
       var targetGroup = ncd.getRootGroup();
       var netcdfShape = netcdf.netcdfShape();
 
-      var targetOrigin = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, idxLatLL),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, idxLonLL));
-      var targetShape = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.SITE_CLASS, netcdfData.siteClasses().size()),
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, 2),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, 2),
-          new NetcdfShape.IndexMap(IndexKey.IMT, netcdfData.imts().size()));
-
-      /*
-       * Array aHazards now has shape [nVs,2,2,nImt] ...so origin will now be
-       * [0,0,0,0] for LL grid point ...and shape of requested array is
-       * [nVs,1,1,nImt]
-       */
+      // Build origin array, e.g. [lon, lat, 0, 0]
+      var targetOrigin = netcdfShape.buildShape()
+          .add(IndexKey.LATITUDE, idxLatLL)
+          .add(IndexKey.LONGITUDE, idxLonLL)
+          .build();
+
+      // Build target shape array, e.g. [2, 2, nImt, nSiteClass]
+      var targetShape = netcdfShape.buildShape()
+          .add(IndexKey.SITE_CLASS, netcdfData.siteClasses().size())
+          .add(IndexKey.LATITUDE, 2)
+          .add(IndexKey.LONGITUDE, 2)
+          .add(IndexKey.IMT, netcdfData.imts().size())
+          .build();
+
       var groundMotionArray = targetGroup
           .findVariableLocal(Key.GROUND_MOTION)
           .read(targetOrigin, targetShape);
 
-      var shape = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.SITE_CLASS, netcdfData.siteClasses().size()),
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, 1),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, 1),
-          new NetcdfShape.IndexMap(IndexKey.IMT, netcdfData.imts().size()));
+      // Main data shape, e.g. [1, 1, nImt, nSiteClass]
+      var shape = netcdfShape.buildShape()
+          .add(IndexKey.SITE_CLASS, netcdfData.siteClasses().size())
+          .add(IndexKey.LATITUDE, 1)
+          .add(IndexKey.LONGITUDE, 1)
+          .add(IndexKey.IMT, netcdfData.imts().size())
+          .build();
 
       for (var boundingLocation : boundingLocations) {
         boundingData.put(
@@ -134,8 +135,19 @@ public class BoundingReaderGroundMotions extends BoundingReader<XySequence> {
           })
           .toArray();
 
-      var origin = new int[] { iSiteClass, 0 };
-      var shape = new int[] { 1, imts.size() };
+      // Build origin array, e.g [0, siteClass]
+      var origin = netcdf.netcdfShape().buildShape()
+          .add(IndexKey.SITE_CLASS, iSiteClass)
+          .add(IndexKey.IML, 0)
+          .reduce()
+          .build();
+
+      // Build shape array, e.g. [nImts, 1]
+      var shape = netcdf.netcdfShape().buildShape()
+          .add(IndexKey.SITE_CLASS, 1)
+          .add(IndexKey.IMT, imts.size())
+          .reduce()
+          .build();
 
       try {
         var xySequence = XySequence.create(
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderHazardCurves.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderHazardCurves.java
index f48287c..488375c 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderHazardCurves.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingReaderHazardCurves.java
@@ -2,13 +2,13 @@ package gov.usgs.earthquake.nshmp.netcdf.reader;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.logging.Logger;
 
 import gov.usgs.earthquake.nshmp.data.XySequence;
 import gov.usgs.earthquake.nshmp.geo.Location;
 import gov.usgs.earthquake.nshmp.netcdf.Netcdf;
 import gov.usgs.earthquake.nshmp.netcdf.NetcdfHazardCurves;
 import gov.usgs.earthquake.nshmp.netcdf.data.BoundingData;
-import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfShape;
 import gov.usgs.earthquake.nshmp.netcdf.data.NetcdfShape.IndexKey;
 import gov.usgs.earthquake.nshmp.netcdf.data.StaticData;
 import gov.usgs.earthquake.nshmp.netcdf.data.StaticDataHazardCurves;
@@ -62,29 +62,30 @@ public class BoundingReaderHazardCurves extends BoundingReader<StaticDataHazardC
       var targetGroup = ncd.getRootGroup();
       var netcdfShape = netcdf.netcdfShape();
 
-      var targetOrigin = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, idxLatLL),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, idxLonLL));
-      var targetShape = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.SITE_CLASS, netcdfData.siteClasses().size()),
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, 2),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, 2),
-          new NetcdfShape.IndexMap(IndexKey.IMT, netcdfData.imts().size()),
-          new NetcdfShape.IndexMap(IndexKey.IML, netcdfData.nIml()));
-
-      /*
-       * Array aHazards now has shape [nVs,nImt,2,2,nIml] ...so origin will now
-       * be [0,0,0,0,0] for LL grid point ...and shape of requested array is
-       * [nVs,nImt,1,1,nIml]
-       */
+      // Build origin array, e.g. [lon, lat, 0, 0, 0]
+      var targetOrigin = netcdfShape.buildShape()
+          .add(IndexKey.LATITUDE, idxLatLL)
+          .add(IndexKey.LONGITUDE, idxLonLL)
+          .build();
+
+      // Build target shape array, e.g. [2, 2, nIML, nIMT, nSiteClass]
+      var targetShape = netcdfShape.buildShape()
+          .add(IndexKey.SITE_CLASS, netcdfData.siteClasses().size())
+          .add(IndexKey.LATITUDE, 2)
+          .add(IndexKey.LONGITUDE, 2)
+          .add(IndexKey.IMT, netcdfData.imts().size())
+          .add(IndexKey.IML, netcdfData.nIml())
+          .build();
+
       var aHazards = targetGroup.findVariableLocal(Key.HAZARD).read(targetOrigin, targetShape);
 
-      var shape = netcdfShape.buildShape(
-          new NetcdfShape.IndexMap(IndexKey.SITE_CLASS, netcdfData.siteClasses().size()),
-          new NetcdfShape.IndexMap(IndexKey.LATITUDE, 1),
-          new NetcdfShape.IndexMap(IndexKey.LONGITUDE, 1),
-          new NetcdfShape.IndexMap(IndexKey.IMT, netcdfData.imts().size()),
-          new NetcdfShape.IndexMap(IndexKey.IML, netcdfData.nIml()));
+      var shape = netcdfShape.buildShape()
+          .add(IndexKey.SITE_CLASS, netcdfData.siteClasses().size())
+          .add(IndexKey.LATITUDE, 1)
+          .add(IndexKey.LONGITUDE, 1)
+          .add(IndexKey.IMT, netcdfData.imts().size())
+          .add(IndexKey.IML, netcdfData.nIml())
+          .build();
 
       for (var boundingLocation : boundingLocations) {
         boundingData.put(
@@ -114,15 +115,30 @@ public class BoundingReaderHazardCurves extends BoundingReader<StaticDataHazardC
       Array hazards) {
     var netcdfData = ((NetcdfHazardCurves) netcdf).netcdfData();
     var vsImtHazardMap = StaticData.<StaticDataHazardCurves> builder();
+    var logger = Logger.getAnonymousLogger();
 
     for (int iSiteClass = 0; iSiteClass < netcdfData.siteClasses().size(); iSiteClass++) {
       var siteClass = netcdfData.siteClasses().get(iSiteClass);
-
       var imtHazardMap = StaticDataHazardCurves.builder();
+
       for (int iImt = 0; iImt < netcdfData.imts().size(); iImt++) {
         var imt = netcdfData.imts().get(iImt);
-        var origin = new int[] { iSiteClass, iImt, 0 };
-        var shape = new int[] { 1, 1, netcdfData.nIml() };
+
+        // Build origin array, e.g [0, imt, siteClass]
+        var origin = netcdf.netcdfShape().buildShape()
+            .add(IndexKey.SITE_CLASS, iSiteClass)
+            .add(IndexKey.IMT, iImt)
+            .add(IndexKey.IML, 0)
+            .reduce()
+            .build();
+
+        // Build shape array, e.g. [nIML, 1, 1]
+        var shape = netcdf.netcdfShape().buildShape()
+            .add(IndexKey.SITE_CLASS, 1)
+            .add(IndexKey.IMT, 1)
+            .add(IndexKey.IML, netcdfData.nIml())
+            .reduce()
+            .build();
 
         try {
           var xySequence = XySequence.create(
diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/Reader.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/Reader.java
index d2ec1f1..6b1fb49 100644
--- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/Reader.java
+++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/Reader.java
@@ -6,6 +6,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.logging.Logger;
 
 import com.google.common.reflect.TypeToken;
 import com.google.gson.Gson;
@@ -38,6 +39,9 @@ public abstract class Reader {
     this.targetGroup = targetGroup;
     netcdfData = readData(targetGroup);
     netcdfShape = buildNetcdfShape(targetGroup);
+
+    var logger = Logger.getAnonymousLogger();
+    logger.info("" + GSON.toJson(netcdfShape));
   }
 
   public NetcdfShape netcdfShape() {
-- 
GitLab