From e231cd0e9ff2a4bf27723395371796e5d33f91e3 Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 09:25:20 -0700 Subject: [PATCH 1/8] Remove import from init under plate_simulations --- simpeg_drivers/plate_simulation/__init__.py | 2 -- simpeg_drivers/plate_simulation/match/__init__.py | 2 -- simpeg_drivers/plate_simulation/sweep/__init__.py | 2 -- 3 files changed, 6 deletions(-) diff --git a/simpeg_drivers/plate_simulation/__init__.py b/simpeg_drivers/plate_simulation/__init__.py index 6f1705aa4..df32b2043 100644 --- a/simpeg_drivers/plate_simulation/__init__.py +++ b/simpeg_drivers/plate_simulation/__init__.py @@ -7,5 +7,3 @@ # (see LICENSE file at the root of this source code package). ' # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -from .driver import PlateSimulationDriver diff --git a/simpeg_drivers/plate_simulation/match/__init__.py b/simpeg_drivers/plate_simulation/match/__init__.py index 56a5c7421..df32b2043 100644 --- a/simpeg_drivers/plate_simulation/match/__init__.py +++ b/simpeg_drivers/plate_simulation/match/__init__.py @@ -7,5 +7,3 @@ # (see LICENSE file at the root of this source code package). ' # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -from .driver import PlateMatchDriver diff --git a/simpeg_drivers/plate_simulation/sweep/__init__.py b/simpeg_drivers/plate_simulation/sweep/__init__.py index f6af80c8a..df32b2043 100644 --- a/simpeg_drivers/plate_simulation/sweep/__init__.py +++ b/simpeg_drivers/plate_simulation/sweep/__init__.py @@ -7,5 +7,3 @@ # (see LICENSE file at the root of this source code package). ' # ' # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' - -from .driver import PlateSweepDriver From 95248aca1f4bbeabee7f3e6383512e886e8148df Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 09:39:19 -0700 Subject: [PATCH 2/8] Use non-interactive matplotlib --- simpeg_drivers/plate_simulation/match/driver.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index 6dc5ea1c4..93fce0dd5 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -15,6 +15,10 @@ from pathlib import Path from typing import Self +import matplotlib + + +matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np from dask.distributed import Client, Future, progress From 064d448a135f0895c72d6ad10d804de98f403355 Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 10:43:18 -0700 Subject: [PATCH 3/8] Revise left/right check --- simpeg_drivers/plate_simulation/match/driver.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index 93fce0dd5..6273f67c2 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -19,6 +19,7 @@ matplotlib.use("Agg") + import matplotlib.pyplot as plt import numpy as np from dask.distributed import Client, Future, progress @@ -368,6 +369,10 @@ def run(self): query, strike_angle[ii] ) flip = is_up_dip(observed[:, indices]) + + if flip: + indices = np.flip(indices, axis=0) + # Loop through files and compute scores and find the best match scores, centers = self.run_scores(spatial_projection, observed[:, indices]) ranked = np.argsort(scores) @@ -489,8 +494,8 @@ def is_up_dip(data: np.ndarray) -> bool: left = np.sum(centered[:, :mid], axis=1) right = np.sum(centered[:, mid:], axis=1) - # Mostly on the left suggests the peaks are migrating up-dip and should be reversed - if np.mean(left > right) > 0.5: + # Mostly on the right suggests the peaks are migrating up-dip and should be reversed + if np.mean(left < right) > 0.5: return True return False From 3e7ef96694403e0845c86fb333a0f75c4c73627f Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 11:17:32 -0700 Subject: [PATCH 4/8] Use query point as anchor for plate --- simpeg_drivers/plate_simulation/match/driver.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index 6273f67c2..f60c43753 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -186,7 +186,7 @@ def start(cls, filepath: str | Path, mode="r+", **_) -> Self: return driver def _create_plate_from_parameters( - self, index_center: int, model_options: ModelOptions, strike_angle: float + self, query: np.ndarray, model_options: ModelOptions, strike_angle: float ) -> MaxwellPlate: """ Create a MaxwellPlate object from the parameters of the survey and model options @@ -198,13 +198,13 @@ def _create_plate_from_parameters( :return: MaxwellPlate object created from the parameters. """ - center = self.params.survey.vertices[index_center] + nearest = self.spatial_tree.query(query[:2], k=1)[1] + center = self.params.survey.vertices[nearest] center[2] = ( - self._drape_heights[index_center] - - model_options.overburden_options.thickness + self._drape_heights[nearest] - model_options.overburden_options.thickness ) indices = self.params.survey.get_segment_indices( - index_center, self.params.max_distance + nearest, self.params.max_distance ) segment = self.params.survey.vertices[indices] delta = np.median(np.diff(segment, axis=0), axis=0) @@ -397,7 +397,7 @@ def run(self): dir_correction = strike_angle[ii] + 180 if flip else strike_angle[ii] ind_center = int(centers[best]) plate = self._create_plate_from_parameters( - int(indices[ind_center]), options.model, dir_correction + query, options.model, dir_correction ) plate.name = f"Query [{ii}]" figure = self.plot_figure( From 1240943b77e4cb42f641f5b662cae4d668ca909f Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 12:21:22 -0700 Subject: [PATCH 5/8] Restore logic --- simpeg_drivers/plate_simulation/match/driver.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index f60c43753..10818e8fb 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -19,7 +19,6 @@ matplotlib.use("Agg") - import matplotlib.pyplot as plt import numpy as np from dask.distributed import Client, Future, progress @@ -495,7 +494,7 @@ def is_up_dip(data: np.ndarray) -> bool: right = np.sum(centered[:, mid:], axis=1) # Mostly on the right suggests the peaks are migrating up-dip and should be reversed - if np.mean(left < right) > 0.5: + if np.mean(left > right) > 0.5: return True return False From 3ab8065e71aa0a746b3bd33afa7b9e7b940bce89 Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 14:57:55 -0700 Subject: [PATCH 6/8] Revert some changes --- simpeg_drivers/plate_simulation/match/driver.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index 10818e8fb..e6bc63021 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -185,7 +185,7 @@ def start(cls, filepath: str | Path, mode="r+", **_) -> Self: return driver def _create_plate_from_parameters( - self, query: np.ndarray, model_options: ModelOptions, strike_angle: float + self, index_center: int, model_options: ModelOptions, strike_angle: float ) -> MaxwellPlate: """ Create a MaxwellPlate object from the parameters of the survey and model options @@ -197,13 +197,14 @@ def _create_plate_from_parameters( :return: MaxwellPlate object created from the parameters. """ - nearest = self.spatial_tree.query(query[:2], k=1)[1] - center = self.params.survey.vertices[nearest] + center = self.params.survey.vertices[index_center] + center[2] = ( - self._drape_heights[nearest] - model_options.overburden_options.thickness + self._drape_heights[index_center] + - model_options.overburden_options.thickness ) indices = self.params.survey.get_segment_indices( - nearest, self.params.max_distance + index_center, self.params.max_distance ) segment = self.params.survey.vertices[indices] delta = np.median(np.diff(segment, axis=0), axis=0) @@ -396,7 +397,7 @@ def run(self): dir_correction = strike_angle[ii] + 180 if flip else strike_angle[ii] ind_center = int(centers[best]) plate = self._create_plate_from_parameters( - query, options.model, dir_correction + int(indices[ind_center]), options.model, dir_correction ) plate.name = f"Query [{ii}]" figure = self.plot_figure( @@ -493,7 +494,7 @@ def is_up_dip(data: np.ndarray) -> bool: left = np.sum(centered[:, :mid], axis=1) right = np.sum(centered[:, mid:], axis=1) - # Mostly on the right suggests the peaks are migrating up-dip and should be reversed + # Mostly on the left suggests the peaks are migrating up-dip and should be reversed if np.mean(left > right) > 0.5: return True From d9026185709f263437d764dd81a8bdb17ea55f00 Mon Sep 17 00:00:00 2001 From: domfournier Date: Wed, 22 Apr 2026 15:53:37 -0700 Subject: [PATCH 7/8] Update tests/run_tests/driver_joint_pgi_homogeneous_test.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/run_tests/driver_joint_pgi_homogeneous_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/run_tests/driver_joint_pgi_homogeneous_test.py b/tests/run_tests/driver_joint_pgi_homogeneous_test.py index 33e74ddb7..67649450c 100644 --- a/tests/run_tests/driver_joint_pgi_homogeneous_test.py +++ b/tests/run_tests/driver_joint_pgi_homogeneous_test.py @@ -223,7 +223,7 @@ def test_homogeneous_run( # Remove inversion type as per current json on file options = driver.out_group.options - del options["inversion_type"] + options.pop("inversion_type", None) driver.out_group.options = options drivers.append(driver) else: From 9a960ef1272d26891c4c1c46c38bb5c99ab980fc Mon Sep 17 00:00:00 2001 From: domfournier Date: Thu, 23 Apr 2026 14:58:06 -0700 Subject: [PATCH 8/8] Skip if nothing to process --- simpeg_drivers/plate_simulation/match/driver.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/simpeg_drivers/plate_simulation/match/driver.py b/simpeg_drivers/plate_simulation/match/driver.py index e6bc63021..bf2b13ac5 100644 --- a/simpeg_drivers/plate_simulation/match/driver.py +++ b/simpeg_drivers/plate_simulation/match/driver.py @@ -442,6 +442,9 @@ def run_scores(self, spatial_projection, data) -> tuple[np.ndarray, np.ndarray]: ) tasks = [] for file_batch in file_split: + if len(file_batch) == 0: + continue + args = ( file_batch, spatial_projection,