mt-metadata 0.3.6__py2.py3-none-any.whl → 0.3.7__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mt-metadata might be problematic. Click here for more details.

Files changed (29) hide show
  1. mt_metadata/__init__.py +1 -1
  2. mt_metadata/base/helpers.py +9 -2
  3. mt_metadata/timeseries/filters/filtered.py +133 -75
  4. mt_metadata/timeseries/station.py +31 -0
  5. mt_metadata/timeseries/stationxml/xml_inventory_mt_experiment.py +1 -0
  6. mt_metadata/transfer_functions/__init__.py +38 -0
  7. mt_metadata/transfer_functions/io/edi/edi.py +22 -12
  8. mt_metadata/transfer_functions/io/edi/metadata/define_measurement.py +1 -0
  9. mt_metadata/transfer_functions/io/edi/metadata/emeasurement.py +4 -2
  10. mt_metadata/transfer_functions/io/edi/metadata/header.py +3 -1
  11. mt_metadata/transfer_functions/io/edi/metadata/information.py +13 -6
  12. mt_metadata/transfer_functions/io/emtfxml/emtfxml.py +8 -2
  13. mt_metadata/transfer_functions/io/emtfxml/metadata/data.py +1 -1
  14. mt_metadata/transfer_functions/io/emtfxml/metadata/estimate.py +1 -1
  15. mt_metadata/transfer_functions/io/emtfxml/metadata/period_range.py +6 -1
  16. mt_metadata/transfer_functions/io/emtfxml/metadata/provenance.py +6 -2
  17. mt_metadata/transfer_functions/io/emtfxml/metadata/standards/copyright.json +2 -1
  18. mt_metadata/transfer_functions/processing/aurora/channel_nomenclature.py +2 -44
  19. mt_metadata/transfer_functions/processing/aurora/standards/regression.json +46 -1
  20. mt_metadata/transfer_functions/processing/aurora/station.py +17 -11
  21. mt_metadata/transfer_functions/processing/aurora/stations.py +4 -4
  22. mt_metadata/utils/mttime.py +1 -1
  23. mt_metadata/utils/validators.py +11 -2
  24. {mt_metadata-0.3.6.dist-info → mt_metadata-0.3.7.dist-info}/METADATA +52 -3
  25. {mt_metadata-0.3.6.dist-info → mt_metadata-0.3.7.dist-info}/RECORD +29 -29
  26. {mt_metadata-0.3.6.dist-info → mt_metadata-0.3.7.dist-info}/AUTHORS.rst +0 -0
  27. {mt_metadata-0.3.6.dist-info → mt_metadata-0.3.7.dist-info}/LICENSE +0 -0
  28. {mt_metadata-0.3.6.dist-info → mt_metadata-0.3.7.dist-info}/WHEEL +0 -0
  29. {mt_metadata-0.3.6.dist-info → mt_metadata-0.3.7.dist-info}/top_level.txt +0 -0
mt_metadata/__init__.py CHANGED
@@ -39,7 +39,7 @@ you should only have to changes these dictionaries.
39
39
 
40
40
  __author__ = """Jared Peacock"""
41
41
  __email__ = "jpeacock@usgs.gov"
42
- __version__ = "0.3.6"
42
+ __version__ = "0.3.7"
43
43
 
44
44
  # =============================================================================
45
45
  # Imports
@@ -2,7 +2,7 @@
2
2
  """
3
3
  Created on Wed Dec 23 20:37:52 2020
4
4
 
5
- :copyright:
5
+ :copyright:
6
6
  Jared Peacock (jpeacock@usgs.gov)
7
7
 
8
8
  :license: MIT
@@ -637,11 +637,18 @@ def element_to_string(element):
637
637
  # Helper function to be sure everything is encoded properly
638
638
  # =============================================================================
639
639
  class NumpyEncoder(json.JSONEncoder):
640
+
640
641
  """
641
642
  Need to encode numpy ints and floats for json to work
642
643
  """
643
644
 
644
645
  def default(self, obj):
646
+ """
647
+
648
+ :param obj:
649
+ :type obj:
650
+ :return:
651
+ """
645
652
  if isinstance(
646
653
  obj,
647
654
  (
@@ -659,7 +666,7 @@ class NumpyEncoder(json.JSONEncoder):
659
666
  ),
660
667
  ):
661
668
  return int(obj)
662
- elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)):
669
+ elif isinstance(obj, (np.float16, np.float32, np.float64)):
663
670
  return float(obj)
664
671
  elif isinstance(obj, (np.ndarray)):
665
672
  if obj.dtype == complex:
@@ -17,6 +17,7 @@ from mt_metadata.base.helpers import write_lines
17
17
  from mt_metadata.base import get_schema, Base
18
18
  from mt_metadata.timeseries.standards import SCHEMA_FN_PATHS
19
19
  from mt_metadata.utils.exceptions import MTSchemaError
20
+ from typing import Optional, Union
20
21
 
21
22
  # =============================================================================
22
23
  attr_dict = get_schema("filtered", SCHEMA_FN_PATHS)
@@ -31,6 +32,14 @@ class Filtered(Base):
31
32
  __doc__ = write_lines(attr_dict)
32
33
 
33
34
  def __init__(self, **kwargs):
35
+ """
36
+ Constructor
37
+
38
+ :param kwargs:
39
+
40
+ TODO: Consider not setting self.applied = None, as this has the effect of self._applied = [True,]
41
+ """
42
+ self._applied_values_map = _applied_values_map()
34
43
  self._name = []
35
44
  self._applied = []
36
45
  self.name = None
@@ -53,7 +62,7 @@ class Filtered(Base):
53
62
  elif isinstance(names, list):
54
63
  self._name = [ss.strip().lower() for ss in names]
55
64
  elif isinstance(names, np.ndarray):
56
- names = names.astype(np.unicode_)
65
+ names = names.astype(np.str_)
57
66
  self._name = [ss.strip().lower() for ss in names]
58
67
  else:
59
68
  msg = "names must be a string or list of strings not {0}, type {1}"
@@ -68,25 +77,52 @@ class Filtered(Base):
68
77
  self.logger.warning(msg)
69
78
 
70
79
  @property
71
- def applied(self):
80
+ def applied(self) -> list:
72
81
  return self._applied
73
82
 
74
83
  @applied.setter
75
- def applied(self, applied):
84
+ def applied(
85
+ self,
86
+ applied: Union[list, str, None, int, tuple, np.ndarray, bool],
87
+ ) -> None:
88
+ """
89
+ Sets the value of the booleans for whether each filter has been applied or not
90
+
91
+ :type applied: Union[list, str, None, int, tuple]
92
+ :param applied: The value to set self._applied.
93
+
94
+ Notes:
95
+ self._applied is a list, but we allow this to be assigned by single values as well,
96
+ such as None, True, 0. Supporting these other values makes the logic a little bit involved.
97
+ If a null value is received, the filters are assumed to be applied.
98
+ If a simple value, such as True, None, 0, etc. is not received, the input argument
99
+ applied (which is iterable) is first converted to `applied_list`.
100
+ The values in `applied_list` are then mapped to booleans.
101
+
102
+
103
+ """
104
+ # Handle cases where we did not pass an iterable
76
105
  if not hasattr(applied, "__iter__"):
77
- if applied in [None, "none", "None", "NONE", "null"]:
78
- self._applied = [True]
79
- return
80
- elif applied in [0, "0"]:
81
- self._applied = [False]
82
- return
106
+ self._applied = [self._applied_values_map[applied], ]
107
+ return
108
+
109
+ # the returned type from a hdf5 dataset is a numpy array.
110
+ if isinstance(applied, np.ndarray):
111
+ applied = applied.tolist()
83
112
 
84
113
  #sets an empty list to one default value
85
114
  if isinstance(applied, list) and len(applied) == 0:
86
- self.applied = [True]
115
+ self._applied = [True]
87
116
  return
88
117
 
118
+ # Handle string case
89
119
  if isinstance(applied, str):
120
+ # Handle simple strings
121
+ if applied in self._applied_values_map.keys():
122
+ self._applied = [self._applied_values_map[applied], ]
123
+ return
124
+
125
+ # Handle string-lists (e.g. from json)
90
126
  if applied.find("[") >= 0:
91
127
  applied = applied.replace("[", "").replace("]", "")
92
128
  if applied.count(",") > 0:
@@ -97,44 +133,20 @@ class Filtered(Base):
97
133
  applied_list = [ss.lower() for ss in applied.split()]
98
134
  elif isinstance(applied, list):
99
135
  applied_list = applied
100
- # set integer strings to integers ["0","1"]--> [0, 1]
101
- for i, elt in enumerate(applied_list):
102
- if elt in ["0", "1",]:
103
- applied_list[i] = int(applied_list[i])
104
- # set integers to bools [0,1]--> [False, True]
105
- for i, elt in enumerate(applied_list):
106
- if elt in [0, 1,]:
107
- applied_list[i] = bool(applied_list[i])
108
- elif isinstance(applied, bool):
109
- applied_list = [applied]
110
- # the returned type from a hdf5 dataset is a numpy array.
111
- elif isinstance(applied, np.ndarray):
136
+ elif isinstance(applied, tuple):
112
137
  applied_list = list(applied)
113
- if applied_list == []:
114
- applied_list = [True]
115
138
  else:
116
- msg = "applied must be a string or list of strings not {0}"
117
- self.logger.error(msg.format(applied))
118
- raise MTSchemaError(msg.format(applied))
119
-
120
- bool_list = []
121
- for app_bool in applied_list:
122
- if app_bool is None:
123
- bool_list.append(True)
124
- elif isinstance(app_bool, str):
125
- if app_bool.lower() in ["false", "0"]:
126
- bool_list.append(False)
127
- elif app_bool.lower() in ["true", "1"]:
128
- bool_list.append(True)
129
- else:
130
- msg = "Filter.applied must be [ True | False ], not {0}"
131
- self.logger.error(msg.format(app_bool))
132
- raise MTSchemaError(msg.format(app_bool))
133
- elif isinstance(app_bool, (bool, np.bool_)):
134
- bool_list.append(bool(app_bool))
135
- else:
136
- msg = "Filter.applied must be [True | False], not {0}"
137
- self.logger.error(msg.format(app_bool))
139
+ msg = f"Input applied cannot be of type {type(applied)}"
140
+ self.logger.error(msg)
141
+ raise MTSchemaError(msg)
142
+
143
+ # Now we have a simple list -- map to bools
144
+ try:
145
+ bool_list = [self._applied_values_map[x] for x in applied_list]
146
+ except KeyError:
147
+ msg = f"A key in {applied_list} is not mapped to a boolean"
148
+ msg += "\n fix this by adding to _applied_values_map"
149
+ self.logger.error(msg)
138
150
  self._applied = bool_list
139
151
 
140
152
  # check for consistency
@@ -146,36 +158,82 @@ class Filtered(Base):
146
158
  self.logger.warning(msg)
147
159
 
148
160
 
149
- def _check_consistency(self):
150
- # check for consistency
151
- if self._name != []:
152
- if self._applied is None:
153
- self.logger.warning("Need to input filter.applied")
154
- return False
155
- if len(self._name) == 1:
156
- if len(self._applied) == 1:
157
- return True
158
- elif len(self._name) > 1:
159
- if len(self._applied) == 1:
160
- self.logger.debug(
161
- "Assuming all filters have been "
162
- + "applied as {0}".format(self._applied[0])
163
- )
164
- return True
165
- elif len(self._applied) > 1:
166
- if len(self._applied) != len(self._name):
167
- self.logger.warning(
168
- "Applied and filter names "
169
- + "should be the same length. "
170
- + "Appied={0}, names={1}".format(
171
- len(self._applied), len(self._name)
172
- )
173
- )
174
- return False
175
- else:
176
- return True
177
- elif self._name == [] and len(self._applied) > 0:
161
+ def _check_consistency(self) -> bool:
162
+ """
163
+ Logic to look for inconstencies in the configuration of the filter names and applied values.
164
+
165
+ In general, list of filter names should be same length as list of applied booleans.
166
+
167
+ Cases:
168
+ The filter has no name -- this could happen on intialization.
169
+
170
+ :return: bool
171
+ True if OK, False if not.
172
+
173
+ """
174
+ # This inconsistency is ok -- the filter may not have been assigned a name yet
175
+ if self._name == [] and len(self._applied) > 0:
178
176
  self.logger.debug("Name probably not yet initialized -- skipping consitency check")
179
177
  return True
178
+
179
+ # Otherwise self._name != []
180
+
181
+ # Applied not assigned - this is not OK
182
+ if self._applied is None:
183
+ self.logger.warning("Need to input filter.applied")
184
+ return False
185
+
186
+ # Name and applied have same length, 1. This is OK
187
+ if len(self._name) == 1:
188
+ if len(self._applied) == 1:
189
+ return True
190
+
191
+ # Multiple filter names (name not of length 0 or 1)
192
+ if len(self._name) > 1:
193
+ # If only one applied boolean, we allow it.
194
+ # TODO: consider being less tolerant here
195
+ if len(self._applied) == 1:
196
+ msg = f"Assuming all filters have been applied as {self._applied[0]}"
197
+ self.logger.debug(msg)
198
+ self._applied = len(self.name) * [self._applied[0],]
199
+ msg = f"Explicitly set filter applied state to {self._applied[0]}"
200
+ self.logger.debug(msg)
201
+ return True
202
+ elif len(self._applied) > 1:
203
+ # need to check the lists are really the same length
204
+ if len(self._applied) != len(self._name):
205
+ msg = "Applied and filter names should be the same length. "
206
+ msg += f"Appied={len(self._applied)}, names={len(self._name)}"
207
+ self.logger.warning(msg)
208
+ return False
209
+ else:
210
+ return True
180
211
  else:
212
+ # Some unknown configuration we have not yet encountered
213
+ msg = "Filter consistency check failed for an unknown reason"
214
+ self.logger.warning(msg)
181
215
  return False
216
+
217
+
218
+ def _applied_values_map(
219
+ treat_null_values_as: Optional[bool] = True
220
+ ) -> dict:
221
+ """
222
+ helper function to simplify logic in applied setter.
223
+
224
+ Notes:
225
+ The logic in the setter was getting quite complicated handling many types.
226
+ A reasonable solution seemed to be to map each of the allowed values to a bool
227
+ via dict and then use this dict when setting applied values.
228
+
229
+ :return: dict
230
+ Mapping of all tolerated single-values for setting applied booleans
231
+ """
232
+ null_values = [None, "none", "None", "NONE", "null"]
233
+ null_values_map = {x: treat_null_values_as for x in null_values}
234
+ true_values = [True, 1, "1", "True", "true"]
235
+ true_values_map = {x:True for x in true_values}
236
+ false_values = [False, 0, "0", "False", "false"]
237
+ false_values_map = {x:False for x in false_values}
238
+ values_map = {**null_values_map, **true_values_map, **false_values_map}
239
+ return values_map
@@ -59,6 +59,8 @@ attr_dict.add_dict(get_schema("copyright", SCHEMA_FN_PATHS), None)
59
59
  attr_dict["release_license"]["required"] = False
60
60
  attr_dict.add_dict(get_schema("citation", SCHEMA_FN_PATHS), None, keys=["doi"])
61
61
  attr_dict["doi"]["required"] = False
62
+
63
+
62
64
  # =============================================================================
63
65
  class Station(Base):
64
66
  __doc__ = write_lines(attr_dict)
@@ -316,3 +318,32 @@ class Station(Base):
316
318
  else:
317
319
  if self.time_period.end < max(end):
318
320
  self.time_period.end = max(end)
321
+
322
+ def sort_runs_by_time(self, inplace=True, ascending=True):
323
+ """
324
+ return a list of runs sorted by start time in the order of ascending or
325
+ descending.
326
+
327
+ :param ascending: DESCRIPTION, defaults to True
328
+ :type ascending: TYPE, optional
329
+ :return: DESCRIPTION
330
+ :rtype: TYPE
331
+
332
+ """
333
+
334
+ run_ids = []
335
+ run_starts = []
336
+ for run_key, run_obj in self.runs.items():
337
+ run_ids.append(run_key)
338
+ run_starts.append(run_obj.time_period.start.split("+")[0])
339
+
340
+ index = np.argsort(np.array(run_starts, dtype=np.datetime64))
341
+
342
+ new_runs = ListDict()
343
+ for ii in index:
344
+ new_runs[run_ids[ii]] = self.runs[run_ids[ii]]
345
+
346
+ if inplace:
347
+ self.runs = new_runs
348
+ else:
349
+ return new_runs
@@ -174,6 +174,7 @@ class XMLInventoryMTExperiment:
174
174
  xml_station.site.country = ",".join(
175
175
  [str(country) for country in mt_survey.country]
176
176
  )
177
+ # need to sort the runs by time
177
178
  for mt_run in mt_station.runs:
178
179
  xml_station = self.add_run(
179
180
  xml_station, mt_run, mt_survey.filters
@@ -1,3 +1,41 @@
1
+ # Define allowed sets of channel labellings
2
+ STANDARD_INPUT_CHANNELS = [
3
+ "hx",
4
+ "hy",
5
+ ]
6
+ STANDARD_OUTPUT_CHANNELS = [
7
+ "ex",
8
+ "ey",
9
+ "hz",
10
+ ]
11
+
12
+ CHANNEL_MAPS = {
13
+ "default": {"hx": "hx", "hy": "hy", "hz": "hz", "ex": "ex", "ey": "ey"},
14
+ "lemi12": {"hx": "bx", "hy": "by", "hz": "bz", "ex": "e1", "ey": "e2"},
15
+ "lemi34": {"hx": "bx", "hy": "by", "hz": "bz", "ex": "e3", "ey": "e4"},
16
+ "phoenix123": {"hx": "h1", "hy": "h2", "hz": "h3", "ex": "e1", "ey": "e2"},
17
+ "musgraves": {"hx": "bx", "hy": "by", "hz": "bz", "ex": "ex", "ey": "ey"},
18
+ }
19
+
20
+
21
+ def get_allowed_channel_names(standard_names):
22
+ """
23
+ :param standard_names: one of STANDARD_INPUT_NAMES, or STANDARD_OUTPUT_NAMES
24
+ :type standard_names: list
25
+ :return: allowed_names: list of channel names that are supported
26
+ :rtype: list
27
+ """
28
+ allowed_names = []
29
+ for ch in standard_names:
30
+ for _, channel_map in CHANNEL_MAPS.items():
31
+ allowed_names.append(channel_map[ch])
32
+ allowed_names = list(set(allowed_names))
33
+ return allowed_names
34
+
35
+
36
+ ALLOWED_INPUT_CHANNELS = get_allowed_channel_names(STANDARD_INPUT_CHANNELS)
37
+ ALLOWED_OUTPUT_CHANNELS = get_allowed_channel_names(STANDARD_OUTPUT_CHANNELS)
38
+
1
39
  from .core import TF
2
40
 
3
41
  __all__ = ["TF"]
@@ -419,8 +419,7 @@ class EDI(object):
419
419
  )
420
420
  elif key.startswith("t"):
421
421
  obj[:, ii, jj] = (
422
- data_dict[f"{key}r.exp"]
423
- + data_dict[f"{key}i.exp"] * 1j
422
+ data_dict[f"{key}r.exp"] + data_dict[f"{key}i.exp"] * 1j
424
423
  )
425
424
  try:
426
425
  error_key = [
@@ -756,10 +755,8 @@ class EDI(object):
756
755
  extra_lines.append(
757
756
  f"\toriginal_program.date={self.Header.progdate}\n"
758
757
  )
759
- if self.Header.fileby != "1980-01-01":
760
- extra_lines.append(
761
- f"\toriginal_file.date={self.Header.filedate}\n"
762
- )
758
+ if self.Header.filedate != "1980-01-01":
759
+ extra_lines.append(f"\toriginal_file.date={self.Header.filedate}\n")
763
760
  header_lines = self.Header.write_header(
764
761
  longitude_format=longitude_format, latlon_format=latlon_format
765
762
  )
@@ -907,15 +904,11 @@ class EDI(object):
907
904
  ]
908
905
  elif data_key.lower() == "freq":
909
906
  block_lines = [
910
- ">{0} // {1:.0f}\n".format(
911
- data_key.upper(), data_comp_arr.size
912
- )
907
+ ">{0} // {1:.0f}\n".format(data_key.upper(), data_comp_arr.size)
913
908
  ]
914
909
  elif data_key.lower() in ["zrot", "trot"]:
915
910
  block_lines = [
916
- ">{0} // {1:.0f}\n".format(
917
- data_key.upper(), data_comp_arr.size
918
- )
911
+ ">{0} // {1:.0f}\n".format(data_key.upper(), data_comp_arr.size)
919
912
  ]
920
913
  else:
921
914
  raise ValueError("Cannot write block for {0}".format(data_key))
@@ -1039,6 +1032,13 @@ class EDI(object):
1039
1032
  if survey.summary != None:
1040
1033
  self.Info.info_list.append(f"survey.summary = {survey.summary}")
1041
1034
 
1035
+ for key in survey.to_dict(single=True).keys():
1036
+ if "northwest" in key or "southeast" in key or "time_period" in key:
1037
+ continue
1038
+ value = survey.get_attr_from_name(key)
1039
+ if value != None:
1040
+ self.Info.info_list.append(f"survey.{key} = {value}")
1041
+
1042
1042
  @property
1043
1043
  def station_metadata(self):
1044
1044
  sm = metadata.Station()
@@ -1192,6 +1192,8 @@ class EDI(object):
1192
1192
  self.Header.datum = sm.location.datum
1193
1193
  self.Header.units = sm.transfer_function.units
1194
1194
  self.Header.enddate = sm.time_period.end
1195
+ if sm.geographic_name is not None:
1196
+ self.Header.loc = sm.geographic_name
1195
1197
 
1196
1198
  ### write notes
1197
1199
  # write comments, which would be anything in the info section from an edi
@@ -1379,3 +1381,11 @@ class EDI(object):
1379
1381
  @property
1380
1382
  def rrhy_metadata(self):
1381
1383
  return self._get_magnetic_metadata("rrhy")
1384
+
1385
+ @property
1386
+ def rrhx_metadata(self):
1387
+ return self._get_magnetic_metadata("rrhx")
1388
+
1389
+ @property
1390
+ def rrhy_metadata(self):
1391
+ return self._get_magnetic_metadata("rrhy")
@@ -441,6 +441,7 @@ class DefineMeasurement(Base):
441
441
  "chtype": channel.component,
442
442
  "id": channel.channel_id,
443
443
  "acqchan": channel.channel_number,
444
+ "dip": channel.measurement_tilt,
444
445
  }
445
446
  )
446
447
  setattr(self, f"meas_{channel.component.lower()}", meas)
@@ -17,6 +17,7 @@ from .standards import SCHEMA_FN_PATHS
17
17
  # =============================================================================
18
18
  attr_dict = get_schema("emeasurement", SCHEMA_FN_PATHS)
19
19
 
20
+
20
21
  # ==============================================================================
21
22
  # magnetic measurements
22
23
  # ==============================================================================
@@ -40,8 +41,9 @@ class EMeasurement(Base):
40
41
 
41
42
  super().__init__(attr_dict=attr_dict, **kwargs)
42
43
 
43
- if self.x != 0 or self.y != 0 or self.x2 != 0 or self.y2 != 0:
44
- self.azm = self.azimuth
44
+ if self.azm == 0:
45
+ if self.x != 0 or self.x2 != 0 or self.y != 0 or self.y2 != 0:
46
+ self.azm = self.azimuth
45
47
 
46
48
  def __str__(self):
47
49
  return "\n".join(
@@ -213,7 +213,7 @@ class Header(Location):
213
213
  self,
214
214
  longitude_format="LON",
215
215
  latlon_format="dms",
216
- required=True,
216
+ required=False,
217
217
  ):
218
218
  """
219
219
  Write header information to a list of lines.
@@ -243,6 +243,8 @@ class Header(Location):
243
243
  for key, value in self.to_dict(single=True, required=required).items():
244
244
  if key in ["x", "x2", "y", "y2", "z", "z2"]:
245
245
  continue
246
+ if value in [None, "None"]:
247
+ continue
246
248
  if key in ["latitude"]:
247
249
  key = "lat"
248
250
  elif key in ["longitude"]:
@@ -10,6 +10,7 @@ Created on Sat Dec 4 14:13:37 2021
10
10
  from mt_metadata.base import Base
11
11
  from mt_metadata.base.helpers import validate_name
12
12
 
13
+
13
14
  # ==============================================================================
14
15
  # Info object
15
16
  # ==============================================================================
@@ -444,11 +445,17 @@ class Information(Base):
444
445
  new_dict[new_key] = value.split()[0]
445
446
  elif key.lower().endswith("sen"):
446
447
  comp = key.lower().split()[0]
447
- new_dict[
448
- f"{comp}.sensor.manufacturer"
449
- ] = "Phoenix Geophysics"
448
+ new_dict[f"{comp}.sensor.manufacturer"] = (
449
+ "Phoenix Geophysics"
450
+ )
450
451
  new_dict[f"{comp}.sensor.type"] = "Induction Coil"
451
452
  new_dict[new_key] = value
453
+ elif new_key in [
454
+ "survey.time_period.start_date",
455
+ "survey.time_period.end_date",
456
+ ]:
457
+ if value.count("-") == 1:
458
+ new_dict[new_key] = value.split("-")[0]
452
459
  else:
453
460
  new_dict[new_key] = value
454
461
 
@@ -461,8 +468,8 @@ class Information(Base):
461
468
  new_dict[key] = value
462
469
 
463
470
  if processing_parameters != []:
464
- new_dict[
465
- "transfer_function.processing_parameters"
466
- ] = processing_parameters
471
+ new_dict["transfer_function.processing_parameters"] = (
472
+ processing_parameters
473
+ )
467
474
 
468
475
  self.info_dict = new_dict
@@ -358,14 +358,20 @@ class EMTFXML(emtf_xml.EMTF):
358
358
  if hasattr(value, "to_xml") and callable(getattr(value, "to_xml")):
359
359
  if key == "processing_info":
360
360
  if skip_field_notes:
361
- value.remote_info._order.remove("field_notes")
361
+ try:
362
+ value.remote_info._order.remove("field_notes")
363
+ except ValueError:
364
+ self.logger.debug("No field notes to skip.")
362
365
  if value.remote_info.site.id in [
363
366
  None,
364
367
  "",
365
368
  "None",
366
369
  "none",
367
370
  ]:
368
- value.remote_info._order.remove("site")
371
+ try:
372
+ value.remote_info._order.remove("site")
373
+ except ValueError:
374
+ self.logger.debug("No remote field notes to skip.")
369
375
  element = value.to_xml()
370
376
  if isinstance(element, list):
371
377
  for item in element:
@@ -432,7 +432,7 @@ class TransferFunction(Base):
432
432
  pass
433
433
 
434
434
  comp_element = et.SubElement(
435
- period_element, key.replace("_", ".").capitalize(), attr_dict
435
+ period_element, key.replace("_", ".").upper(), attr_dict
436
436
  )
437
437
  idx_dict = self.write_dict[key]
438
438
  shape = arr.shape
@@ -56,7 +56,7 @@ class Estimate(Base):
56
56
 
57
57
  root = et.Element(
58
58
  self.__class__.__name__.capitalize(),
59
- {"name": self.name, "type": self.type},
59
+ {"name": self.name.upper(), "type": self.type},
60
60
  )
61
61
 
62
62
  et.SubElement(root, "Description").text = self.description
@@ -20,6 +20,8 @@ from mt_metadata.transfer_functions.io.emtfxml.metadata import helpers
20
20
 
21
21
  # =============================================================================
22
22
  attr_dict = get_schema("period_range", SCHEMA_FN_PATHS)
23
+
24
+
23
25
  # =============================================================================
24
26
  class PeriodRange(Base):
25
27
  __doc__ = write_lines(attr_dict)
@@ -45,7 +47,10 @@ class PeriodRange(Base):
45
47
 
46
48
  root = et.Element(
47
49
  self.__class__.__name__,
48
- {"min": f"{self.min:.9f}", "max": f"{self.max:.9f}"},
50
+ {
51
+ "min": f"{self.min:<16.5E}".strip(),
52
+ "max": f"{self.max:<16.5E}".strip(),
53
+ },
49
54
  )
50
55
  if string:
51
56
  return element_to_string(root)
@@ -11,7 +11,11 @@ Created on Wed Dec 23 21:30:36 2020
11
11
  # =============================================================================
12
12
  # Imports
13
13
  # =============================================================================
14
- from mt_metadata.base.helpers import write_lines, dict_to_xml, element_to_string
14
+ from mt_metadata.base.helpers import (
15
+ write_lines,
16
+ dict_to_xml,
17
+ element_to_string,
18
+ )
15
19
  from mt_metadata.base import get_schema, Base
16
20
  from .standards import SCHEMA_FN_PATHS
17
21
  from . import Person
@@ -40,7 +44,7 @@ class Provenance(Base):
40
44
 
41
45
  @property
42
46
  def create_time(self):
43
- return self._creation_dt.iso_str
47
+ return self._creation_dt.iso_str.split(".")[0]
44
48
 
45
49
  @create_time.setter
46
50
  def create_time(self, dt_str):
@@ -21,7 +21,8 @@
21
21
  "Restricted release",
22
22
  "Paper Citation Required",
23
23
  "Academic Use Only",
24
- "Conditions Apply"
24
+ "Conditions Apply",
25
+ "Data Citation Required"
25
26
  ],
26
27
  "alias": [],
27
28
  "example": "Unrestricted release",
@@ -10,53 +10,11 @@ from mt_metadata.base.helpers import write_lines
10
10
  from mt_metadata.base import get_schema, Base
11
11
  from .standards import SCHEMA_FN_PATHS
12
12
 
13
+ from mt_metadata.transfer_functions import CHANNEL_MAPS
14
+
13
15
  # =============================================================================
14
16
  attr_dict = get_schema("channel_nomenclature", SCHEMA_FN_PATHS)
15
17
 
16
- # Define allowed sets of channel labellings
17
- STANDARD_INPUT_NAMES = [
18
- "hx",
19
- "hy",
20
- ]
21
- STANDARD_OUTPUT_NAMES = [
22
- "ex",
23
- "ey",
24
- "hz",
25
- ]
26
-
27
- def load_channel_maps():
28
- """
29
- :return: Keys are the channel_nomenclature schema keywords.
30
- Values are dictionaries which map the STANDARD_INPUT_NAMES, \
31
- STANDARD_OUTPUT_NAMES to the channel names associated with a given
32
- channel nomenclature
33
- :rtype: dict
34
- """
35
- import json
36
- import pathlib
37
- fn = pathlib.Path(__file__).parent.joinpath("standards", "channel_nomenclatures.json")
38
- with open(fn) as f:
39
- channel_maps = json.loads(f.read())
40
- return channel_maps
41
-
42
- CHANNEL_MAPS = load_channel_maps()
43
-
44
- def get_allowed_channel_names(standard_names):
45
- """
46
- :param standard_names: one of STANDARD_INPUT_NAMES, or STANDARD_OUTPUT_NAMES
47
- :type standard_names: list
48
- :return: allowed_names: list of channel names that are supported
49
- :rtype: list
50
- """
51
- allowed_names = []
52
- for ch in standard_names:
53
- for _, channel_map in CHANNEL_MAPS.items():
54
- allowed_names.append(channel_map[ch])
55
- allowed_names = list(set(allowed_names))
56
- return allowed_names
57
-
58
- ALLOWED_INPUT_CHANNELS = get_allowed_channel_names(STANDARD_INPUT_NAMES)
59
- ALLOWED_OUTPUT_CHANNELS = get_allowed_channel_names(STANDARD_OUTPUT_NAMES)
60
18
 
61
19
  # =============================================================================
62
20
  class ChannelNomenclature(Base):
@@ -31,5 +31,50 @@
31
31
  "alias": [],
32
32
  "example": "2",
33
33
  "default": 2
34
+ },
35
+ "r0": {
36
+ "type": "float",
37
+ "required": true,
38
+ "style": "number",
39
+ "units": null,
40
+ "description": "The number of standard deviations where the influence function changes from linear to quadratic",
41
+ "options": [],
42
+ "alias": [],
43
+ "example": "1.4",
44
+ "default": 1.5
45
+ },
46
+ "u0": {
47
+ "type": "float",
48
+ "required": true,
49
+ "style": "number",
50
+ "units": null,
51
+ "description": "Control for redescending Huber regression weights.",
52
+ "options": [],
53
+ "alias": [],
54
+ "example": "2.8",
55
+ "default": 2.8
56
+ },
57
+ "tolerance": {
58
+ "type": "float",
59
+ "required": true,
60
+ "style": "number",
61
+ "units": null,
62
+ "description": "Control for convergence of RME algorithm. Lower means more iterations",
63
+ "options": [],
64
+ "alias": [],
65
+ "example": "0.005",
66
+ "default": 0.005
67
+ },
68
+ "verbosity": {
69
+ "type": "int",
70
+ "required": true,
71
+ "style": "number",
72
+ "units": null,
73
+ "description": "Control for logging messages during regression -- Higher means more messages",
74
+ "options": [0, 1, 2],
75
+ "alias": [],
76
+ "example": "1",
77
+ "default": 0
78
+
34
79
  }
35
- }
80
+ }
@@ -17,6 +17,8 @@ from .run import Run
17
17
 
18
18
  # =============================================================================
19
19
  attr_dict = get_schema("station", SCHEMA_FN_PATHS)
20
+
21
+
20
22
  # =============================================================================
21
23
  class Station(Base):
22
24
  __doc__ = write_lines(attr_dict)
@@ -88,8 +90,8 @@ class Station(Base):
88
90
  processing
89
91
 
90
92
  [
91
- "station_id",
92
- "run_id",
93
+ "station",
94
+ "run",
93
95
  "start",
94
96
  "end",
95
97
  "mth5_path",
@@ -106,8 +108,8 @@ class Station(Base):
106
108
  for run in self.runs:
107
109
  for tp in run.time_periods:
108
110
  entry = {
109
- "station_id": self.id,
110
- "run_id": run.id,
111
+ "station": self.id,
112
+ "run": run.id,
111
113
  "start": tp.start,
112
114
  "end": tp.end,
113
115
  "mth5_path": self.mth5_path,
@@ -130,8 +132,8 @@ class Station(Base):
130
132
  set a data frame
131
133
 
132
134
  [
133
- "station_id",
134
- "run_id",
135
+ "station",
136
+ "run",
135
137
  "start",
136
138
  "end",
137
139
  "mth5_path",
@@ -150,15 +152,17 @@ class Station(Base):
150
152
 
151
153
  self.runs = []
152
154
 
153
- self.id = df.station_id.unique()[0]
155
+ self.id = df.station.unique()[0]
154
156
  self.mth5_path = df.mth5_path.unique()[0]
155
157
  self.remote = df.remote.unique()[0]
156
158
 
157
159
  for entry in df.itertuples():
158
160
  try:
159
- r = self.run_dict[entry.run_id]
161
+ r = self.run_dict[entry.run]
160
162
  r.time_periods.append(
161
- TimePeriod(start=entry.start.isoformat(), end=entry.end.isoformat())
163
+ TimePeriod(
164
+ start=entry.start.isoformat(), end=entry.end.isoformat()
165
+ )
162
166
  )
163
167
 
164
168
  except KeyError:
@@ -167,7 +171,7 @@ class Station(Base):
167
171
  else:
168
172
  channel_scale_factors = {}
169
173
  r = Run(
170
- id=entry.run_id,
174
+ id=entry.run,
171
175
  sample_rate=entry.sample_rate,
172
176
  input_channels=entry.input_channels,
173
177
  output_channels=entry.output_channels,
@@ -175,6 +179,8 @@ class Station(Base):
175
179
  )
176
180
 
177
181
  r.time_periods.append(
178
- TimePeriod(start=entry.start.isoformat(), end=entry.end.isoformat())
182
+ TimePeriod(
183
+ start=entry.start.isoformat(), end=entry.end.isoformat()
184
+ )
179
185
  )
180
186
  self.runs.append(r)
@@ -117,14 +117,14 @@ class Stations(Base):
117
117
 
118
118
  """
119
119
 
120
- station = df[df.remote == False].station_id.unique()[0]
121
- rr_stations = df[df.remote == True].station_id.unique()
120
+ station = df[df.remote == False].station.unique()[0]
121
+ rr_stations = df[df.remote == True].station.unique()
122
122
 
123
- self.local.from_dataset_dataframe(df[df.station_id == station])
123
+ self.local.from_dataset_dataframe(df[df.station == station])
124
124
 
125
125
  for rr_station in rr_stations:
126
126
  rr = Station()
127
- rr.from_dataset_dataframe(df[df.station_id == rr_station])
127
+ rr.from_dataset_dataframe(df[df.station == rr_station])
128
128
  self.add_remote(rr)
129
129
 
130
130
  def to_dataset_dataframe(self):
@@ -400,7 +400,7 @@ class MTime:
400
400
 
401
401
  """
402
402
  t_min_max = False
403
- if dt_str in [None, "", "none", "None", "NONE"]:
403
+ if dt_str in [None, "", "none", "None", "NONE", "Na"]:
404
404
  self.logger.debug(
405
405
  "Time string is None, setting to 1980-01-01:00:00:00"
406
406
  )
@@ -378,6 +378,15 @@ def validate_default(value_dict):
378
378
 
379
379
  def validate_value_type(value, v_type, style=None):
380
380
  """
381
+
382
+ :param value:
383
+ :type value:
384
+ :param v_type:
385
+ :type v_type:
386
+ :param style:
387
+ :type style:
388
+ :return:
389
+
381
390
  validate type from standards
382
391
 
383
392
  """
@@ -469,7 +478,7 @@ def validate_value_type(value, v_type, style=None):
469
478
 
470
479
  # if a number convert to appropriate type
471
480
  elif isinstance(
472
- value, (float, np.float_, np.float16, np.float32, np.float64)
481
+ value, (float, np.float16, np.float32, np.float64)
473
482
  ):
474
483
  if v_type is int:
475
484
  return int(value)
@@ -481,7 +490,7 @@ def validate_value_type(value, v_type, style=None):
481
490
  elif isinstance(value, Iterable):
482
491
  if v_type is str:
483
492
  if isinstance(value, np.ndarray):
484
- value = value.astype(np.unicode_)
493
+ value = value.astype(np.str_)
485
494
  value = [
486
495
  f"{v}".replace("'", "").replace('"', "") for v in value
487
496
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mt-metadata
3
- Version: 0.3.6
3
+ Version: 0.3.7
4
4
  Summary: Metadata for magnetotelluric data
5
5
  Home-page: https://github.com/kujaku11/mt_metadata
6
6
  Author: Jared Peacock
@@ -28,7 +28,7 @@ Requires-Dist: matplotlib
28
28
  Requires-Dist: xarray
29
29
  Requires-Dist: loguru
30
30
 
31
- # mt_metadata version 0.3.6
31
+ # mt_metadata version 0.3.7
32
32
  Standard MT metadata
33
33
 
34
34
  [![PyPi version](https://img.shields.io/pypi/v/mt_metadata.svg)](https://pypi.python.org/pypi/mt-metadata)
@@ -58,7 +58,7 @@ MT Metadata is a project led by [IRIS-PASSCAL MT Software working group](https:/
58
58
 
59
59
  Most people will be using the transfer functions, but a lot of that metadata comes from the time series metadata. This module supports both and has tried to make them more or less seamless to reduce complication.
60
60
 
61
- * **Version**: 0.3.6
61
+ * **Version**: 0.3.7
62
62
  * **Free software**: MIT license
63
63
  * **Documentation**: https://mt-metadata.readthedocs.io.
64
64
  * **Examples**: Click the `Binder` badge above and Jupyter Notebook examples are in **mt_metadata/examples/notebooks** and **docs/source/notebooks**
@@ -377,3 +377,52 @@ History
377
377
  -----------------------
378
378
 
379
379
  * update pandas.append to concat
380
+
381
+ 0.3.4 ()
382
+ -----------------------
383
+
384
+ * Update HISTORY.rst by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/179
385
+ * Remove filter direction attributes by @kkappler in https://github.com/kujaku11/mt_metadata/pull/181
386
+ * Fix issue 173 by @kkappler in https://github.com/kujaku11/mt_metadata/pull/182
387
+ * Patch 173 by @kkappler in https://github.com/kujaku11/mt_metadata/pull/183
388
+ * Add some common helper functions by @kkappler in https://github.com/kujaku11/mt_metadata/pull/185
389
+ * Bug fix in FC layer by @kkappler in https://github.com/kujaku11/mt_metadata/pull/186
390
+ * Fix mth5 issue 187 by @kkappler in https://github.com/kujaku11/mt_metadata/pull/187
391
+ * bug fixes by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/180
392
+ * updating how a TF is initiated, initialize xarray is expensive by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/188
393
+ * Change default value of `get_elevation` to False by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/191
394
+ * Updating git clone address in the readme by @xandrd in https://github.com/kujaku11/mt_metadata/pull/189
395
+ * Fix how Z-files read/write by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/192
396
+ * Adjust how TF._initialize_transfer_function is setup by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/193
397
+ * Add Ability to store processing configuration in TF by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/196
398
+ * Bump version: 0.3.3 → 0.3.4 by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/198
399
+
400
+
401
+ 0.3.5 ()
402
+ ---------------------
403
+
404
+ * Patches by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/200
405
+ * Fix issue #202 by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/203
406
+ * Patches by @kkappler in https://github.com/kujaku11/mt_metadata/pull/205
407
+ * Bump version: 0.3.4 → 0.3.5 by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/206
408
+
409
+ 0.3.6 ()
410
+ ---------------------
411
+
412
+ * add method for accessing mag channel names by @kkappler in https://github.com/kujaku11/mt_metadata/pull/210
413
+ * Patches by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/208
414
+ * Fix mth5 issue 207 by @kkappler in https://github.com/kujaku11/mt_metadata/pull/209
415
+ * Minor changes by @kkappler in https://github.com/kujaku11/mt_metadata/pull/211
416
+ * Patches by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/212
417
+
418
+ 0.3.7 (2024-08-16)
419
+ ---------------------
420
+
421
+ * Minor fixes numpy 2.0 by @kkappler in https://github.com/kujaku11/mt_metadata/pull/213
422
+ * Fix issue 216 by @kkappler in https://github.com/kujaku11/mt_metadata/pull/218
423
+ * Patches by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/219
424
+ * add u0 and r0 as regression parameters by @kkappler in https://github.com/kujaku11/mt_metadata/pull/220
425
+ * Updating EMTF XML and StationXML writers by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/217
426
+ * Patches by @kkappler in https://github.com/kujaku11/mt_metadata/pull/221
427
+ * Patches by @kkappler in https://github.com/kujaku11/mt_metadata/pull/223
428
+ * Bump version: 0.3.6 → 0.3.7 by @kujaku11 in https://github.com/kujaku11/mt_metadata/pull/225
@@ -1,6 +1,6 @@
1
- mt_metadata/__init__.py,sha256=qSrpytMuLQIb26AmmXoMDnOxrWw80RoURCl-wEqPDTI,5588
1
+ mt_metadata/__init__.py,sha256=Ij-OA6uOFAAYRMgD-lPkuf74v6_J326Orxlg2fKQVbM,5588
2
2
  mt_metadata/base/__init__.py,sha256=bylCGBoJkeytxeQgMnuqivqFAvbyNE5htvP-3yu1GEY,184
3
- mt_metadata/base/helpers.py,sha256=oS4s7OysTQZ5J8VVPUJYYuVkqviSIlOwnNFKZe5FWIc,19721
3
+ mt_metadata/base/helpers.py,sha256=_SbJC8zDFmjQrmGbb6jBkqkWtaItNHyb8PREdPm5nl8,19798
4
4
  mt_metadata/base/metadata.py,sha256=obOFdU6FPf2o-SbdxOxZ60LvzbI6Cp-bbRXw8KdkBao,27145
5
5
  mt_metadata/base/schema.py,sha256=MvZBvy2elYia5VLRXqOV9x0GIklEWLM4qpTdqo820P4,12842
6
6
  mt_metadata/data/__init__.py,sha256=PECwullCdCwKGpd1fkQc1jL8CboaSQfy_Cdm-obl-Y8,217
@@ -69,7 +69,7 @@ mt_metadata/timeseries/provenance.py,sha256=GyF-VFdPa_EIlRiIO4NDC-emFXbX2DNLOSrs
69
69
  mt_metadata/timeseries/rating.py,sha256=Kyx9PV4KvKZzUIo9aoOdozU9umh5zFW62nXljZZPSKs,826
70
70
  mt_metadata/timeseries/run.py,sha256=iZ5gr7_HXvFAVBN5ONdIotlbKH1wjWy-ySE7vmCgOMY,14009
71
71
  mt_metadata/timeseries/software.py,sha256=ziFip_B_Y27x9zRizJJX3mW57JnKh2saNCm-K4hWkLg,1224
72
- mt_metadata/timeseries/station.py,sha256=odyyeohvIPyd3nHWgz4nH9Qa9Aq5heFlU6FOtKczjXQ,9855
72
+ mt_metadata/timeseries/station.py,sha256=fM6LZVYOjA18y8orPu4R_fV_oIDNqBJNWcD1aS4JoYA,10710
73
73
  mt_metadata/timeseries/survey.py,sha256=dTyFnjtmn4tzEjli_cebPeE6kOBTts1Un6HaqzjzpYI,11831
74
74
  mt_metadata/timeseries/time_period.py,sha256=eUFucwMY8Gsoi375pwuPlrg-HCBENU6UJ-sR6_SDxe0,1653
75
75
  mt_metadata/timeseries/timing_system.py,sha256=3Uvu_Ihk1b1SyPFMKHWCDe1_BUfiVYphpatRP3wwS-s,839
@@ -77,7 +77,7 @@ mt_metadata/timeseries/filters/__init__.py,sha256=9FaNM3OVQ1dMiAn5JyfSK8QtICqGXH
77
77
  mt_metadata/timeseries/filters/channel_response.py,sha256=yxPaukC2yyEJFayniSyH2IPNGgE4oDIFMmTp4o3jJ1I,17297
78
78
  mt_metadata/timeseries/filters/coefficient_filter.py,sha256=HryPmsFGr-SEkox85DBYc3q8A3M4C_Hmjc-CNvm6e-w,3322
79
79
  mt_metadata/timeseries/filters/filter_base.py,sha256=IiPhOkVvJUbdboFxWWeKyj1iKdW1HE061nvBdw6G8TM,12885
80
- mt_metadata/timeseries/filters/filtered.py,sha256=0o3aFYLhtSeBgpgi5ndSsKGbE5tBJhY_wEq5oQblhOg,6979
80
+ mt_metadata/timeseries/filters/filtered.py,sha256=1Yj85F2To98iIlXDFhs12-YfaB3m94Sd9vJ-r0KZ7q0,9100
81
81
  mt_metadata/timeseries/filters/fir_filter.py,sha256=jdjtaZjaTE5a27YlTVEEN-777bXIutjpmqcVLEw6F0o,6767
82
82
  mt_metadata/timeseries/filters/frequency_response_table_filter.py,sha256=36GqpOSAr3HhjXxFbtZ5iHMD5cdKa0hGYoPpY7otqa0,7734
83
83
  mt_metadata/timeseries/filters/helper_functions.py,sha256=u7YpnkuPiHwEb9Qrk2EyQ6HXofKkDNYLpC3GtlChyAk,4124
@@ -125,24 +125,24 @@ mt_metadata/timeseries/stationxml/fdsn_tools.py,sha256=6H1hZCxf5-skNSjPazMS_wKu4
125
125
  mt_metadata/timeseries/stationxml/utils.py,sha256=16617e6snyrsNjletGbw-gLYQ2vt-7VfYPokz6dakts,7257
126
126
  mt_metadata/timeseries/stationxml/xml_channel_mt_channel.py,sha256=fQw13j8QAyZQoMJX5xX24nDC0Ub4EVfpOORKTnemLA0,22122
127
127
  mt_metadata/timeseries/stationxml/xml_equipment_mt_run.py,sha256=yRPk6lhnzkpgARe6lQkU_-vZrTDDmIIeRCTI9Wig9XY,5151
128
- mt_metadata/timeseries/stationxml/xml_inventory_mt_experiment.py,sha256=cmDJybDh6-JgzEHQM0CuLeDTIKoNnIyn9PnYrzV1RZs,14036
128
+ mt_metadata/timeseries/stationxml/xml_inventory_mt_experiment.py,sha256=M_k6rENVd9eHv92QNkcd7Yua9bnwYZtjKj9mpjKhkEs,14085
129
129
  mt_metadata/timeseries/stationxml/xml_network_mt_survey.py,sha256=RciEmnFGb8kMf1mA1lLn9d0R7WiOW2BeoV1bDB-eJuU,7124
130
130
  mt_metadata/timeseries/stationxml/xml_station_mt_station.py,sha256=pelvkiQios4gz8gHebWY1MPSsfBhfTz6uTgC92Yz9-4,11112
131
131
  mt_metadata/timeseries/tools/__init__.py,sha256=loPgjYnajbOX2rQTlLBh79cG2eaUNpI3KaCjp7SB4ik,78
132
132
  mt_metadata/timeseries/tools/from_many_mt_files.py,sha256=rtx5NAPBUmOgrMXUT-YJxznqfI1qdRkS4B2SWjrU_1c,14405
133
- mt_metadata/transfer_functions/__init__.py,sha256=wpGghfoqFj4nuFOoHeR8PFGQGMzkWvTb3T_KfmMWswQ,42
133
+ mt_metadata/transfer_functions/__init__.py,sha256=7F_9sev0KlRfswx_H0j8-1PJs-ZTpD04qwjYh1jst8w,1288
134
134
  mt_metadata/transfer_functions/core.py,sha256=AmWmH2-k-2W2uGTsaozZkq6p3KURWWgfMHCbEMZiTU8,80641
135
135
  mt_metadata/transfer_functions/io/__init__.py,sha256=8DKEQZrpF0RK_MTjR0_w0UQfgVf9VwuJrzy7eann1N8,215
136
136
  mt_metadata/transfer_functions/io/tools.py,sha256=xatyc0RN8-KKS1PmpjATDAOHln9HIEP-iNAN0Njjyv4,6024
137
137
  mt_metadata/transfer_functions/io/edi/__init__.py,sha256=5pgyFFwRezvlxxcsSQsvCmeShJe97TdY6F37T7FiNWA,61
138
- mt_metadata/transfer_functions/io/edi/edi.py,sha256=IOc5mDIqC2Fn6kRix0wBLDQGA2MvdQ4Wz6lPsybr6uY,53321
138
+ mt_metadata/transfer_functions/io/edi/edi.py,sha256=mFUahyjiIZnh45masDsue4pJkU4FifnZOi4I8rlvXh0,53798
139
139
  mt_metadata/transfer_functions/io/edi/metadata/__init__.py,sha256=ndXcOh7eN4adnXS7fAtvZg6i4K_gY3VT7zbNzeGjsaM,395
140
140
  mt_metadata/transfer_functions/io/edi/metadata/data_section.py,sha256=RhelbBN83LhRvItlVrBKuQoFLBaPonENp0KyIkW79X0,7751
141
- mt_metadata/transfer_functions/io/edi/metadata/define_measurement.py,sha256=5x0ATVKNG4kfxJU7MbY750cdo0_PlBAlwcQC0QJ77gk,16264
142
- mt_metadata/transfer_functions/io/edi/metadata/emeasurement.py,sha256=_6U3zgSb0njXNTHM98CrXowJiFVmPIoFq9mH7DxnNp0,3138
143
- mt_metadata/transfer_functions/io/edi/metadata/header.py,sha256=wmYi1Z9foNL_WmxFcDJozVGwRz3kMdQZiZGkMO_Vk6o,9203
141
+ mt_metadata/transfer_functions/io/edi/metadata/define_measurement.py,sha256=AQfJQSTVs-iOuEyiCnBFjMwqgowD0dkL2Bp5mSAhQ8s,16318
142
+ mt_metadata/transfer_functions/io/edi/metadata/emeasurement.py,sha256=IE0FJnVYM-MU0qT_H10wWaeaZJmfCDBr32jtVJMKY8g,3175
143
+ mt_metadata/transfer_functions/io/edi/metadata/header.py,sha256=uECGOQ4qD3LkBtzHbxw67heSFH20lfWlfKk4vj0ME94,9271
144
144
  mt_metadata/transfer_functions/io/edi/metadata/hmeasurement.py,sha256=5w3fbcSRasSaSrLq3qm6TJPXgkOIGXrIeclmhh3KMTc,2245
145
- mt_metadata/transfer_functions/io/edi/metadata/information.py,sha256=2EYkSiEffcvy3KHbzaOokkfvjpvHd9J9Bc1bGUA-ZaQ,17062
145
+ mt_metadata/transfer_functions/io/edi/metadata/information.py,sha256=BaqNLN4vByGTHHiioMTY6XNG7gEIIzJOshzUNOubyK4,17389
146
146
  mt_metadata/transfer_functions/io/edi/metadata/standards/__init__.py,sha256=Y3rdyXKOgxbSh9FQxQCCplsbqxwWmFIGm6yZG1cj0Uw,135
147
147
  mt_metadata/transfer_functions/io/edi/metadata/standards/data_section.json,sha256=HmEpRxnJ5HPwXdWjpmDnwReVucPu2Zm1saClauEUP2c,3045
148
148
  mt_metadata/transfer_functions/io/edi/metadata/standards/define_measurement.json,sha256=uyiTHtX6UsO_gIQxtRMVExI7-1T73ESkX-LAPScQybU,2572
@@ -150,14 +150,14 @@ mt_metadata/transfer_functions/io/edi/metadata/standards/emeasurement.json,sha25
150
150
  mt_metadata/transfer_functions/io/edi/metadata/standards/header.json,sha256=fj0wzxyYB5HmgqpExaiJMWen8vVjRvZh7bWD2PPANt8,6444
151
151
  mt_metadata/transfer_functions/io/edi/metadata/standards/hmeasurement.json,sha256=0m7EkHrrWlq8r96aMF1M1NhrtkyYJBgA7gYtnuyj_gY,2450
152
152
  mt_metadata/transfer_functions/io/emtfxml/__init__.py,sha256=V5N_vahhWUH8A3R_xd66CMEVM1adcUeG2RqGWrDCBks,73
153
- mt_metadata/transfer_functions/io/emtfxml/emtfxml.py,sha256=vkcoB8NS4_QGhSVvpj_N59IdC38iDcFZVti-WpWQbNo,53440
153
+ mt_metadata/transfer_functions/io/emtfxml/emtfxml.py,sha256=iqjZvfmnp8Ib02MJge4z255iOf56enBzQPP46YzRSq4,53751
154
154
  mt_metadata/transfer_functions/io/emtfxml/metadata/__init__.py,sha256=mSVzB8ghPaBJgwVcKJyQ75CJEUF5k0VoZQxkvV01_00,2364
155
155
  mt_metadata/transfer_functions/io/emtfxml/metadata/attachment.py,sha256=U_2DxKJHKqZqldq-XHiLbes_UT4u708xgoPAyc0xl5c,2459
156
156
  mt_metadata/transfer_functions/io/emtfxml/metadata/channels.py,sha256=FENaOpoElNezd0ESZgk01-KGxHbv6Euhyq8O6YImF-c,889
157
157
  mt_metadata/transfer_functions/io/emtfxml/metadata/citation.py,sha256=VN_VmnLJ-FOAnp_i3Ap9tpBUMB6pfaMdlJW8_9hhYHU,1500
158
158
  mt_metadata/transfer_functions/io/emtfxml/metadata/comment.py,sha256=DywmSp9-0Z6gAX9UPzkCzSxlXWi6AWZ_s_BGubZslmw,2409
159
159
  mt_metadata/transfer_functions/io/emtfxml/metadata/copyright.py,sha256=qNLs4AyIferfT6Q1rftX77UkfRD21WecpKCOx6tbUUg,1802
160
- mt_metadata/transfer_functions/io/emtfxml/metadata/data.py,sha256=lWTnnK-Apd3JA2QFzunNW66ZxAk7yoFjg4Zh4GqeF5U,14720
160
+ mt_metadata/transfer_functions/io/emtfxml/metadata/data.py,sha256=LqAflYpEXeNvcZNYzfp8QwPzkv1Hl_m3sRJrO-vLs7k,14715
161
161
  mt_metadata/transfer_functions/io/emtfxml/metadata/data_quality_notes.py,sha256=I2A_4yg_iJXaRl-TuBjwb8E_eweKTQf-zFAv-cLfq_4,2325
162
162
  mt_metadata/transfer_functions/io/emtfxml/metadata/data_quality_warnings.py,sha256=t236kiGYXsKQvWba4L-o01xtUuk2M2IjloUlFRRljlQ,1769
163
163
  mt_metadata/transfer_functions/io/emtfxml/metadata/data_type.py,sha256=6OVVvjyxb9PScBxkfGsLbJYhwL-KAMLhY-4wphxZtSI,1919
@@ -166,7 +166,7 @@ mt_metadata/transfer_functions/io/emtfxml/metadata/dipole.py,sha256=U8DrDXh_wDql
166
166
  mt_metadata/transfer_functions/io/emtfxml/metadata/electric.py,sha256=GiYdILYZowjaejkVvkKFlhyadbynOK2gkCbwBAjCoKE,1952
167
167
  mt_metadata/transfer_functions/io/emtfxml/metadata/electrode.py,sha256=7Y5XTQX-30z6rqMJ8BUAWAH9Gg6DkJDIPF-7Awof9eM,1398
168
168
  mt_metadata/transfer_functions/io/emtfxml/metadata/emtf.py,sha256=7X9rIF3glRRITpAvs1LbVOsgmeOa5ex_9GQxqGtIMFs,773
169
- mt_metadata/transfer_functions/io/emtfxml/metadata/estimate.py,sha256=NVVh-Jt6UVHGE9A5K0KMxJot8to8BQ4zovn0c4LpSJ8,2038
169
+ mt_metadata/transfer_functions/io/emtfxml/metadata/estimate.py,sha256=BLn1dg7fy3W3nCDaWISClCxrsSlnNpOQCAB6SXgWQZk,2046
170
170
  mt_metadata/transfer_functions/io/emtfxml/metadata/external_url.py,sha256=ZA9wCbGBHlbPXaYTvTgMncT9BfNkvQm9w28zuaHVSw4,1172
171
171
  mt_metadata/transfer_functions/io/emtfxml/metadata/field_notes.py,sha256=mn4Vz6A57KuPNpU5ZD9lrB_rClzeKSKcjLwOdsVoBlE,1766
172
172
  mt_metadata/transfer_functions/io/emtfxml/metadata/helpers.py,sha256=TDEYCLAgdu9Shjhyig14roId1TuaPjjUiX19VPouXuk,4494
@@ -175,11 +175,11 @@ mt_metadata/transfer_functions/io/emtfxml/metadata/location.py,sha256=MctHGyQt19
175
175
  mt_metadata/transfer_functions/io/emtfxml/metadata/magnetic.py,sha256=LaSiVNlZ5c-tsvMTxmbPAuATlR0EKT7R7olVGivNmdk,1807
176
176
  mt_metadata/transfer_functions/io/emtfxml/metadata/magnetometer.py,sha256=110rVKp3pWvtQkrOJFvp5K28KCPogPra6dGA8M1nzH4,1343
177
177
  mt_metadata/transfer_functions/io/emtfxml/metadata/orientation.py,sha256=57Vk4_pa6MrjzU18ifNXTr7GcCFK2w6sxosW7mzp5oI,2493
178
- mt_metadata/transfer_functions/io/emtfxml/metadata/period_range.py,sha256=zLKeWDk2HibmWW42vLsZjN3XSqipYLmAU2MRL-W8TlI,1633
178
+ mt_metadata/transfer_functions/io/emtfxml/metadata/period_range.py,sha256=SE4ZpK2kpDDbtu3pQRWPlLVvd4dUm8zxeYNeDeM87Vg,1709
179
179
  mt_metadata/transfer_functions/io/emtfxml/metadata/person.py,sha256=tawfhoVOZ35sjjwEVSDOmL49_1V0n32mHMSfmvtmzjA,830
180
180
  mt_metadata/transfer_functions/io/emtfxml/metadata/primary_data.py,sha256=m83_SmZxE_t9CwgPmInv6fUKwbtzr_QQNxr9I6MA0QE,1018
181
181
  mt_metadata/transfer_functions/io/emtfxml/metadata/processing_info.py,sha256=5ZO2nMSBliB_ILBbIzk_CpoqP4bOHxEOhOYVJo9f3n8,3208
182
- mt_metadata/transfer_functions/io/emtfxml/metadata/provenance.py,sha256=ETKGfNO_pXJvfNJimtuGUceuQECiOMWjeSgqRejmQks,2425
182
+ mt_metadata/transfer_functions/io/emtfxml/metadata/provenance.py,sha256=QkF5NFT1DA2u21iBVR0Bzc5FQtrYsO2-uEvYnnXzJws,2460
183
183
  mt_metadata/transfer_functions/io/emtfxml/metadata/remote_info.py,sha256=cx_bvR2Oy2uXnAm20i-AC_cr-xO1WkfncTJz0vtxNPU,2291
184
184
  mt_metadata/transfer_functions/io/emtfxml/metadata/remote_ref.py,sha256=DJYXIkGdHCXDHW5eDiDvj6_h1sg4YbbyQnV_wTtNSgQ,1724
185
185
  mt_metadata/transfer_functions/io/emtfxml/metadata/run.py,sha256=AtcPoAHn6FPoPitwjXuJGRnjwgvVJBgBIO4wlOGVCT8,4848
@@ -192,7 +192,7 @@ mt_metadata/transfer_functions/io/emtfxml/metadata/standards/attachment.json,sha
192
192
  mt_metadata/transfer_functions/io/emtfxml/metadata/standards/channels.json,sha256=cSc7GIT8GYVxDCETrFOu-HLnaGqRYUA9aWU5ngTD0Jg,565
193
193
  mt_metadata/transfer_functions/io/emtfxml/metadata/standards/citation.json,sha256=L_NXO3zbJGEM31ePsaZCtaV8TjWbrrVNHHY2nalEMMs,2269
194
194
  mt_metadata/transfer_functions/io/emtfxml/metadata/standards/comment.json,sha256=E9_GO681t7OZTOctGrDm7QaujS2VY7HEha76CjY3avo,880
195
- mt_metadata/transfer_functions/io/emtfxml/metadata/standards/copyright.json,sha256=RQa2d0cAublDfRV01NTguLY90qSH0lJMBF0Ve9wXYgg,2477
195
+ mt_metadata/transfer_functions/io/emtfxml/metadata/standards/copyright.json,sha256=eYj5YnKa6e2bX4GLzdrY3xS8CN7nO6UdcQW4UsUp4RU,2516
196
196
  mt_metadata/transfer_functions/io/emtfxml/metadata/standards/data_quality_notes.json,sha256=VBIMMzIgPFKMNLMQ1YB1m2ysg-IoFmen_LYsCXQqxMo,942
197
197
  mt_metadata/transfer_functions/io/emtfxml/metadata/standards/data_quality_warnings.json,sha256=afT-uIAwKNM5SsumxANsICXOe_Zz_Ttpn9RHK461oRs,273
198
198
  mt_metadata/transfer_functions/io/emtfxml/metadata/standards/data_type.json,sha256=wd_8NSn7biExKr8GEOCu95KasmbIzJf3ushAkRkWAuk,2995
@@ -278,15 +278,15 @@ mt_metadata/transfer_functions/processing/__init__.py,sha256=frcCV1k9oG9oKj3dpUq
278
278
  mt_metadata/transfer_functions/processing/aurora/__init__.py,sha256=5ALxSEnzNkITVvK4yPCoadLdCv_VNnr3UuvVDOu92Ck,646
279
279
  mt_metadata/transfer_functions/processing/aurora/band.py,sha256=mNDkpJQbf7F7aF-FFma2zfUj2foiwNoTNkG-i3pwIUo,8355
280
280
  mt_metadata/transfer_functions/processing/aurora/channel.py,sha256=TZHfy-XgrijdNVd4Sjbq3tjORFsJNZIzwa4_J7tDOHM,773
281
- mt_metadata/transfer_functions/processing/aurora/channel_nomenclature.py,sha256=IP-jS00Vit7tr477SZCjBO3u19lfzFDdt5d1akb4mDg,4350
281
+ mt_metadata/transfer_functions/processing/aurora/channel_nomenclature.py,sha256=Y7rQTH3YsTB8KFIMk6vQZWFrRKQWlnwoQNZOZjZImbk,3038
282
282
  mt_metadata/transfer_functions/processing/aurora/decimation.py,sha256=AF7vdU-Q7W4yfnJoPDbhDqgxJTtHiLCLEUDLBEzfmFM,785
283
283
  mt_metadata/transfer_functions/processing/aurora/decimation_level.py,sha256=cZhV9BPM7kj3qSDg7HCM2vyV7VW1-jWOTE7ISASKRsA,10657
284
284
  mt_metadata/transfer_functions/processing/aurora/estimator.py,sha256=9I2Rs3guO7sc9HEpLbYI8nYZfQ7IayosKvsrE6etBac,781
285
285
  mt_metadata/transfer_functions/processing/aurora/processing.py,sha256=BCKXGu_iVValVyE0EbsR9_gYkwv0I4GxS61AqXUtc8s,10320
286
286
  mt_metadata/transfer_functions/processing/aurora/regression.py,sha256=NIgivJx11-ZVsVfQgdIODfsPeyMPmhRXA6bSNiarA8c,783
287
287
  mt_metadata/transfer_functions/processing/aurora/run.py,sha256=DxpKHdNRGaE4VPqzVnue9NMF6PPd3kAPHKEkv7t2xzA,4123
288
- mt_metadata/transfer_functions/processing/aurora/station.py,sha256=q9IQBWwwXF47AsBJuwbTIdkAivIks1dCqN8cqLzRZjw,5163
289
- mt_metadata/transfer_functions/processing/aurora/stations.py,sha256=jZ8_oTIPymbYX6I3OUDN2BmOoDlNJeZBcVadY39un4o,4564
288
+ mt_metadata/transfer_functions/processing/aurora/station.py,sha256=TokM12LFlcTnNHaXHId8Lj5Ie1kwmx6dWRkFfAj1SVE,5236
289
+ mt_metadata/transfer_functions/processing/aurora/stations.py,sha256=lbRs80-zL0jmIB7ISVczu61Rt_vxl99cBXJ4gP0TBT8,4552
290
290
  mt_metadata/transfer_functions/processing/aurora/window.py,sha256=Z96nK50Fg00KkCKNVC08E-6bCoMe2uF_6agF5rQf9Vo,1210
291
291
  mt_metadata/transfer_functions/processing/aurora/standards/__init__.py,sha256=Y3rdyXKOgxbSh9FQxQCCplsbqxwWmFIGm6yZG1cj0Uw,135
292
292
  mt_metadata/transfer_functions/processing/aurora/standards/band.json,sha256=duX9-GpjopKdccxgLYfCBhhw2j28oTRmV_mCuN5cl2o,2105
@@ -298,7 +298,7 @@ mt_metadata/transfer_functions/processing/aurora/standards/decimation.json,sha25
298
298
  mt_metadata/transfer_functions/processing/aurora/standards/decimation_level.json,sha256=YD6kCi0OmSLBv-v5Vf6L-pEJcLgW7ImA0he7aHJFRhA,4176
299
299
  mt_metadata/transfer_functions/processing/aurora/standards/estimator.json,sha256=NPzjnTLuq11xGMYK9F6WGlj-dI2nwWN_jXD-ArJJqy4,628
300
300
  mt_metadata/transfer_functions/processing/aurora/standards/processing.json,sha256=UEItryn1KidAsBnXNu3YyqoR2b51N0aSPlJrIDG5cmU,1211
301
- mt_metadata/transfer_functions/processing/aurora/standards/regression.json,sha256=jVy4T-yRuHGkL0LZQdcLgYUZoFOvH4PHHS9nuCdMfeA,901
301
+ mt_metadata/transfer_functions/processing/aurora/standards/regression.json,sha256=wAME7-4SiTVptXn4spdTAMq9-G6Rtm1Pk9PqMVKSEkE,2186
302
302
  mt_metadata/transfer_functions/processing/aurora/standards/run.json,sha256=o4Oe3QrWH7g1r8Z4cRQMk0bTf9Tp02dMLpVPER7QI5I,1423
303
303
  mt_metadata/transfer_functions/processing/aurora/standards/station.json,sha256=kVlj3AVKs3rbLPnTZkPPaBoMthpZVJkz4JoO0q4z0us,1173
304
304
  mt_metadata/transfer_functions/processing/aurora/standards/stations.json,sha256=-ZAipnSnZ3IT4fUgsHt9xUTA_yPA_lN3i9p4nHfZcrs,276
@@ -326,13 +326,13 @@ mt_metadata/transfer_functions/tf/standards/transfer_function.json,sha256=yTPACc
326
326
  mt_metadata/utils/__init__.py,sha256=5TWhar2ujJY_pYkwDdggX8jU9CFXcxc9jX1yXc8TqJs,35
327
327
  mt_metadata/utils/exceptions.py,sha256=PKWdjKfR95NJ-Rgx3rzu9Qmdj0thVHjcmEvHoC9HuBE,462
328
328
  mt_metadata/utils/list_dict.py,sha256=BguxnQuNPf8aOMwULaaam22L4RUQ3SNzIkLqVh_gUQs,7668
329
- mt_metadata/utils/mttime.py,sha256=6XRIlY6eaSwLqNnRTeaDraQz4sk0PN27Z7z6BMeZkbk,18719
329
+ mt_metadata/utils/mttime.py,sha256=v71TCPjtoY_0GTsJ39WCD8kwIZDNzE679m96a3QGgPE,18725
330
330
  mt_metadata/utils/summarize.py,sha256=KisJt2PWz1-_FOBH8NQtidgxjdWPAbIDwPzEB197uhs,4109
331
331
  mt_metadata/utils/units.py,sha256=OdALLmytoPvjJ8rYf7QsGq1b8nrNt85A8wUhjqRyTOo,6405
332
- mt_metadata/utils/validators.py,sha256=vj55VvH11A0H9SeUcVy9lJCDKNzwCiMTSra-_Ws1Ojk,16264
333
- mt_metadata-0.3.6.dist-info/AUTHORS.rst,sha256=3RKy4std2XZQLNF6xYIiA8S5A0bBPqNO7ypJsuEhiN8,706
334
- mt_metadata-0.3.6.dist-info/LICENSE,sha256=P33RkFPriIBxsgZtVzSn9KxYa2K7Am42OwMV0h_m5e0,1080
335
- mt_metadata-0.3.6.dist-info/METADATA,sha256=CAeW-Ubcinln-nM11WkLXHM-eJj5H8Yg_e8RwQQfoI4,17286
336
- mt_metadata-0.3.6.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
337
- mt_metadata-0.3.6.dist-info/top_level.txt,sha256=fxe_q_GEd9h6iR3050ZnrhSfxUSO5pR8u65souS4RWM,12
338
- mt_metadata-0.3.6.dist-info/RECORD,,
332
+ mt_metadata/utils/validators.py,sha256=jQf0VBtfT5GMXlEUI5Hg1zILqSir9Ra4Moi4dL54KeM,16380
333
+ mt_metadata-0.3.7.dist-info/AUTHORS.rst,sha256=3RKy4std2XZQLNF6xYIiA8S5A0bBPqNO7ypJsuEhiN8,706
334
+ mt_metadata-0.3.7.dist-info/LICENSE,sha256=P33RkFPriIBxsgZtVzSn9KxYa2K7Am42OwMV0h_m5e0,1080
335
+ mt_metadata-0.3.7.dist-info/METADATA,sha256=dCuqaycFVp396z1u2LdlwnYTOI36qMNpu5i8sfk8_vI,20438
336
+ mt_metadata-0.3.7.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
337
+ mt_metadata-0.3.7.dist-info/top_level.txt,sha256=fxe_q_GEd9h6iR3050ZnrhSfxUSO5pR8u65souS4RWM,12
338
+ mt_metadata-0.3.7.dist-info/RECORD,,