From e8188ab9ae773c1741e631fba2fa5921adb3d8a2 Mon Sep 17 00:00:00 2001
From: Kevin Milner <kmilner@usgs.gov>
Date: Wed, 11 Dec 2024 21:09:08 -0800
Subject: [PATCH] centralized paths for finding PRVI solutions and directories

---
 .../prvi25/figures/CombinedMFDsPlot.java      | 20 ++++----
 .../figures/ConnectivityClusterPlot.java      | 11 ++--
 .../CrustalCarveoutSmallerRegionMFDPlot.java  |  5 +-
 .../figures/CrustalFaultNamesFigure.java      |  9 +++-
 .../DefModelSampleLineIntegralsPlot.java      |  8 +--
 .../figures/FaultParticipationPlots.java      | 11 ++--
 .../prvi25/figures/GridCubeRatePlot.java      |  4 +-
 .../prvi25/figures/IndividualMFDPlots.java    | 19 +++----
 .../prvi25/figures/LogicTreeFigureWriter.java |  5 +-
 .../prvi25/figures/MapSourceTypeDisagg.java   | 18 +++----
 .../MultiTectonicParticipationMap.java        | 23 +++------
 .../figures/ObsUncertaintyBoundsFigure.java   |  4 +-
 .../kevin/prvi25/figures/PRVI_Paths.java      | 23 +++++++++
 .../figures/PRVI_SubductionSubSectPlots.java  |  4 +-
 .../ProxyFaultRepresentationFigures.java      |  5 +-
 .../prvi25/figures/RupSetStatsTexWriter.java  |  5 +-
 .../kevin/prvi25/figures/SegResultPlots.java  |  8 +--
 .../prvi25/figures/SeismicityPDFFigures.java  | 50 +++++++++++++++++--
 .../kevin/prvi25/figures/SlipRateFigures.java | 14 +++---
 .../prvi25/figures/TectonicSettingPlot.java   |  4 +-
 20 files changed, 157 insertions(+), 93 deletions(-)
 create mode 100644 src/main/java/scratch/kevin/prvi25/figures/PRVI_Paths.java

diff --git a/src/main/java/scratch/kevin/prvi25/figures/CombinedMFDsPlot.java b/src/main/java/scratch/kevin/prvi25/figures/CombinedMFDsPlot.java
index 3bec2f98..5c66b447 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/CombinedMFDsPlot.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/CombinedMFDsPlot.java
@@ -23,23 +23,22 @@
 import org.opensha.sha.magdist.SummedMagFreqDist;
 import org.opensha.sha.util.TectonicRegionType;
 
+import com.google.common.base.Preconditions;
+
 import net.mahdilamb.colormap.Colors;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class CombinedMFDsPlot {
 
 	public static void main(String[] args) throws IOException {
-		File crustalDir = new File("/home/kevin/OpenSHA/nshm23/batch_inversions/"
-				+ "2024_11_19-prvi25_crustal_branches-dmSample5x");
-		FaultSystemSolution crustalSol = FaultSystemSolution.load(new File(crustalDir,
-				"results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip"));
+		FaultSystemSolution crustalSol = FaultSystemSolution.load(CRUSTAL_SOL_GRIDDED);
 		
-		File subductionDir = new File("/home/kevin/OpenSHA/nshm23/batch_inversions/"
-				+ "2024_11_19-prvi25_subduction_branches");
-		FaultSystemSolution subductionSol1 = FaultSystemSolution.load(new File(subductionDir,
-				"results_PRVI_SUB_FM_LARGE_branch_averaged_gridded.zip"));
-		FaultSystemSolution subductionSol2 = FaultSystemSolution.load(new File(subductionDir,
-				"results_PRVI_SUB_FM_SMALL_branch_averaged_gridded.zip"));
+		FaultSystemSolution subductionSol1 = FaultSystemSolution.load(SUBDUCTION_SOL_LARGE);
+		FaultSystemSolution subductionSol2 = FaultSystemSolution.load(SUBDUCTION_SOL_SMALL);
 		
+		File outputDir = new File(FIGURES_DIR, "combined_mfds");
+		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		EvenlyDiscretizedFunc refMFD = FaultSysTools.initEmptyMFD(9.45);
 		
@@ -122,7 +121,6 @@ public static void main(String[] args) throws IOException {
 		
 		HeadlessGraphPanel gp = PlotUtils.initHeadless();
 
-		File outputDir = new File("/tmp");
 		Range yRange = new Range(1e-6, 1e1);
 		Range xRange = new Range(5d, 9.5d);
 
diff --git a/src/main/java/scratch/kevin/prvi25/figures/ConnectivityClusterPlot.java b/src/main/java/scratch/kevin/prvi25/figures/ConnectivityClusterPlot.java
index 374d1f94..bca3dc12 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/ConnectivityClusterPlot.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/ConnectivityClusterPlot.java
@@ -7,8 +7,6 @@
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
-import org.opensha.commons.geo.Location;
-import org.opensha.commons.geo.Region;
 import org.opensha.commons.gui.plot.GeographicMapMaker;
 import org.opensha.sha.earthquake.faultSysSolution.FaultSystemRupSet;
 import org.opensha.sha.earthquake.faultSysSolution.FaultSystemSolution;
@@ -17,15 +15,18 @@
 import org.opensha.sha.earthquake.faultSysSolution.ruptures.util.ConnectivityCluster;
 import org.opensha.sha.faultSurface.FaultSection;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Stopwatch;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 class ConnectivityClusterPlot {
 	
 	public static void main(String[] args) throws IOException {
-		FaultSystemSolution sol = FaultSystemSolution.load(new File("/data/kevin/nshm23/batch_inversions/"
-				+ "2024_11_19-prvi25_crustal_branches-dmSample5x/results_PRVI_CRUSTAL_FM_V1p1_branch_averaged.zip"));
+		FaultSystemSolution sol = FaultSystemSolution.load(CRUSTAL_SOL_SUPRA_ONLY);
 		
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/crustal_fm");
+		File outputDir = new File(FIGURES_DIR, "crustal_fm");
+		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		FaultSystemRupSet rupSet = sol.getRupSet();
 		if (!rupSet.hasModule(ConnectivityClusters.class)) {
diff --git a/src/main/java/scratch/kevin/prvi25/figures/CrustalCarveoutSmallerRegionMFDPlot.java b/src/main/java/scratch/kevin/prvi25/figures/CrustalCarveoutSmallerRegionMFDPlot.java
index 2ab740cd..b3dc18d7 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/CrustalCarveoutSmallerRegionMFDPlot.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/CrustalCarveoutSmallerRegionMFDPlot.java
@@ -32,6 +32,8 @@
 
 import net.mahdilamb.colormap.Colors;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class CrustalCarveoutSmallerRegionMFDPlot {
 
 	public static void main(String[] args) throws IOException {
@@ -47,8 +49,7 @@ public static void main(String[] args) throws IOException {
 		names.add("Smaller Map Region");
 		prefixes.add("smaller_map_region");
 		
-		FaultSystemSolution sol = FaultSystemSolution.load(new File("/home/kevin/OpenSHA/nshm23/batch_inversions/"
-				+ "2024_10_24-prvi25_crustal_branches-dmSample5x/results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip"));
+		FaultSystemSolution sol = FaultSystemSolution.load(CRUSTAL_SOL_SUPRA_ONLY);
 		
 		EvenlyDiscretizedFunc refMFD = FaultSysTools.initEmptyMFD(2.55, sol.getRupSet().getMaxMag());
 		
diff --git a/src/main/java/scratch/kevin/prvi25/figures/CrustalFaultNamesFigure.java b/src/main/java/scratch/kevin/prvi25/figures/CrustalFaultNamesFigure.java
index b53da4af..ee2bb633 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/CrustalFaultNamesFigure.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/CrustalFaultNamesFigure.java
@@ -23,12 +23,17 @@
 import org.opensha.sha.faultSurface.FaultSection;
 import org.opensha.sha.faultSurface.FaultTrace;
 
+import com.google.common.base.Preconditions;
+
 import net.mahdilamb.colormap.Colors;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 class CrustalFaultNamesFigure {
 
 	public static void main(String[] args) throws IOException {
-		File ouutputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/crustal_fm");
+		File outputDir = new File(FIGURES_DIR, "crustal_fm");
+		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		PRVI25_CrustalFaultModels fm = PRVI25_CrustalFaultModels.PRVI_CRUSTAL_FM_V1p1;
 		
@@ -42,7 +47,7 @@ public static void main(String[] args) throws IOException {
 		
 		mapMaker.setSectTraceChar(new PlotCurveCharacterstics(PlotLineType.SOLID, 3f, Colors.tab_blue));
 		
-		mapMaker.plot(ouutputDir, "crustal_sect_names", " ");
+		mapMaker.plot(outputDir, "crustal_sect_names", " ");
 	}
 	
 	static void addStandardFaultLabels(GeographicMapMaker mapMaker, List<? extends FaultSection> sects) {
diff --git a/src/main/java/scratch/kevin/prvi25/figures/DefModelSampleLineIntegralsPlot.java b/src/main/java/scratch/kevin/prvi25/figures/DefModelSampleLineIntegralsPlot.java
index ff3e77dc..61eecdd6 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/DefModelSampleLineIntegralsPlot.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/DefModelSampleLineIntegralsPlot.java
@@ -40,15 +40,17 @@
 import scratch.kevin.prvi25.FaultSystemLineIntegralCalculator.LineIntegralResult;
 import scratch.kevin.prvi25.FaultSystemLineIntegralCalculator.VectorComponent;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class DefModelSampleLineIntegralsPlot {
 
 	public static void main(String[] args) throws IOException {
 //		File outputDir = new File("/tmp");
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/crustal_dm");
+		File outputDir = new File(FIGURES_DIR, "crustal_dm");
+		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		String prefix = "prvi_dm_sample_line_integrals";
 		
-		LogicTree<?> randTree = LogicTree.read(new File(
-				"/home/kevin/OpenSHA/nshm23/batch_inversions/2024_10_24-prvi25_crustal_branches-dmSample5x/logic_tree.json"));
+		LogicTree<?> randTree = LogicTree.read(new File(CRUSTAL_DIR, "logic_tree.json"));
 		
 		PRVI25_CrustalFaultModels fm = PRVI25_CrustalFaultModels.PRVI_CRUSTAL_FM_V1p1;
 //		VectorComponent[] components = VectorComponent.values();
diff --git a/src/main/java/scratch/kevin/prvi25/figures/FaultParticipationPlots.java b/src/main/java/scratch/kevin/prvi25/figures/FaultParticipationPlots.java
index d57bef80..9e29d48d 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/FaultParticipationPlots.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/FaultParticipationPlots.java
@@ -14,13 +14,12 @@
 
 import com.google.common.base.Preconditions;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class FaultParticipationPlots {
 	
 	public static void main(String[] args) throws IOException {
-		File solFile = new File("/data/kevin/nshm23/batch_inversions/"
-				+ "2024_11_19-prvi25_crustal_branches-dmSample5x/results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip");
-		
-		FaultSystemSolution sol = FaultSystemSolution.load(solFile);
+		FaultSystemSolution sol = FaultSystemSolution.load(CRUSTAL_SOL_SUPRA_ONLY);
 		
 		CPT cpt = GMT_CPT_Files.RAINBOW_UNIFORM.instance().rescale(-5, -1);
 		cpt.setBelowMinColor(cpt.getMinColor());
@@ -28,8 +27,8 @@ public static void main(String[] args) throws IOException {
 		
 		double[] minMags = { 0, 6, 6.7, 7, 7.5, 7.8 };
 		
-//		File outputDir = new File("/home/kevin/Documents/papers/2023_NSHM23_Inversion/figures/partic_plot");
-		File outputDir = new File("/tmp");
+		File outputDir = new File(FIGURES_DIR, "partic_plot");
+//		File outputDir = new File("/tmp");
 		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		GeographicMapMaker mapMaker = new RupSetMapMaker(sol.getRupSet(), PRVI25_RegionLoader.loadPRVI_ModelBroad());
diff --git a/src/main/java/scratch/kevin/prvi25/figures/GridCubeRatePlot.java b/src/main/java/scratch/kevin/prvi25/figures/GridCubeRatePlot.java
index 503fda3d..d0f26b40 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/GridCubeRatePlot.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/GridCubeRatePlot.java
@@ -52,6 +52,8 @@
 
 import scratch.UCERF3.erf.ETAS.SeisDepthDistribution;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class GridCubeRatePlot {
 
 	public static void main(String[] args) throws IOException {
@@ -92,7 +94,7 @@ public static void main(String[] args) throws IOException {
 			rake = 0d;
 		}
 		
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/crustal_grid");
+		File outputDir = new File(FIGURES_DIR, "crustal_grid");
 		
 		Region sectReg = new Region(new Location(traceStart.lat, traceStart.lon-1d), new Location(traceEnd.lat, traceEnd.lon+1d));
 		GriddedRegion gridReg = new GriddedRegion(sectReg, gridSpacing, GriddedRegion.ANCHOR_0_0);
diff --git a/src/main/java/scratch/kevin/prvi25/figures/IndividualMFDPlots.java b/src/main/java/scratch/kevin/prvi25/figures/IndividualMFDPlots.java
index 61a0220c..3caa0eed 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/IndividualMFDPlots.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/IndividualMFDPlots.java
@@ -43,29 +43,24 @@
 import scratch.kevin.latex.LaTeXUtils;
 import scratch.kevin.prvi25.SubductionCombinedModelCreator;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class IndividualMFDPlots {
 
 	public static void main(String[] args) throws IOException {
-		File crustalDir = new File("/home/kevin/OpenSHA/nshm23/batch_inversions/"
-				+ "2024_12_05-prvi25_crustal_branches-dmSample5x");
-		FaultSystemSolution crustalSol = FaultSystemSolution.load(new File(crustalDir,
-				"results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip"));
+		FaultSystemSolution crustalSol = FaultSystemSolution.load(CRUSTAL_SOL_GRIDDED);
 		
 		EvenlyDiscretizedFunc refMFD = FaultSysTools.initEmptyMFD(4.05, 9.55);
 		
-		File subductionDir = new File("/home/kevin/OpenSHA/nshm23/batch_inversions/"
-				+ "2024_11_19-prvi25_subduction_branches");
-		FaultSystemSolution subductionLargeSol = FaultSystemSolution.load(new File(subductionDir,
-				"results_PRVI_SUB_FM_LARGE_branch_averaged_gridded.zip"));
-		FaultSystemSolution subductionSmallSol = FaultSystemSolution.load(new File(subductionDir,
-				"results_PRVI_SUB_FM_SMALL_branch_averaged_gridded.zip"));
+		FaultSystemSolution subductionLargeSol = FaultSystemSolution.load(SUBDUCTION_SOL_LARGE);
+		FaultSystemSolution subductionSmallSol = FaultSystemSolution.load(SUBDUCTION_SOL_SMALL);
 		FaultSystemSolution subductionCombined = SubductionCombinedModelCreator.combine(
 				Map.of(PRVI25_SubductionFaultModels.PRVI_SUB_FM_LARGE, subductionLargeSol,
 						PRVI25_SubductionFaultModels.PRVI_SUB_FM_SMALL, subductionSmallSol));
 		
-		File crustalOutputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/crustal_sol");
+		File crustalOutputDir = new File(FIGURES_DIR, "crustal_sol");
 		Preconditions.checkState(crustalOutputDir.exists() || crustalOutputDir.mkdir());
-		File subductionOutputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/sub_sol");
+		File subductionOutputDir = new File(FIGURES_DIR, "sub_sol");
 		Preconditions.checkState(subductionOutputDir.exists() || subductionOutputDir.mkdir());
 		
 		FileWriter crustalTexFW = new FileWriter(new File(crustalOutputDir, "crustal_mfds.tex"));
diff --git a/src/main/java/scratch/kevin/prvi25/figures/LogicTreeFigureWriter.java b/src/main/java/scratch/kevin/prvi25/figures/LogicTreeFigureWriter.java
index 7d767059..1b1d1cf5 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/LogicTreeFigureWriter.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/LogicTreeFigureWriter.java
@@ -44,6 +44,8 @@
 import com.itextpdf.text.pdf.PdfTemplate;
 import com.itextpdf.text.pdf.PdfWriter;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class LogicTreeFigureWriter extends JPanel {
 
 	public static void main(String[] args) throws IOException {
@@ -53,7 +55,8 @@ public static void main(String[] args) throws IOException {
 		nameRemappings.put(NSHM23_ScalingRelationships.LOGA_C4p2_SQRT_LEN.getShortName(), "Sqrt-Len");
 		nameRemappings.put(PRVI25_CrustalRandomlySampledDeformationModelLevel.NAME, "Geologic Deformation Model Sample");
 		
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/logic_trees");
+		File outputDir = new File(FIGURES_DIR, "logic_trees");
+		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		List<LogicTree<?>> trees = new ArrayList<>();
 		List<String> prefixes = new ArrayList<>();
diff --git a/src/main/java/scratch/kevin/prvi25/figures/MapSourceTypeDisagg.java b/src/main/java/scratch/kevin/prvi25/figures/MapSourceTypeDisagg.java
index 42b40ffc..114b0c0a 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/MapSourceTypeDisagg.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/MapSourceTypeDisagg.java
@@ -46,6 +46,8 @@
 
 import net.mahdilamb.colormap.Colors;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class MapSourceTypeDisagg {
 	
 	enum MapType {
@@ -71,22 +73,16 @@ private MapType(String name, Color color, IncludeBackgroundOption... bgOps) {
 	}
 
 	public static void main(String[] args) throws IOException {
-		File baseDir = new File("/home/kevin/OpenSHA/nshm23/batch_inversions/");
-		
 		EnumMap<MapType, File> dirs = new EnumMap<>(MapType.class);
 		
 		double[] periods = {0d, 1d, 5d};
 		ReturnPeriods[] rps = SolHazardMapCalc.MAP_RPS;
 		
-		String crustalDate = "2024_11_19";
-		String subductionDate = crustalDate;
-		String combinedDate = crustalDate;
-		
-		dirs.put(MapType.COMBINED, new File(baseDir, combinedDate+"-prvi25_crustal_subduction_combined_branches-ba_only"));
-		dirs.put(MapType.CRUSTAL, new File(baseDir, crustalDate+"-prvi25_crustal_branches-dmSample5x-ba_only"));
-		dirs.put(MapType.SUBDUCTION, new File(baseDir, subductionDate+"-prvi25_subduction_branches-ba_only-both_fms"));
-		dirs.put(MapType.SUBDUCTION_INTERFACE, new File(baseDir, subductionDate+"-prvi25_subduction_branches-ba_only-INTERFACE_only"));
-		dirs.put(MapType.SUBDUCTION_SLAB, new File(baseDir, subductionDate+"-prvi25_subduction_branches-ba_only-SLAB_only"));
+		dirs.put(MapType.COMBINED, new File(INV_DIR, COMBINED_DIR.getName()+"-ba_only"));
+		dirs.put(MapType.CRUSTAL, new File(INV_DIR, CRUSTAL_DIR.getName()+"-ba_only"));
+		dirs.put(MapType.SUBDUCTION, new File(INV_DIR, SUBDUCTION_DIR.getName()+"-ba_only-both_fms"));
+		dirs.put(MapType.SUBDUCTION_INTERFACE, new File(INV_DIR, SUBDUCTION_DIR.getName()+"-ba_only-INTERFACE_only"));
+		dirs.put(MapType.SUBDUCTION_SLAB, new File(INV_DIR, SUBDUCTION_DIR.getName()+"-ba_only-SLAB_only"));
 		
 		double debugPeriod = 5d;
 		ReturnPeriods debugRP = ReturnPeriods.TWO_IN_50;
diff --git a/src/main/java/scratch/kevin/prvi25/figures/MultiTectonicParticipationMap.java b/src/main/java/scratch/kevin/prvi25/figures/MultiTectonicParticipationMap.java
index 5ac5391f..3f06e883 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/MultiTectonicParticipationMap.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/MultiTectonicParticipationMap.java
@@ -48,27 +48,18 @@
 import com.google.common.collect.Table.Cell;
 import com.google.common.primitives.Doubles;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class MultiTectonicParticipationMap {
 
 	public static void main(String[] args) throws IOException {
-		File invsDir = new File("/home/kevin/OpenSHA/nshm23/batch_inversions");
-		
-		File crustalDir = new File(invsDir, "2024_11_19-prvi25_crustal_branches-dmSample5x");
-		File subductionDir = new File(invsDir, "2024_11_19-prvi25_subduction_branches");
-		File combDir = new File(invsDir, "2024_11_19-prvi25_crustal_subduction_combined_branches");
-		
-//		File outputDir = new File(combDir, "misc_plots/combined_participation");
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/combined_partic_rate_maps");
+		File outputDir = new File(FIGURES_DIR, "combined_partic_rate_maps");
 		Preconditions.checkState(outputDir.exists() || outputDir.mkdirs());
 		
-		FaultSystemSolution crustalSol = FaultSystemSolution.load(new File(crustalDir,
-				"results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip"));
-		FaultSystemSolution subSmallSol = FaultSystemSolution.load(new File(subductionDir,
-				"results_PRVI_SUB_FM_SMALL_branch_averaged_gridded.zip"));
-		FaultSystemSolution subLargeSol = FaultSystemSolution.load(new File(subductionDir,
-				"results_PRVI_SUB_FM_LARGE_branch_averaged_gridded.zip"));
-		FaultSystemSolution combSol = FaultSystemSolution.load(new File(combDir,
-				"combined_branch_averaged_solution.zip"));
+		FaultSystemSolution crustalSol = FaultSystemSolution.load(CRUSTAL_SOL_GRIDDED);
+		FaultSystemSolution subSmallSol = FaultSystemSolution.load(SUBDUCTION_SOL_SMALL);
+		FaultSystemSolution subLargeSol = FaultSystemSolution.load(SUBDUCTION_SOL_LARGE);
+		FaultSystemSolution combSol = FaultSystemSolution.load(COMBINED_SOL);
 		
 		boolean includeInterfaceGridded = false;
 		
diff --git a/src/main/java/scratch/kevin/prvi25/figures/ObsUncertaintyBoundsFigure.java b/src/main/java/scratch/kevin/prvi25/figures/ObsUncertaintyBoundsFigure.java
index f2c3080e..fb65ebaf 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/ObsUncertaintyBoundsFigure.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/ObsUncertaintyBoundsFigure.java
@@ -32,10 +32,12 @@
 
 import net.mahdilamb.colormap.Colors;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class ObsUncertaintyBoundsFigure {
 
 	public static void main(String[] args) throws IOException {
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures");
+		File outputDir = FIGURES_DIR;
 		String prefix = "obs_mfd_bounds";
 		
 		boolean incremental = false;
diff --git a/src/main/java/scratch/kevin/prvi25/figures/PRVI_Paths.java b/src/main/java/scratch/kevin/prvi25/figures/PRVI_Paths.java
new file mode 100644
index 00000000..570c0caf
--- /dev/null
+++ b/src/main/java/scratch/kevin/prvi25/figures/PRVI_Paths.java
@@ -0,0 +1,23 @@
+package scratch.kevin.prvi25.figures;
+
+import java.io.File;
+
+public class PRVI_Paths {
+	
+	public static final File PAPER_DIR =new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper");
+	public static final File FIGURES_DIR =new File(PAPER_DIR, "Figures");
+	
+	public static final File INV_DIR = new File("/data/kevin/nshm23/batch_inversions/");
+	
+	public static final File CRUSTAL_DIR = new File(INV_DIR, "2024_11_19-prvi25_crustal_branches-dmSample5x");
+	public static final File CRUSTAL_SOL_GRIDDED = new File(CRUSTAL_DIR, "results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip");
+	public static final File CRUSTAL_SOL_SUPRA_ONLY = new File(CRUSTAL_DIR, "results_PRVI_CRUSTAL_FM_V1p1_branch_averaged.zip");
+	
+	public static final File SUBDUCTION_DIR = new File(INV_DIR, "2024_11_19-prvi25_subduction_branches");
+	public static final File SUBDUCTION_SOL_LARGE = new File(SUBDUCTION_DIR, "results_PRVI_SUB_FM_LARGE_branch_averaged_gridded.zip");
+	public static final File SUBDUCTION_SOL_SMALL = new File(SUBDUCTION_DIR, "results_PRVI_SUB_FM_SMALL_branch_averaged_gridded.zip");
+	
+	public static final File COMBINED_DIR = new File(INV_DIR, "2024_11_19-prvi25_crustal_subduction_combined_branches");
+	public static final File COMBINED_SOL = new File(COMBINED_DIR, "combined_branch_averaged_solution.zip");
+
+}
diff --git a/src/main/java/scratch/kevin/prvi25/figures/PRVI_SubductionSubSectPlots.java b/src/main/java/scratch/kevin/prvi25/figures/PRVI_SubductionSubSectPlots.java
index 988a7b76..223d1303 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/PRVI_SubductionSubSectPlots.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/PRVI_SubductionSubSectPlots.java
@@ -36,6 +36,8 @@
 
 import scratch.kevin.prvi25.FaultSystemLineIntegralCalculator;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class PRVI_SubductionSubSectPlots {
 	
 	public static Region plotReg = new Region(new Location(16.5, -71.5), new Location(21, -60));
@@ -50,7 +52,7 @@ public static void main(String[] args) throws IOException {
 		PRVI25_InvConfigFactory factory = new PRVI25_InvConfigFactory();
 		
 //		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_Subduction/figures/fault_model");
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/sub_fm");
+		File outputDir = new File(FIGURES_DIR, "sub_fm");
 		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		Font font = new Font(Font.SANS_SERIF, Font.BOLD, 24);
diff --git a/src/main/java/scratch/kevin/prvi25/figures/ProxyFaultRepresentationFigures.java b/src/main/java/scratch/kevin/prvi25/figures/ProxyFaultRepresentationFigures.java
index 7939e7b8..24c0538a 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/ProxyFaultRepresentationFigures.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/ProxyFaultRepresentationFigures.java
@@ -39,6 +39,8 @@
 
 import com.google.common.base.Preconditions;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class ProxyFaultRepresentationFigures {
 	
 	private enum RupType {
@@ -60,7 +62,8 @@ public static void main(String[] args) throws IOException {
 		ProxyFaultSectionInstances proxyModule = ProxyFaultSectionInstances.build(rupSet, 5, 5d);
 		rupSet.addModule(proxyModule);
 		
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/proxy_faults");
+		File outputDir = new File(FIGURES_DIR, "proxy_faults");
+		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
 		boolean titles = false;
 		
diff --git a/src/main/java/scratch/kevin/prvi25/figures/RupSetStatsTexWriter.java b/src/main/java/scratch/kevin/prvi25/figures/RupSetStatsTexWriter.java
index f085124f..3bd5a9b7 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/RupSetStatsTexWriter.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/RupSetStatsTexWriter.java
@@ -28,14 +28,15 @@
 
 import scratch.kevin.latex.LaTeXUtils;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class RupSetStatsTexWriter {
 
 	public static void main(String[] args) throws IOException {
-		// TODO Auto-generated method stub
 		PRVI25_InvConfigFactory factory = new PRVI25_InvConfigFactory();
 		factory.setCacheDir(new File("/home/kevin/OpenSHA/nshm23/rup_sets/cache"));
 		
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures");
+		File outputDir = FIGURES_DIR;
 		
 		FileWriter fw = new FileWriter(new File(outputDir, "rup_set_stats.tex"));
 		
diff --git a/src/main/java/scratch/kevin/prvi25/figures/SegResultPlots.java b/src/main/java/scratch/kevin/prvi25/figures/SegResultPlots.java
index 26637429..83fb2df7 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/SegResultPlots.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/SegResultPlots.java
@@ -21,15 +21,15 @@
 
 import com.google.common.base.Preconditions;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 class SegResultPlots {
 	
 	public static void main(String[] args) throws IOException {
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/crustal_sol");
+		File outputDir = new File(FIGURES_DIR, "crustal_sol");
 		Preconditions.checkState(outputDir.exists() || outputDir.mkdir());
 		
-		FaultSystemSolution sol = FaultSystemSolution.load(
-				new File("/data/kevin/nshm23/batch_inversions/2024_12_05-prvi25_crustal_branches-dmSample5x/"
-						+ "results_PRVI_CRUSTAL_FM_V1p1_branch_averaged.zip"));
+		FaultSystemSolution sol = FaultSystemSolution.load(CRUSTAL_SOL_SUPRA_ONLY);
 		
 		ClusterRuptures cRups = sol.getRupSet().requireModule(ClusterRuptures.class);
 		PlausibilityConfiguration config = sol.getRupSet().requireModule(PlausibilityConfiguration.class);
diff --git a/src/main/java/scratch/kevin/prvi25/figures/SeismicityPDFFigures.java b/src/main/java/scratch/kevin/prvi25/figures/SeismicityPDFFigures.java
index 25586fa2..89a88ba1 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/SeismicityPDFFigures.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/SeismicityPDFFigures.java
@@ -18,6 +18,8 @@
 import org.opensha.commons.gui.plot.PlotLineType;
 import org.opensha.commons.mapping.gmt.elements.GMT_CPT_Files;
 import org.opensha.commons.util.cpt.CPT;
+import org.opensha.sha.earthquake.faultSysSolution.FaultSystemSolution;
+import org.opensha.sha.earthquake.faultSysSolution.modules.GridSourceList;
 import org.opensha.sha.earthquake.faultSysSolution.util.FaultSysTools;
 import org.opensha.sha.earthquake.rupForecastImpl.prvi25.gridded.PRVI25_GridSourceBuilder;
 import org.opensha.sha.earthquake.rupForecastImpl.prvi25.logicTree.PRVI25_DeclusteringAlgorithms;
@@ -25,26 +27,32 @@
 import org.opensha.sha.earthquake.rupForecastImpl.prvi25.logicTree.PRVI25_SeisSmoothingAlgorithms;
 import org.opensha.sha.earthquake.rupForecastImpl.prvi25.util.PRVI25_RegionLoader;
 import org.opensha.sha.earthquake.rupForecastImpl.prvi25.util.PRVI25_RegionLoader.PRVI25_SeismicityRegions;
+import org.opensha.sha.util.TectonicRegionType;
 
 import com.google.common.base.Preconditions;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 class SeismicityPDFFigures {
 
 	public static void main(String[] args) throws IOException {
-		File figsDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures");
-		File crustalOutputDir = new File(figsDir, "crustal_grid");
+		File crustalOutputDir = new File(FIGURES_DIR, "crustal_grid");
 		Preconditions.checkState(crustalOutputDir.exists() || crustalOutputDir.mkdir());
-		File subOutputDir = new File(figsDir, "sub_grid");
+		File subOutputDir = new File(FIGURES_DIR, "sub_grid");
 		Preconditions.checkState(subOutputDir.exists() || subOutputDir.mkdir());
 		
 		PRVI25_DeclusteringAlgorithms avgDecluster = PRVI25_DeclusteringAlgorithms.AVERAGE;
 		PRVI25_SeisSmoothingAlgorithms avgSmooth = PRVI25_SeisSmoothingAlgorithms.AVERAGE;
 		GriddedRegion fullGrid = new GriddedRegion(PRVI25_SeismicityRegions.CRUSTAL.load(), 0.1, GriddedRegion.ANCHOR_0_0);
 		
+		GridSourceList crustalGridProv = FaultSystemSolution.load(CRUSTAL_SOL_GRIDDED).requireModule(GridSourceList.class);
+		
 		plotPDFs(crustalOutputDir, "crustal_pdf", 0, avgDecluster, avgSmooth, fullGrid,
 				"Crustal", PRVI25_SeismicityRegions.CRUSTAL);
-		plotPDFs(crustalOutputDir, "crustal_m5", 5d, avgDecluster, avgSmooth, fullGrid,
-				"Crustal", PRVI25_SeismicityRegions.CRUSTAL);
+//		plotPDFs(crustalOutputDir, "crustal_m5", 5d, avgDecluster, avgSmooth, fullGrid,
+//				"Crustal", PRVI25_SeismicityRegions.CRUSTAL);
+		plotNucleationRates(crustalOutputDir, "crustal_m5", crustalGridProv, 5d, TectonicRegionType.ACTIVE_SHALLOW, fullGrid, "Crustal", null);
+		plotNucleationRates(crustalOutputDir, "crustal_m7", crustalGridProv, 7d, TectonicRegionType.ACTIVE_SHALLOW, fullGrid, "Crustal", null);
 		
 		plotPDFs(subOutputDir, "sub_interface_pdf", 0, avgDecluster, avgSmooth, fullGrid,
 				"Interface", PRVI25_SeismicityRegions.CAR_INTERFACE, PRVI25_SeismicityRegions.MUE_INTERFACE);
@@ -115,5 +123,37 @@ private static void plotPDFs(File outputDir, String prefix, double magForRate, P
 		
 		mapMaker.plot(outputDir, prefix, " ");
 	}
+	
+	private static void plotNucleationRates(File outputDir, String prefix, GridSourceList gridSources,
+			double minMag, TectonicRegionType trt, GriddedRegion gridReg, String name,
+			List<Region> plotRegions) throws IOException {
+		GriddedGeoDataSet xyz = new GriddedGeoDataSet(gridReg, false);
+		BitSet everSets = new BitSet(xyz.size());
+		boolean remap = gridSources.getGriddedRegion() == null || !gridReg.equalsRegion(gridSources.getGriddedRegion());
+		
+		for (int l=0; l<gridSources.getNumLocations(); l++) {
+			int index = remap ? gridReg.indexForLocation(gridSources.getLocation(l)) : l;
+			if (index < 0)
+				continue;
+			everSets.set(index);
+			xyz.set(index, gridSources.getCumulativeNucleationRate(trt, l, minMag));
+		}
+		for (int i=0; i<xyz.size(); i++)
+			if (!everSets.get(i))
+				xyz.set(i, Double.NaN);
+		xyz.log10();
+		CPT cpt = GMT_CPT_Files.SEQUENTIAL_BATLOW_UNIFORM.instance().rescale(-7, -2);
+		String label = "Log10 "+name+" M>"+oDF.format(minMag)+" Nucleation Rate";
+		cpt.setNanColor(new Color(255, 255, 255));
+		
+		GeographicMapMaker mapMaker = new GeographicMapMaker(gridReg);
+		mapMaker.setWriteGeoJSON(false);
+		
+		if (plotRegions != null && !plotRegions.isEmpty())
+			mapMaker.plotInsetRegions(plotRegions, new PlotCurveCharacterstics(PlotLineType.SOLID, 2f, Color.DARK_GRAY), null, 1);
+		mapMaker.plotXYZData(xyz, cpt, label);
+		
+		mapMaker.plot(outputDir, prefix, " ");
+	}
 
 }
diff --git a/src/main/java/scratch/kevin/prvi25/figures/SlipRateFigures.java b/src/main/java/scratch/kevin/prvi25/figures/SlipRateFigures.java
index 9b200c40..a35c572e 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/SlipRateFigures.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/SlipRateFigures.java
@@ -57,20 +57,18 @@
 import net.mahdilamb.colormap.Colors;
 import scratch.kevin.latex.LaTeXUtils;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class SlipRateFigures {
 	
 	static Region CRUSTAL_FAULT_MAP_REG = new Region(new Location(16.4, -70.2), new Location(20.2, -61.7));;
 
 	public static void main(String[] args) throws IOException {
-		File invsDir = new File("/data/kevin/nshm23/batch_inversions");
-		File figsDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures");
-		File crustalDMOutputDir = new File(figsDir, "crustal_dm");
-		File crustalSolOutputDir = new File(figsDir, "crustal_sol");
+		File crustalDMOutputDir = new File(FIGURES_DIR, "crustal_dm");
+		File crustalSolOutputDir = new File(FIGURES_DIR, "crustal_sol");
 		
-		File crustalSolDir = new File(invsDir, "2024_12_05-prvi25_crustal_branches-dmSample5x/");
-		FaultSystemSolution crustalSol = FaultSystemSolution.load(
-				new File(crustalSolDir, "results_PRVI_CRUSTAL_FM_V1p1_branch_averaged_gridded.zip"));
-		FaultSystemSolution crustalNoClassicSol = buildNoClassic(new File(crustalSolDir, "node_branch_averaged"));
+		FaultSystemSolution crustalSol = FaultSystemSolution.load(CRUSTAL_SOL_SUPRA_ONLY);
+		FaultSystemSolution crustalNoClassicSol = buildNoClassic(new File(CRUSTAL_DIR, "node_branch_averaged"));
 		
 		plotCrustal(crustalDMOutputDir, crustalSolOutputDir, crustalSol, crustalNoClassicSol);
 //		plotCrustal(outputDir, null);
diff --git a/src/main/java/scratch/kevin/prvi25/figures/TectonicSettingPlot.java b/src/main/java/scratch/kevin/prvi25/figures/TectonicSettingPlot.java
index 7c833755..7a6161f2 100644
--- a/src/main/java/scratch/kevin/prvi25/figures/TectonicSettingPlot.java
+++ b/src/main/java/scratch/kevin/prvi25/figures/TectonicSettingPlot.java
@@ -37,10 +37,12 @@
 import net.mahdilamb.colormap.Colors;
 import scratch.kevin.prvi25.FaultSystemLineIntegralCalculator;
 
+import static scratch.kevin.prvi25.figures.PRVI_Paths.*;
+
 public class TectonicSettingPlot {
 
 	public static void main(String[] args) throws IOException {
-		File outputDir = new File("/home/kevin/Documents/papers/2024_PRVI_ERF/prvi25-erf-paper/Figures/");
+		File outputDir = FIGURES_DIR;
 		Preconditions.checkState(outputDir.exists() || outputDir.mkdirs());
 		
 		Region modelReg = PRVI25_RegionLoader.loadPRVI_ModelBroad();