Skip to content

Commit 5b6fe80

Browse files
authored
Merge pull request #25 from MTgeophysics/updates
- Adding `to/from_json` to `MTLocation` - Fix `plot_mt_response` bugs - Changed keyword in `MTData.from_modem` from `file_type` to `survey`
2 parents 45feb7c + fcddd8d commit 5b6fe80

File tree

11 files changed

+108
-50
lines changed

11 files changed

+108
-50
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 2.0.6
2+
current_version = 2.0.7
33
files = setup.py mtpy/__init__.py README.md docs/source/conf.py
44
commit = True
55
tag = True

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
[![Documentation Status](https://readthedocs.org/projects/mtpy-v2/badge/?version=latest)](https://mtpy-v2.readthedocs.io/en/latest/?badge=latest)
88
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/MTgeophysics/mtpy-v2/main)
99

10-
## Version 2.0.6
10+
## Version 2.0.7
1111

1212
# Description
1313

docs/source/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@
6767
#
6868

6969
# The short X.Y version.
70-
version = "2.0.6"
70+
version = "2.0.7"
7171
# The full version, including alpha/beta/rc tags.
72-
release = "2.0.6"
72+
release = "2.0.7"
7373

7474
# The language for content autogenerated by Sphinx. Refer to documentation
7575
# for a list of supported languages.

mtpy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from mtpy.imaging.mtcolors import MT_CMAP_DICT, register_cmaps
1919

2020

21-
__version__ = "2.0.6"
21+
__version__ = "2.0.7"
2222
__all__ = ["MT", "MTData", "MTCollection"]
2323

2424
# =============================================================================

mtpy/core/mt_data.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ def to_modem(self, data_filename=None, **kwargs):
889889

890890
return modem_data
891891

892-
def from_modem_data(self, data_filename, file_type="data", **kwargs):
892+
def from_modem_data(self, data_filename, survey="data", **kwargs):
893893
"""
894894
895895
:param data_filename: DESCRIPTION
@@ -907,7 +907,7 @@ def from_modem_data(self, data_filename, file_type="data", **kwargs):
907907
"'from_modem_data' will be deprecated in future versions, use 'from_modem'"
908908
)
909909

910-
self.from_modem(data_filename, file_type=file_type, **kwargs)
910+
self.from_modem(data_filename, survey=survey, **kwargs)
911911

912912
def from_modem(self, data_filename, survey="data", **kwargs):
913913
"""
@@ -923,6 +923,7 @@ def from_modem(self, data_filename, survey="data", **kwargs):
923923
"""
924924
modem_data = Data(**kwargs)
925925
mdf = modem_data.read_data_file(data_filename)
926+
926927
# set survey name to something useful
927928
mdf.dataframe["survey"] = survey
928929

mtpy/core/mt_location.py

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from pyproj import CRS
1515
import numpy as np
1616
from loguru import logger
17+
import json
1718

1819
from mtpy.utils.gis_tools import project_point
1920

@@ -30,7 +31,6 @@ class MTLocation:
3031
"""
3132

3233
def __init__(self, survey_metadata=None, **kwargs):
33-
3434
self.logger = logger
3535
if survey_metadata is None:
3636
self._survey_metadata = self._initiate_metadata()
@@ -256,11 +256,7 @@ def utm_crs(self, value):
256256
new_crs = CRS.from_user_input(value)
257257
if value != self._utm_crs:
258258
# reproject easting, northing to new zone
259-
if (
260-
self._utm_crs is not None
261-
and self.east != 0
262-
and self.north != 0
263-
):
259+
if self._utm_crs is not None and self.east != 0 and self.north != 0:
264260
self._east, self._north = project_point(
265261
self.east, self.north, self._utm_crs, new_crs
266262
)
@@ -483,3 +479,52 @@ def get_elevation_from_national_map(self):
483479
self.logger.warning(
484480
"Could not get elevation data, not setting elevation"
485481
)
482+
483+
def to_json(self, filename):
484+
"""
485+
write out information to a json file
486+
487+
:param filename: DESCRIPTION
488+
:type filename: TYPE
489+
:return: DESCRIPTION
490+
:rtype: TYPE
491+
492+
"""
493+
494+
js_dict = {
495+
"latitude": self.latitude,
496+
"longitude": self.longitude,
497+
"elevation": self.elevation,
498+
"north": self.north,
499+
"east": self.east,
500+
"model_east": self.model_east,
501+
"model_north": self.model_north,
502+
"model_elevation": self.model_elevation,
503+
"datum_crs": self.datum_crs.to_json_dict(),
504+
"utm_crs": self.utm_crs.to_json_dict(),
505+
}
506+
with open(filename, "w") as fid:
507+
json.dump(js_dict, fid)
508+
509+
def from_json(self, filename):
510+
"""
511+
read in json formatted location
512+
513+
:param filename: DESCRIPTION
514+
:type filename: TYPE
515+
:return: DESCRIPTION
516+
:rtype: TYPE
517+
518+
"""
519+
520+
with open(filename, "r") as fid:
521+
js_dict = json.load(fid)
522+
523+
for key, value in js_dict.items():
524+
if key in ["datum_crs", "utm_crs"]:
525+
if isinstance(value, dict):
526+
setattr(self, key, CRS.from_json_dict(value))
527+
else:
528+
setattr(self, key, CRS.from_user_input(value))
529+
else:
530+
setattr(self, key, value)

mtpy/imaging/mtplot_tools/plot_settings.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import mtpy.imaging.mtcolors as mtcl
1919

20+
2021
# =============================================================================
2122
# ==============================================================================
2223
# Plot settings
@@ -273,8 +274,8 @@ def set_phase_limits(self, phase, mode="od"):
273274
ph_min = round(ph_min / 5) * 5
274275
ph_max = max(
275276
[
276-
np.nanmax(phase[:, 0, 1]),
277-
np.nanmax(phase[:, 1, 0] + 180),
277+
np.nanmax(phase[nz_xy, 0, 1]),
278+
np.nanmax(phase[nz_yx, 1, 0] + 180),
278279
]
279280
)
280281
if ph_max < 91:
@@ -373,7 +374,6 @@ def font_dict(self):
373374
return {"size": self.font_size + 2, "weight": self.font_weight}
374375

375376
def make_pt_cb(self, ax):
376-
377377
cmap = mtcl.cmapdict[self.ellipse_cmap]
378378
if "seg" in self.ellipse_cmap:
379379
# normalize the colors

mtpy/imaging/plot_mt_response.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ def rotation_angle(self, theta_r):
149149
only a single value is allowed
150150
"""
151151
if not theta_r == 0:
152-
153152
self.Z.rotate(theta_r)
154153
self.Tipper.rotate(theta_r)
155154
self.pt.rotate(theta_r)
@@ -249,7 +248,6 @@ def _setup_subplots(self):
249248
return label_coords
250249

251250
def _plot_resistivity(self, axr, period, z_obj, mode="od"):
252-
253251
if mode == "od":
254252
comps = ["xy", "yx"]
255253
props = [
@@ -262,8 +260,6 @@ def _plot_resistivity(self, axr, period, z_obj, mode="od"):
262260
self.xy_error_bar_properties,
263261
self.yx_error_bar_properties,
264262
]
265-
res_limits = self.set_resistivity_limits(z_obj.resistivity, mode=mode)
266-
x_limits = self.set_period_limits(period)
267263

268264
eb_list = []
269265
label_list = []
@@ -282,8 +278,8 @@ def _plot_resistivity(self, axr, period, z_obj, mode="od"):
282278

283279
axr.set_yscale("log", nonpositive="clip")
284280
axr.set_xscale("log", nonpositive="clip")
285-
axr.set_xlim(x_limits)
286-
axr.set_ylim(res_limits)
281+
axr.set_xlim(self.x_limits)
282+
axr.set_ylim(self.res_limits)
287283
axr.grid(
288284
True, alpha=0.25, which="both", color=(0.25, 0.25, 0.25), lw=0.25
289285
)
@@ -318,8 +314,8 @@ def _plot_phase(self, axp, period, z_obj, mode="od", index=0):
318314
self.xy_error_bar_properties,
319315
self.yx_error_bar_properties,
320316
]
321-
phase_limits = self.set_phase_limits(z_obj.phase, mode=mode)
322317

318+
phase_limits = self.set_phase_limits(z_obj.phase, mode=mode)
323319
for comp, prop in zip(comps, props):
324320
if comp == "yx":
325321
plot_phase(
@@ -385,9 +381,12 @@ def _plot_determinant(self):
385381
borderpad=0.02,
386382
)
387383

388-
self.axr.set_ylim(
389-
self.set_resistivity_limits(self.Z.resistivity, mode="det")
390-
)
384+
if self.res_limits is None:
385+
self.axr.set_ylim(
386+
self.set_resistivity_limits(self.Z.resistivity, mode="det")
387+
)
388+
else:
389+
self.axr.set_ylim(self.res_limits)
391390

392391
def _plot_tipper(self):
393392
if self.Tipper is not None:
@@ -406,7 +405,8 @@ def _plot_tipper(self):
406405
self.axt.set_xlim(
407406
np.log10(self.x_limits[0]), np.log10(self.x_limits[1])
408407
)
409-
408+
if self.tipper_limits is not None:
409+
self.axt.set_ylim(self.tipper_limits)
410410
self.axt.yaxis.set_major_locator(MultipleLocator(0.2))
411411
self.axt.yaxis.set_minor_locator(MultipleLocator(0.1))
412412
self.axt.set_xlabel("Period (s)", fontdict=self.font_dict)
@@ -420,11 +420,13 @@ def _plot_tipper(self):
420420
def _plot_pt(self):
421421
# ----plot phase tensor ellipse---------------------------------------
422422
if self.plot_pt:
423-
424423
color_array = self.get_pt_color_array(self.pt)
425424

426425
# -------------plot ellipses-----------------------------------
427-
self.cbax, self.cbpt, = plot_pt_lateral(
426+
(
427+
self.cbax,
428+
self.cbpt,
429+
) = plot_pt_lateral(
428430
self.axpt,
429431
self.pt,
430432
color_array,

mtpy/modeling/structured_mesh_3d.py

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,7 @@ def make_mesh(self, verbose=True):
572572
for s_north in sorted(self.station_locations.model_north):
573573
try:
574574
node_index = np.where(
575-
abs(s_north - self.grid_north)
576-
< 0.02 * self.cell_size_north
575+
abs(s_north - self.grid_north) < 0.02 * self.cell_size_north
577576
)[0][0]
578577
if s_north - self.grid_north[node_index] > 0:
579578
self.grid_north[node_index] -= 0.02 * self.cell_size_north
@@ -585,7 +584,7 @@ def make_mesh(self, verbose=True):
585584
if self.z_mesh_method == "custom":
586585
if self.grid_z is None:
587586
self.z_mesh_method = "default"
588-
self._logger.warn(
587+
self._logger.warning(
589588
"No grid_z provided, creating new z mesh using default method"
590589
)
591590

@@ -602,9 +601,7 @@ def make_mesh(self, verbose=True):
602601
)
603602

604603
# compute grid center
605-
center_east = np.round(
606-
self.grid_east.min() - self.grid_east.mean(), -1
607-
)
604+
center_east = np.round(self.grid_east.min() - self.grid_east.mean(), -1)
608605
center_north = np.round(
609606
self.grid_north.min() - self.grid_north.mean(), -1
610607
)
@@ -692,7 +689,7 @@ def add_layers_to_mesh(
692689
layer_thickness = layer_thickness[-1]
693690

694691
if n_add_layers != len(add_layers):
695-
self._logger.warn(
692+
self._logger.warning(
696693
"Updating number of layers to reflect the length of the layer thickness array"
697694
)
698695
n_add_layers = len(add_layers)
@@ -826,8 +823,7 @@ def to_modem(self, model_fn=None, **kwargs):
826823
if self.res_scale.lower() == "loge":
827824
write_res_model = np.log(self.res_model[::-1, :, :])
828825
elif (
829-
self.res_scale.lower() == "log"
830-
or self.res_scale.lower() == "log10"
826+
self.res_scale.lower() == "log" or self.res_scale.lower() == "log10"
831827
):
832828
write_res_model = np.log10(self.res_model[::-1, :, :])
833829
elif self.res_scale.lower() == "linear":
@@ -945,9 +941,7 @@ def from_modem(self, model_fn=None):
945941
self.nodes_east = np.array(
946942
[float(nn) for nn in ilines[3].strip().split()]
947943
)
948-
self.nodes_z = np.array(
949-
[float(nn) for nn in ilines[4].strip().split()]
950-
)
944+
self.nodes_z = np.array([float(nn) for nn in ilines[4].strip().split()])
951945

952946
self.res_model = np.zeros((n_north, n_east, n_z))
953947

@@ -1631,10 +1625,10 @@ def add_topography_to_model(
16311625
)
16321626

16331627
if self.n_air_layers is None or self.n_air_layers == 0:
1634-
self._logger.warn(
1628+
self._logger.warning(
16351629
"No air layers specified, so will not add air/topography !!!"
16361630
)
1637-
self._logger.warn(
1631+
self._logger.warning(
16381632
"Only bathymetry will be added below according to the topofile: sea-water low resistivity!!!"
16391633
)
16401634

@@ -1679,9 +1673,7 @@ def add_topography_to_model(
16791673
# adjust level to topography min
16801674
if max_elev is not None:
16811675
self.grid_z -= max_elev
1682-
ztops = np.where(
1683-
self.surface_dict["topography"] > max_elev
1684-
)
1676+
ztops = np.where(self.surface_dict["topography"] > max_elev)
16851677
self.surface_dict["topography"][ztops] = max_elev
16861678
else:
16871679
self.grid_z -= topo_core.max()
@@ -2770,7 +2762,7 @@ def from_ws3dinv(self, model_fn):
27702762
lagrange = float(info[8])
27712763
except IndexError:
27722764
self._logger.warning("Did not get Lagrange Multiplier")
2773-
lagrange = 1.
2765+
lagrange = 1.0
27742766

27752767
# get lengths of things
27762768
n_north, n_east, n_z, n_res = np.array(
@@ -2792,7 +2784,7 @@ def from_ws3dinv(self, model_fn):
27922784
self._nodes_north[count_n] = float(north_node)
27932785
count_n += 1
27942786
line_index += 1
2795-
self.grid_north = np.insert(np.cumsum(self.nodes_north),0,0)
2787+
self.grid_north = np.insert(np.cumsum(self.nodes_north), 0, 0)
27962788

27972789
count_e = 0 # number of east nodes found
27982790
while count_e < n_east:
@@ -2801,7 +2793,7 @@ def from_ws3dinv(self, model_fn):
28012793
self._nodes_east[count_e] = float(east_node)
28022794
count_e += 1
28032795
line_index += 1
2804-
self.grid_east = np.insert(np.cumsum(self.nodes_east),0,0)
2796+
self.grid_east = np.insert(np.cumsum(self.nodes_east), 0, 0)
28052797

28062798
count_z = 0 # number of vertical nodes
28072799
zdep = 0

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
test_suite="tests",
6666
tests_require=test_requirements,
6767
url="https://github.com/MTgeophysics/mtpy-v2",
68-
version="2.0.6",
68+
version="2.0.7",
6969
zip_safe=False,
7070
package_data={"": []},
7171
)

0 commit comments

Comments
 (0)