pygmi 2.2.7__zip

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.
Files changed (106) hide show
  1. pygmi-2.2.7/LICENSE.txt +623 -0
  2. pygmi-2.2.7/MANIFEST.in +7 -0
  3. pygmi-2.2.7/PKG-INFO +47 -0
  4. pygmi-2.2.7/README.md +55 -0
  5. pygmi-2.2.7/README.rst +20 -0
  6. pygmi-2.2.7/log.txt +242 -0
  7. pygmi-2.2.7/pygmi/__init__.py +22 -0
  8. pygmi-2.2.7/pygmi/clust/__init__.py +4 -0
  9. pygmi-2.2.7/pygmi/clust/crisp_clust.py +708 -0
  10. pygmi-2.2.7/pygmi/clust/datatypes.py +65 -0
  11. pygmi-2.2.7/pygmi/clust/fuzzy_clust.py +906 -0
  12. pygmi-2.2.7/pygmi/clust/graphs.py +421 -0
  13. pygmi-2.2.7/pygmi/clust/graphtool.py +667 -0
  14. pygmi-2.2.7/pygmi/clust/menu.py +139 -0
  15. pygmi-2.2.7/pygmi/clust/var_ratio.py +92 -0
  16. pygmi-2.2.7/pygmi/clust/xie_beni.py +93 -0
  17. pygmi-2.2.7/pygmi/helpdocs/linepointer.png +0 -0
  18. pygmi-2.2.7/pygmi/helpdocs/pygmi.main.html +31 -0
  19. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.ddisp.html +15 -0
  20. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.iodefs.exportkmz.html +13 -0
  21. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.iodefs.importpicture.html +16 -0
  22. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.layer.html +17 -0
  23. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.mext.html +44 -0
  24. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.misc.rangedcopy.html +16 -0
  25. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.param.html +37 -0
  26. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.prof.html +32 -0
  27. pygmi-2.2.7/pygmi/helpdocs/pygmi.pfmod.pview.html +26 -0
  28. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.cooper.gradients.html +14 -0
  29. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.cooper.tilt.html +14 -0
  30. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.cooper.visibility.html +14 -0
  31. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.dataprep.datagrid.html +13 -0
  32. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.dataprep.datamerge.html +11 -0
  33. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.dataprep.datareproj.html +11 -0
  34. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.dataprep.rtp.html +14 -0
  35. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.ginterp.html +31 -0
  36. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.igrf.html +20 -0
  37. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.normalisation.html +14 -0
  38. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.smooth.html +22 -0
  39. pygmi-2.2.7/pygmi/helpdocs/pygmi.raster.tiltdepth.html +20 -0
  40. pygmi-2.2.7/pygmi/images/Help.png +0 -0
  41. pygmi-2.2.7/pygmi/images/bringtofront.png +0 -0
  42. pygmi-2.2.7/pygmi/images/cgs2.emf +0 -0
  43. pygmi-2.2.7/pygmi/images/delete.png +0 -0
  44. pygmi-2.2.7/pygmi/images/linepointer.png +0 -0
  45. pygmi-2.2.7/pygmi/images/logo256.ico +0 -0
  46. pygmi-2.2.7/pygmi/images/logo256.png +0 -0
  47. pygmi-2.2.7/pygmi/images/pointer.png +0 -0
  48. pygmi-2.2.7/pygmi/images/pygmi.png +0 -0
  49. pygmi-2.2.7/pygmi/images/sendtoback.png +0 -0
  50. pygmi-2.2.7/pygmi/main.py +1037 -0
  51. pygmi-2.2.7/pygmi/menu_default.py +327 -0
  52. pygmi-2.2.7/pygmi/misc.py +147 -0
  53. pygmi-2.2.7/pygmi/pfmod/__init__.py +6 -0
  54. pygmi-2.2.7/pygmi/pfmod/cubes.py +1488 -0
  55. pygmi-2.2.7/pygmi/pfmod/datatypes.py +292 -0
  56. pygmi-2.2.7/pygmi/pfmod/grvmag3d.py +1265 -0
  57. pygmi-2.2.7/pygmi/pfmod/iodefs.py +1001 -0
  58. pygmi-2.2.7/pygmi/pfmod/menu.py +107 -0
  59. pygmi-2.2.7/pygmi/pfmod/misc.py +301 -0
  60. pygmi-2.2.7/pygmi/pfmod/pfmod.py +248 -0
  61. pygmi-2.2.7/pygmi/pfmod/tab_ddisp.py +425 -0
  62. pygmi-2.2.7/pygmi/pfmod/tab_layer.py +490 -0
  63. pygmi-2.2.7/pygmi/pfmod/tab_mext.py +544 -0
  64. pygmi-2.2.7/pygmi/pfmod/tab_param.py +548 -0
  65. pygmi-2.2.7/pygmi/pfmod/tab_prof.py +946 -0
  66. pygmi-2.2.7/pygmi/pfmod/tab_pview.py +740 -0
  67. pygmi-2.2.7/pygmi/raster/IGRF11.COF +1635 -0
  68. pygmi-2.2.7/pygmi/raster/__init__.py +14 -0
  69. pygmi-2.2.7/pygmi/raster/cooper.py +718 -0
  70. pygmi-2.2.7/pygmi/raster/dataprep.py +1640 -0
  71. pygmi-2.2.7/pygmi/raster/datatypes.py +123 -0
  72. pygmi-2.2.7/pygmi/raster/equation_editor.py +256 -0
  73. pygmi-2.2.7/pygmi/raster/ginterp.py +1901 -0
  74. pygmi-2.2.7/pygmi/raster/graphs.py +531 -0
  75. pygmi-2.2.7/pygmi/raster/igrf.py +860 -0
  76. pygmi-2.2.7/pygmi/raster/iodefs.py +813 -0
  77. pygmi-2.2.7/pygmi/raster/menu.py +307 -0
  78. pygmi-2.2.7/pygmi/raster/normalisation.py +187 -0
  79. pygmi-2.2.7/pygmi/raster/show_table.py +245 -0
  80. pygmi-2.2.7/pygmi/raster/smooth.py +406 -0
  81. pygmi-2.2.7/pygmi/raster/tiltdepth.py +590 -0
  82. pygmi-2.2.7/pygmi/seis/__init__.py +0 -0
  83. pygmi-2.2.7/pygmi/seis/beachball.py +751 -0
  84. pygmi-2.2.7/pygmi/seis/datatypes.py +605 -0
  85. pygmi-2.2.7/pygmi/seis/del_rec.py +410 -0
  86. pygmi-2.2.7/pygmi/seis/iodefs.py +1261 -0
  87. pygmi-2.2.7/pygmi/seis/menu.py +136 -0
  88. pygmi-2.2.7/pygmi/seis/scan_imp.py +795 -0
  89. pygmi-2.2.7/pygmi/test/__init__.py +6 -0
  90. pygmi-2.2.7/pygmi/test/pfmod.py +212 -0
  91. pygmi-2.2.7/pygmi/test/tests.py +39 -0
  92. pygmi-2.2.7/pygmi/vector/__init__.py +7 -0
  93. pygmi-2.2.7/pygmi/vector/datatypes.py +74 -0
  94. pygmi-2.2.7/pygmi/vector/graphs.py +443 -0
  95. pygmi-2.2.7/pygmi/vector/iodefs.py +345 -0
  96. pygmi-2.2.7/pygmi/vector/menu.py +127 -0
  97. pygmi-2.2.7/pygmi.egg-info/PKG-INFO +47 -0
  98. pygmi-2.2.7/pygmi.egg-info/SOURCES.txt +105 -0
  99. pygmi-2.2.7/pygmi.egg-info/dependency_links.txt +1 -0
  100. pygmi-2.2.7/pygmi.egg-info/entry_points.txt +3 -0
  101. pygmi-2.2.7/pygmi.egg-info/not-zip-safe +1 -0
  102. pygmi-2.2.7/pygmi.egg-info/requires.txt +7 -0
  103. pygmi-2.2.7/pygmi.egg-info/top_level.txt +1 -0
  104. pygmi-2.2.7/quickstart.py +35 -0
  105. pygmi-2.2.7/setup.cfg +8 -0
  106. pygmi-2.2.7/setup.py +80 -0
@@ -0,0 +1,1261 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Name: iodefs.py (part of PyGMI)
3
+ #
4
+ # Author: Patrick Cole
5
+ # E-Mail: pcole@geoscience.org.za
6
+ #
7
+ # Copyright: (c) 2013 Council for Geoscience
8
+ # Licence: GPL-3.0
9
+ #
10
+ # This file is part of PyGMI
11
+ #
12
+ # PyGMI is free software: you can redistribute it and/or modify
13
+ # it under the terms of the GNU General Public License as published by
14
+ # the Free Software Foundation, either version 3 of the License, or
15
+ # (at your option) any later version.
16
+ #
17
+ # PyGMI is distributed in the hope that it will be useful,
18
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ # GNU General Public License for more details.
21
+ #
22
+ # You should have received a copy of the GNU General Public License
23
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
24
+ # -----------------------------------------------------------------------------
25
+ """ Import Data """
26
+
27
+ from PyQt4 import QtGui
28
+ import numpy as np
29
+ import os
30
+ import re
31
+ from . import datatypes as sdt
32
+
33
+
34
+ def str2float(inp):
35
+ """
36
+ Converts a set number of columns to float, or returns None
37
+
38
+ Parameters
39
+ ----------
40
+ inp : str
41
+ string with a list of floats in it
42
+
43
+ Returns
44
+ -------
45
+ output : float
46
+ all columns returned as floats
47
+ """
48
+ if inp.strip() == '':
49
+ return None
50
+ return float(inp)
51
+
52
+
53
+ def str2int(inp):
54
+ """
55
+ Converts a set number of columns to integer, or returns None
56
+
57
+ Parameters
58
+ ----------
59
+ inp : str
60
+ string with a list of floats in it
61
+
62
+ Returns
63
+ -------
64
+ output : float
65
+ all columns returned as integers
66
+ """
67
+ if inp.strip() == '':
68
+ return None
69
+ return int(inp)
70
+
71
+
72
+ class ImportSeisan(object):
73
+ """ Import Seisan Data """
74
+ def __init__(self, parent=None):
75
+ self.ifile = ""
76
+ self.name = "Import Seisan Data"
77
+ self.ext = ""
78
+ self.pbar = None
79
+ self.parent = parent
80
+ self.indata = {}
81
+ self.outdata = {}
82
+
83
+ def settings(self):
84
+ """ Settings """
85
+ ext = \
86
+ "Seisan Format (*.out);;" +\
87
+ "All Files (*.*)"
88
+
89
+ filename = QtGui.QFileDialog.getOpenFileName(
90
+ self.parent, 'Open File', '.', ext)
91
+ if filename == '':
92
+ return False
93
+ os.chdir(filename.rpartition('/')[0])
94
+
95
+ self.ifile = str(filename)
96
+ self.ext = filename[-3:]
97
+
98
+ pntfile = open(filename)
99
+ ltmp = pntfile.readlines()
100
+ pntfile.close()
101
+
102
+ if len(ltmp[0]) < 80:
103
+ self.parent.showprocesslog('Error: Problem with file')
104
+ return False
105
+
106
+ # This constructs a dictionary of functions
107
+ read_record_type = {}
108
+ read_record_type['1'] = read_record_type_1
109
+ read_record_type['2'] = read_record_type_2
110
+ read_record_type['4'] = read_record_type_4
111
+ read_record_type['5'] = read_record_type_5
112
+ read_record_type['6'] = read_record_type_6
113
+ read_record_type['E'] = read_record_type_e
114
+ read_record_type['F'] = read_record_type_f
115
+ read_record_type['H'] = read_record_type_h
116
+ read_record_type['I'] = read_record_type_i
117
+ read_record_type['M'] = read_record_type_m
118
+ read_record_type['P'] = read_record_type_p
119
+
120
+ event = {}
121
+ event['4'] = []
122
+ event['F'] = {}
123
+ dat = []
124
+
125
+ for i in ltmp:
126
+ if i.strip() == '':
127
+ if len(event) > 0:
128
+ dat.append(event)
129
+ event = {}
130
+ event['4'] = []
131
+ event['F'] = {}
132
+ continue
133
+
134
+ ltype = i[79]
135
+
136
+ if ltype == '1' and event.get('1') is not None:
137
+ continue
138
+
139
+ if ltype == '7' or ltype == '3':
140
+ continue
141
+
142
+ if ltype == ' ':
143
+ ltype = '4'
144
+
145
+ if ltype == 'F':
146
+ event[ltype].update(read_record_type[ltype](i))
147
+ elif ltype == '4':
148
+ event[ltype].append(read_record_type[ltype](i))
149
+ elif ltype == 'M' and event.get('M') is not None:
150
+ event[ltype] = read_record_type[ltype](i, event[ltype])
151
+ else:
152
+ event[ltype] = read_record_type[ltype](i)
153
+
154
+ if len(event) > 0:
155
+ dat.append(event)
156
+
157
+ self.outdata['Seis'] = dat
158
+ return True
159
+
160
+
161
+ def read_record_type_1(i):
162
+ """ Reads record type 1"""
163
+
164
+ tmp = sdt.seisan_1()
165
+ tmp.year = str2int(i[1:5])
166
+ tmp.month = str2int(i[6:8])
167
+ tmp.day = str2int(i[8:10])
168
+ tmp.fixed_origin_time = i[10]
169
+ tmp.hour = str2int(i[11:13])
170
+ tmp.minutes = str2int(i[13:15])
171
+ tmp.seconds = str2float(i[16:20])
172
+ tmp.location_model_indicator = i[20]
173
+ tmp.distance_indicator = i[21]
174
+ tmp.event_id = i[22]
175
+ tmp.latitude = str2float(i[23:30])
176
+ tmp.longitude = str2float(i[30:38])
177
+ tmp.depth = str2float(i[38:43])
178
+ tmp.depth_indicator = i[43]
179
+ tmp.locating_indicator = i[44]
180
+ tmp.hypocenter_reporting_agency = i[45:48]
181
+ tmp.number_of_stations_used = str2int(i[48:51])
182
+ tmp.rms_of_time_residuals = str2float(i[51:55])
183
+ tmp.magnitude_1 = str2float(i[55:59])
184
+ tmp.type_of_magnitude_1 = i[59]
185
+ tmp.magnitude_reporting_agency_1 = i[60:63]
186
+ tmp.magnitude_2 = str2float(i[63:67])
187
+ tmp.type_of_magnitude_2 = i[67]
188
+ tmp.magnitude_reporting_agency_2 = i[68:71]
189
+ tmp.magnitude_3 = str2float(i[71:75])
190
+ tmp.type_of_magnitude_3 = i[75]
191
+ tmp.magnitude_reporting_agency_3 = i[76:79]
192
+
193
+ return tmp
194
+
195
+
196
+ def read_record_type_2(i):
197
+ """ Reads record type 2"""
198
+
199
+ dat = sdt.seisan_2()
200
+ dat.description = i[5:20]
201
+ dat.diastrophism_code = i[21]
202
+ dat.tsunami_code = i[22]
203
+ dat.seiche_code = i[23]
204
+ dat.cultural_effects = i[24]
205
+ dat.unusual_events = i[25]
206
+ dat.max_intensity = str2int(i[27:29])
207
+ dat.max_intensity_qualifier = i[29]
208
+ dat.intensity_scale = i[30:32]
209
+ dat.macroseismic_latitude = str2float(i[33:39])
210
+ dat.macroseismic_longitude = str2float(i[40:47])
211
+ dat.macroseismic_magnitude = str2float(i[48:51])
212
+ dat.type_of_magnitude = i[51]
213
+ dat.log_of_felt_area_radius = str2float(i[52:56])
214
+ dat.log_of_area_1 = str2float(i[56:61])
215
+ dat.intensity_bordering_area_1 = str2int(i[61:63])
216
+ dat.log_of_area_2 = str2float(i[63:68])
217
+ dat.intensity_bordering_area_2 = str2int(i[68:70])
218
+ dat.quality_rank = i[71]
219
+ dat.reporting_agency = i[72:75]
220
+
221
+ return dat
222
+
223
+
224
+ def read_record_type_4(i):
225
+ """ Reads record type 4"""
226
+
227
+ tmp = sdt.seisan_4()
228
+
229
+ tmp.station_name = i[1:6]
230
+ tmp.instrument_type = i[6]
231
+ tmp.component = i[7]
232
+ tmp.quality = i[9]
233
+ tmp.phase_id = i[10:14]
234
+ tmp.weighting_indicator = str2int(i[14])
235
+ tmp.flag_auto_pick = i[15]
236
+ tmp.first_motion = i[16]
237
+ tmp.hour = str2int(i[18:20])
238
+ tmp.minutes = str2int(i[20:22])
239
+ tmp.seconds = str2float(i[22:28])
240
+ tmp.duration = str2int(i[29:33])
241
+ tmp.amplitude = str2float(i[33:40])
242
+ tmp.period = str2float(i[41:45])
243
+ tmp.direction_of_approach = str2float(i[46:51])
244
+ tmp.phase_velocity = str2float(i[52:56])
245
+ tmp.angle_of_incidence = str2float(i[56:60])
246
+ tmp.azimuth_residual = str2int(i[60:63])
247
+ tmp.travel_time_residual = str2float(i[63:68])
248
+ tmp.weight = str2int(i[68:70])
249
+ tmp.epicentral_distance = str2float(i[70:75])
250
+ tmp.azimuth_at_source = str2int(i[76:79])
251
+
252
+ return tmp
253
+
254
+
255
+ def read_record_type_5(i):
256
+ """ Reads record type 5"""
257
+
258
+ tmp = sdt.seisan_5()
259
+ tmp.text = i[1:79]
260
+ return tmp
261
+
262
+
263
+ def read_record_type_6(i):
264
+ """ Reads record type 6"""
265
+
266
+ tmp = sdt.seisan_6()
267
+ tmp.tracedata_files = i[1:79]
268
+
269
+ return tmp
270
+
271
+
272
+ def read_record_type_e(i):
273
+ """ Reads record type E"""
274
+
275
+ tmp = sdt.seisan_E()
276
+
277
+ tmp.gap = str2int(i[5:8])
278
+ tmp.origin_time_error = str2float(i[14:20])
279
+ tmp.latitude_error = str2float(i[24:30])
280
+ tmp.longitude_error = str2float(i[32:38])
281
+ tmp.depth_error = str2float(i[38:43])
282
+ tmp.cov_xy = str2float(i[43:55])
283
+ tmp.cov_xz = str2float(i[55:67])
284
+ tmp.cov_yz = str2float(i[67:79])
285
+
286
+ return tmp
287
+
288
+
289
+ def read_record_type_f(i):
290
+ """ Reads record type F"""
291
+
292
+ tmp = sdt.seisan_F()
293
+
294
+ tmp.program_used = i[70:77]
295
+ prg = tmp.program_used.strip()
296
+ tmp.strike = str2float(i[0:10])
297
+ tmp.dip = str2float(i[10:20])
298
+ tmp.rake = str2float(i[20:30])
299
+ if prg == 'FPFIT' or prg == 'HASH':
300
+ tmp.err1 = str2float(i[30:35])
301
+ tmp.err2 = str2float(i[35:40])
302
+ tmp.err3 = str2float(i[40:45])
303
+ tmp.fit_error = str2float(i[45:50])
304
+ tmp.station_distribution_ratio = str2float(i[50:55])
305
+ if prg == 'FOCMEC' or prg == 'HASH':
306
+ tmp.amplitude_ratio = str2float(i[55:60])
307
+ if prg == 'FOCMEC' or prg == 'PINV':
308
+ tmp.number_of_bad_polarities = str2int(i[60:62])
309
+ if prg == 'FOCMEC':
310
+ tmp.number_of_bad_amplitude_ratios = str2int(i[63:65])
311
+ tmp.agency_code = i[66:69]
312
+ tmp.solution_quality = i[77]
313
+
314
+ if prg == '':
315
+ out = {}
316
+ else:
317
+ out = {prg: tmp}
318
+
319
+ return out
320
+
321
+
322
+ def read_record_type_h(i):
323
+ """ Reads record type H"""
324
+
325
+ tmp = sdt.seisan_H()
326
+ tmp.year = str2int(i[1:5])
327
+ tmp.month = str2int(i[6:8])
328
+ tmp.day = str2int(i[8:10])
329
+ tmp.fixed_origin_time = i[10]
330
+ tmp.hour = str2int(i[11:13])
331
+ tmp.minutes = str2int(i[13:15])
332
+ tmp.seconds = str2float(i[16:22])
333
+ tmp.latitude = str2float(i[23:32])
334
+ tmp.longitude = str2float(i[33:43])
335
+ tmp.depth = str2float(i[44:52])
336
+ tmp.rms = str2float(i[53:59])
337
+
338
+ return tmp
339
+
340
+
341
+ def read_record_type_i(i):
342
+ """ Reads record type I"""
343
+
344
+ tmp = sdt.seisan_I()
345
+
346
+ tmp.last_action_done = i[8:11]
347
+ tmp.date_time_of_last_action = i[12:26]
348
+ tmp.operator = i[30:35]
349
+ tmp.status = i[42:57]
350
+ tmp.id = i[60:74]
351
+ tmp.new_id_created = i[74]
352
+ tmp.id_locked = i[75]
353
+
354
+ return tmp
355
+
356
+
357
+ def read_record_type_m(i, vtmp=None):
358
+ """ Reads record type M"""
359
+
360
+ if i[1:3] is not 'MT':
361
+ tmp = sdt.seisan_M()
362
+ tmp.year = i[1:5]
363
+ tmp.month = i[6:8]
364
+ tmp.day = i[8:10]
365
+ tmp.hour = i[11:13]
366
+ tmp.minutes = i[13:15]
367
+ tmp.seconds = i[16:20]
368
+ tmp.latitude = i[23:30]
369
+ tmp.longitude = i[30:38]
370
+ tmp.depth = i[38:43]
371
+ tmp.reporting_agency = i[45:48]
372
+ tmp.magnitude = i[55:59]
373
+ tmp.magnitude_type = i[59]
374
+ tmp.magnitude_reporting_agency = i[60:63]
375
+ tmp.method_used = i[70:77]
376
+ tmp.quality = i[77]
377
+ else:
378
+ tmp = vtmp['M']
379
+ tmp.mrr_mzz = i[3:9]
380
+ tmp.mtt_mxx = i[10:16]
381
+ tmp.mpp_myy = i[17:23]
382
+ tmp.mrt_mzx = i[24:30]
383
+ tmp.mrp_mzy = i[31:37]
384
+ tmp.mtp_mxy = i[38:44]
385
+ tmp.reporting_agency2 = i[45:48]
386
+ tmp.mt_coordinate_system = i[48]
387
+ tmp.exponential = i[49:51]
388
+ tmp.scalar_moment = i[52:62]
389
+ tmp.method_used_2 = i[70:77]
390
+ tmp.quality_2 = i[77]
391
+
392
+ return tmp
393
+
394
+
395
+ def read_record_type_p(i):
396
+ """ Reads record type P"""
397
+
398
+ tmp = sdt.seisan_P()
399
+ tmp.filename = i[1:79]
400
+ return tmp
401
+
402
+
403
+ class ImportGenericFPS(object):
404
+ """
405
+ Import Generic Fault Plane Solution Data. This is stored in a csv file.
406
+ """
407
+ def __init__(self, parent=None):
408
+ self.ifile = ""
409
+ self.name = "Import Generic FPS: "
410
+ self.ext = ""
411
+ self.pbar = None
412
+ self.parent = parent
413
+ self.indata = {}
414
+ self.outdata = {}
415
+
416
+ def settings(self):
417
+ """ Settings """
418
+ QtGui.QMessageBox.information(self.parent, 'File Format',
419
+ 'The file should have the following'
420
+ ' columns: longitude, latitude, strike,'
421
+ ' dip, rake, magnitude.')
422
+
423
+ ext = \
424
+ "Comma Delimeted Text (*.csv);;" +\
425
+ "All Files (*.*)"
426
+
427
+ filename = QtGui.QFileDialog.getOpenFileName(
428
+ self.parent, 'Open File', '.', ext)
429
+ if filename == '':
430
+ return False
431
+ os.chdir(filename.rpartition('/')[0])
432
+
433
+ self.ifile = str(filename)
434
+ self.ext = filename[-3:]
435
+
436
+ dlim = ','
437
+
438
+ pntfile = open(filename)
439
+ ltmp = pntfile.readline()
440
+ pntfile.close()
441
+
442
+ isheader = any(c.isalpha() for c in ltmp)
443
+
444
+ srows = 0
445
+ ltmp = ltmp.split(dlim)
446
+ if isheader:
447
+ srows = 1
448
+ else:
449
+ ltmp = [str(c) for c in range(len(ltmp))]
450
+
451
+ try:
452
+ datatmp = np.loadtxt(filename, delimiter=dlim, skiprows=srows)
453
+ except ValueError:
454
+ QtGui.QMessageBox.critical(self.parent, 'Import Error',
455
+ 'There was a problem loading the file.'
456
+ ' You may have a text character in one'
457
+ ' of your columns.')
458
+ return False
459
+
460
+ dat = []
461
+ for i in datatmp:
462
+ event = {}
463
+ tmp = sdt.seisan_1()
464
+ tmp.longitude = i[0]
465
+ tmp.latitude = i[1]
466
+ tmp.magnitude_1 = i[-1]
467
+ event['1'] = tmp
468
+
469
+ tmp = sdt.seisan_F()
470
+ tmp.program_used = 'Generic'
471
+ tmp.strike = i[2]
472
+ tmp.dip = i[3]
473
+ tmp.rake = i[4]
474
+ event['F'] = {}
475
+ event['F']['Generic'] = tmp
476
+ dat.append(event)
477
+
478
+ self.outdata['Seis'] = dat
479
+
480
+ return True
481
+
482
+
483
+ class ExportSeisan(object):
484
+ """ Export Seisan Data """
485
+ def __init__(self, parent):
486
+ self.ifile = ""
487
+ self.name = "Export Seisan Data "
488
+ self.ext = ""
489
+ self.pbar = None
490
+ self.parent = parent
491
+ self.indata = {}
492
+ self.outdata = {}
493
+ self.lmod = None
494
+ self.fobj = None
495
+ # self.dirname = ""
496
+ self.showtext = self.parent.showprocesslog
497
+
498
+ def run(self):
499
+ """ Show Info """
500
+ if 'Seis' not in self.indata:
501
+ self.parent.showprocesslog(
502
+ 'Error: You need to have a Seisan data first!')
503
+ return
504
+
505
+ data = self.indata['Seis']
506
+
507
+ filename = QtGui.QFileDialog.getSaveFileName(self.parent, 'Save File',
508
+ '.', 'sei (*.sei)')
509
+
510
+ if filename == '':
511
+ return
512
+
513
+ os.chdir(filename.rpartition('/')[0])
514
+ # ofile = str(filename.rpartition('/')[-1][:-4])
515
+ self.ext = filename[-3:]
516
+
517
+ self.fobj = open(filename, 'w')
518
+
519
+ for i in data:
520
+ self.write_record_type_1(i)
521
+ self.write_record_type_f(i) # This is missing some #3 recs
522
+ self.write_record_type_m(i) # This is missing some #3 recs
523
+ self.write_record_type_e(i)
524
+ self.write_record_type_i(i) # This is missing some #3 recs
525
+ # self.write_record_type_3(i)
526
+ self.write_record_type_4(i)
527
+ self.fobj.write(' \n')
528
+
529
+ self.fobj.close()
530
+
531
+ def write_record_type_1(self, data):
532
+ """ Writes record type 1"""
533
+ if '1' not in data:
534
+ return
535
+ else:
536
+ dat = data['1']
537
+ tmp = ' '*80+'\n'
538
+ tmp = sform('{0:4d}', dat.year, tmp, 2, 5)
539
+ tmp = sform('{0:2d}', dat.month, tmp, 7, 8)
540
+ tmp = sform('{0:2d}', dat.day, tmp, 9, 10)
541
+ tmp = sform('{0:1s}', dat.fixed_origin_time, tmp, 11)
542
+ tmp = sform('{0:2d}', dat.hour, tmp, 12, 13)
543
+ tmp = sform('{0:2d}', dat.minutes, tmp, 14, 15)
544
+ tmp = sform('{0:4.1f}', dat.seconds, tmp, 17, 20)
545
+ tmp = sform('{0:1s}', dat.location_model_indicator, tmp, 21)
546
+ tmp = sform('{0:1s}', dat.distance_indicator, tmp, 22)
547
+ tmp = sform('{0:1s}', dat.event_id, tmp, 23)
548
+ tmp = sform('{0:7.3f}', dat.latitude, tmp, 24, 30)
549
+ tmp = sform('{0:8.3f}', dat.longitude, tmp, 31, 38)
550
+ tmp = sform('{0:5.1f}', dat.depth, tmp, 39, 43)
551
+ tmp = sform('{0:1s}', dat.depth_indicator, tmp, 44)
552
+ tmp = sform('{0:1s}', dat.locating_indicator, tmp, 45)
553
+ tmp = sform('{0:3s}', dat.hypocenter_reporting_agency, tmp, 46, 48)
554
+ tmp = sform('{0:3d}', dat.number_of_stations_used, tmp, 49, 51)
555
+ tmp = sform('{0:4.1f}', dat.rms_of_time_residuals, tmp, 52, 55)
556
+ tmp = sform('{0:4.1f}', dat.magnitude_1, tmp, 56, 59)
557
+ tmp = sform('{0:1s}', dat.type_of_magnitude_1, tmp, 60)
558
+ tmp = sform('{0:3s}', dat.magnitude_reporting_agency_1, tmp, 61, 63)
559
+ tmp = sform('{0:4.1f}', dat.magnitude_2, tmp, 64, 67)
560
+ tmp = sform('{0:1s}', dat.type_of_magnitude_2, tmp, 68)
561
+ tmp = sform('{0:3s}', dat.magnitude_reporting_agency_2, tmp, 69, 71)
562
+ tmp = sform('{0:4.1f}', dat.magnitude_3, tmp, 72, 75)
563
+ tmp = sform('{0:1s}', dat.type_of_magnitude_3, tmp, 76, 76)
564
+ tmp = sform('{0:3s}', dat.magnitude_reporting_agency_3, tmp, 77, 79)
565
+ tmp = sform('{0:1s}', '1', tmp, 80)
566
+
567
+ self.fobj.write(tmp)
568
+
569
+ def write_record_type_2(self, data):
570
+ """ Writes record type 2"""
571
+ if '2' not in data:
572
+ return
573
+ else:
574
+ dat = data['2']
575
+
576
+ tmp = ' '*80+'\n'
577
+ tmp = sform('{0:15s}', dat.description, tmp, 6, 20)
578
+ tmp = sform('{0:1s}', dat.diastrophism_code, tmp, 22)
579
+ tmp = sform('{0:1s}', dat.tsunami_code, tmp, 23)
580
+ tmp = sform('{0:1s}', dat.seiche_code, tmp, 24)
581
+ tmp = sform('{0:1s}', dat.cultural_effects, tmp, 25)
582
+ tmp = sform('{0:1s}', dat.unusual_events, tmp, 26)
583
+ tmp = sform('{0:2d}', dat.max_intensity, tmp, 28, 29)
584
+ tmp = sform('{0:1s}', dat.max_intensity_qualifier, tmp, 30)
585
+ tmp = sform('{0:2s}', dat.intensity_scale, tmp, 31, 32)
586
+ tmp = sform('{0:6.2f}', dat.macroseismic_latitude, tmp, 34, 39)
587
+ tmp = sform('{0:7.2f}', dat.macroseismic_longitude, tmp, 41, 47)
588
+ tmp = sform('{0:3.1f}', dat.macroseismic_magnitude, tmp, 49, 51)
589
+ tmp = sform('{0:1s}', dat.type_of_magnitude, tmp, 52)
590
+ tmp = sform('{0:4.2f}', dat.log_of_felt_area_radius, tmp, 53, 56)
591
+ tmp = sform('{0:5.2f}', dat.log_of_area_1, tmp, 57, 61)
592
+ tmp = sform('{0:2d}', dat.intensity_bordering_area_1, tmp, 62, 63)
593
+ tmp = sform('{0:5.2f}', dat.log_of_area_2, tmp, 64, 68)
594
+ tmp = sform('{0:2d}', dat.intensity_bordering_area_2, tmp, 69, 70)
595
+ tmp = sform('{0:1s}', dat.quality_rank, tmp, 72)
596
+ tmp = sform('{0:3s}', dat.reporting_agency, tmp, 73, 75)
597
+ tmp = sform('{0:1s}', '2', tmp, 80)
598
+
599
+ self.fobj.write(tmp)
600
+
601
+ def write_record_type_3(self, tmp):
602
+ """ Writes record type 3 - this changes depending on the preceding line
603
+ """
604
+ if '3' not in tmp:
605
+ return
606
+
607
+ tmp = ' '*80+'\n'
608
+ tmp = sform('{0:1s}', '3', tmp, 80)
609
+
610
+ self.fobj.write(tmp)
611
+
612
+ def write_record_type_4(self, data):
613
+ """ Writes record type 4"""
614
+ if '4' not in data:
615
+ return
616
+ else:
617
+ dat = data['4']
618
+
619
+ self.write_record_type_7()
620
+
621
+ for dat in data['4']:
622
+ tmp = ' '*80+'\n'
623
+ tmp = sform('{0:5s}', dat.station_name, tmp, 2, 6)
624
+ tmp = sform('{0:1s}', dat.instrument_type, tmp, 7)
625
+ tmp = sform('{0:1s}', dat.component, tmp, 8)
626
+ tmp = sform('{0:1s}', dat.quality, tmp, 10)
627
+ tmp = sform('{0:5s}', dat.phase_id, tmp, 11, 14)
628
+ tmp = sform('{0:1d}', dat.weighting_indicator, tmp, 15, 15, 1)
629
+ tmp = sform('{0:1s}', dat.flag_auto_pick, tmp, 16)
630
+ tmp = sform('{0:1s}', dat.first_motion, tmp, 17)
631
+ tmp = sform('{0:2d}', dat.hour, tmp, 19, 20, 0)
632
+ tmp = sform('{0:2d}', dat.minutes, tmp, 21, 22, 0)
633
+ tmp = sform('{0:>6.2f}', dat.seconds, tmp, 23, 28, 0)
634
+ tmp = sform('{0:4d}', dat.duration, tmp, 30, 33)
635
+ tmp = sform('{0:>7.5G}', dat.amplitude, tmp, 34, 40, 0)
636
+ tmp = sform('{0:4.3G}', dat.period, tmp, 42, 45, 0)
637
+ tmp = sform('{0:5.1f}', dat.direction_of_approach, tmp, 47, 51)
638
+ tmp = sform('{0:4.0f}', dat.phase_velocity, tmp, 53, 56)
639
+ tmp = sform('{0:4.0f}', dat.angle_of_incidence, tmp, 57, 60)
640
+ tmp = sform('{0:3d}', dat.azimuth_residual, tmp, 61, 63)
641
+ tmp = sform('{0:5.2f}', dat.travel_time_residual, tmp, 64, 68, 0)
642
+ tmp = sform('{0:2d}', dat.weight, tmp, 69, 70)
643
+ tmp = sform('{0:5.4G}', dat.epicentral_distance, tmp, 71, 75, 0)
644
+ tmp = sform('{0:3d}', dat.azimuth_at_source, tmp, 77, 79, 0)
645
+
646
+ self.fobj.write(tmp)
647
+
648
+ def write_record_type_5(self, data):
649
+ """ Writes record type 5"""
650
+ if '5' not in data:
651
+ return
652
+ else:
653
+ dat = data['5']
654
+
655
+ tmp = ' '*80+'\n'
656
+ tmp = sform('{0:78s}', dat.text, tmp, 2, 79)
657
+ tmp = sform('{0:1s}', '5', tmp, 80)
658
+
659
+ self.fobj.write(tmp)
660
+
661
+ def write_record_type_6(self, data):
662
+ """ Writes record type 6"""
663
+ if '6' not in data:
664
+ return
665
+ else:
666
+ dat = data['6']
667
+
668
+ tmp = ' '*80+'\n'
669
+ tmp = sform('{0:78s}', dat.tracedata_files, tmp, 2, 79)
670
+ tmp = sform('{0:1s}', '6', tmp, 80)
671
+
672
+ self.fobj.write(tmp)
673
+
674
+ def write_record_type_7(self):
675
+ """ Writes record type 7 """
676
+ tmp = ' STAT SP IPHASW D HRMM SECON CODA AMPLIT PERI AZIMU VELO' + \
677
+ ' AIN AR TRES W DIS CAZ7\n'
678
+ self.fobj.write(tmp)
679
+
680
+ def write_record_type_e(self, data):
681
+ """ Writes record type E"""
682
+ if 'E' not in data:
683
+ return
684
+ else:
685
+ dat = data['E']
686
+
687
+ if dat.latitude_error == -999 or dat.latitude_error is None:
688
+ return
689
+
690
+ tmp = ' '*80+'\n'
691
+ tmp = sform('{0:4s}', 'GAP=', tmp, 2, 5)
692
+ tmp = sform('{0:3d}', dat.gap, tmp, 6, 8)
693
+ tmp = sform('{0:6.2f}', dat.origin_time_error, tmp, 15, 20)
694
+ tmp = sform('{0:6.1f}', dat.latitude_error, tmp, 25, 30)
695
+ tmp = sform('{0:6.1f}', dat.longitude_error, tmp, 33, 38)
696
+ tmp = sform('{0:5.1f}', dat.depth_error, tmp, 39, 43)
697
+ tmp = sform('{0:12.4E}', dat.cov_xy, tmp, 44, 55)
698
+ tmp = sform('{0:12.4E}', dat.cov_xz, tmp, 56, 67)
699
+ tmp = sform('{0:12.4E}', dat.cov_yz, tmp, 68, 79)
700
+ tmp = sform('{0:1s}', 'E', tmp, 80)
701
+
702
+ self.fobj.write(tmp)
703
+
704
+ def write_record_type_f(self, data):
705
+ """ Writes record type F"""
706
+
707
+ if 'F' not in data:
708
+ return
709
+
710
+ for dat in data['F'].values():
711
+ tmp = ' '*80+'\n'
712
+ tmp = sform('{0:10.1f}', dat.strike, tmp, 1, 10)
713
+ tmp = sform('{0:10.1f}', dat.dip, tmp, 11, 20)
714
+ tmp = sform('{0:10.1f}', dat.rake, tmp, 21, 30)
715
+ tmp = sform('{0:5.1f}', dat.err1, tmp, 31, 35)
716
+ tmp = sform('{0:5.1f}', dat.err2, tmp, 36, 40)
717
+ tmp = sform('{0:5.1f}', dat.err3, tmp, 41, 45)
718
+ tmp = sform('{0:5.1f}', dat.fit_error, tmp, 46, 50)
719
+ tmp = sform('{0:5.1f}', dat.station_distribution_ratio, tmp, 51,
720
+ 55)
721
+ tmp = sform('{0:5.1f}', dat.amplitude_ratio, tmp, 56, 60)
722
+ tmp = sform('{0:2d}', dat.number_of_bad_polarities, tmp, 61, 62)
723
+ tmp = sform('{0:2d}', dat.number_of_bad_amplitude_ratios, tmp, 64,
724
+ 65)
725
+ tmp = sform('{0:3s}', dat.agency_code, tmp, 67, 69)
726
+ tmp = sform('{0:7s}', dat.program_used, tmp, 71, 77)
727
+ tmp = sform('{0:1s}', dat.solution_quality, tmp, 78)
728
+ tmp = sform('{0:1s}', 'F', tmp, 80)
729
+
730
+ self.fobj.write(tmp)
731
+
732
+ def write_record_type_h(self, data):
733
+ """ Writes record type H"""
734
+
735
+ if 'H' not in data:
736
+ return
737
+ else:
738
+ dat = data['1']
739
+
740
+ tmp = ' '*80+'\n'
741
+ tmp = sform('{0:4d}', dat.year, tmp, 2, 5)
742
+ tmp = sform('{0:2d}', dat.month, tmp, 7, 8)
743
+ tmp = sform('{0:2d}', dat.day, tmp, 9, 10)
744
+ tmp = sform('{0:1s}', dat.fixed_origin_time, tmp, 11)
745
+ tmp = sform('{0:2d}', dat.hour, tmp, 12, 13)
746
+ tmp = sform('{0:2d}', dat.minutes, tmp, 14, 15)
747
+ tmp = sform('{0:6.3f}', dat.seconds, tmp, 17, 22)
748
+ tmp = sform('{0:9.5f}', dat.latitude, tmp, 24, 32)
749
+ tmp = sform('{0:10.5f}', dat.longitude, tmp, 34, 43)
750
+ tmp = sform('{0:8.3f}', dat.depth, tmp, 45, 52)
751
+ tmp = sform('{0:6.3f}', dat.depth, tmp, 54, 59)
752
+ tmp = sform('{0:1s}', 'H', tmp, 80)
753
+
754
+ self.fobj.write(tmp)
755
+
756
+ def write_record_type_i(self, data):
757
+ """ Writes record type I"""
758
+ if 'I' not in data:
759
+ return
760
+ else:
761
+ dat = data['I']
762
+
763
+ tmp = ' '*80+'\n'
764
+ tmp = sform('{0:7s}', 'ACTION:', tmp, 2, 8)
765
+ tmp = sform('{0:3s}', dat.last_action_done, tmp, 9, 11)
766
+ tmp = sform('{0:14s}', dat.date_time_of_last_action, tmp, 13, 26)
767
+ tmp = sform('{0:3s}', 'OP:', tmp, 28, 30)
768
+ tmp = sform('{0:4s}', dat.operator, tmp, 31, 34)
769
+ tmp = sform('{0:7s}', 'STATUS:', tmp, 36, 42)
770
+ tmp = sform('{0:14s}', dat.status, tmp, 43, 56)
771
+ tmp = sform('{0:3s}', 'ID:', tmp, 58, 60)
772
+ tmp = sform('{0:14s}', dat.id, tmp, 61, 74)
773
+ tmp = sform('{0:1s}', dat.new_id_created, tmp, 75)
774
+ tmp = sform('{0:1s}', dat.id_locked, tmp, 76)
775
+ tmp = sform('{0:1s}', 'I', tmp, 80)
776
+
777
+ self.fobj.write(tmp)
778
+
779
+ def write_record_type_m(self, data):
780
+ """ Writes record type M"""
781
+
782
+ if 'M' not in data:
783
+ return
784
+ else:
785
+ dat = data['M']
786
+
787
+ tmp = ' '*80+'\n'
788
+
789
+ tmp = sform('{0:4d}', dat.year, tmp, 2, 5)
790
+ tmp = sform('{0:2d}', dat.month, tmp, 7, 8)
791
+ tmp = sform('{0:2d}', dat.day, tmp, 9, 10)
792
+ tmp = sform('{0:2d}', dat.hour, tmp, 12, 13)
793
+ tmp = sform('{0:2d}', dat.minutes, tmp, 14, 15)
794
+ tmp = sform('{0:4.1f}', dat.seconds, tmp, 17, 20)
795
+ tmp = sform('{0:7.3f}', dat.latitude, tmp, 24, 30)
796
+ tmp = sform('{0:8.3f}', dat.longitude, tmp, 31, 38)
797
+ tmp = sform('{0:5.1f}', dat.depth, tmp, 39, 43)
798
+ tmp = sform('{0:3s}', dat.reporting_agency, tmp, 46, 48)
799
+ tmp = sform('{0:4.1f}', dat.magnitude, tmp, 56, 59)
800
+ tmp = sform('{0:1s}', dat.magnitude_type, tmp, 60)
801
+ tmp = sform('{0:3s}', dat.magnitude_reporting_agency, tmp, 61, 63)
802
+ tmp = sform('{0:7s}', dat.method_used, tmp, 71, 77)
803
+ tmp = sform('{0:1s}', dat.quality, tmp, 78)
804
+
805
+ tmp = sform('{0:1s}', 'M', tmp, 80)
806
+
807
+ self.fobj.write(tmp)
808
+
809
+ tmp = ' '*80+'\n'
810
+
811
+ tmp = sform('{0:2s}', 'MT', tmp, 2, 3)
812
+ tmp = sform('{0:6.3f}', dat.mrr_mzz, tmp, 4, 9)
813
+ tmp = sform('{0:6.3f}', dat.mtt_mxx, tmp, 11, 16)
814
+ tmp = sform('{0:6.3f}', dat.mpp_myy, tmp, 18, 23)
815
+ tmp = sform('{0:6.3f}', dat.mrt_mzx, tmp, 25, 30)
816
+ tmp = sform('{0:6.3f}', dat.mrp_mzy, tmp, 32, 37)
817
+ tmp = sform('{0:6.3f}', dat.mtp_mxy, tmp, 39, 44)
818
+ tmp = sform('{0:3s}', dat.reporting_agency2, tmp, 46, 48)
819
+ tmp = sform('{0:1s}', dat.mt_coordinate_system, tmp, 49)
820
+ tmp = sform('{0:2d}', dat.exponential, tmp, 50, 51)
821
+ tmp = sform('{0:6.3g}', dat.scalar_moment, tmp, 53, 62)
822
+ tmp = sform('{0:7s}', dat.method_used_2, tmp, 71, 77)
823
+ tmp = sform('{0:1s}', dat.quality_2, tmp, 78)
824
+ tmp = sform('{0:1s}', 'M', tmp, 80)
825
+
826
+ self.fobj.write(tmp)
827
+
828
+ def write_record_type_p(self, data):
829
+ """ Writes record type P"""
830
+
831
+ if 'P' not in data:
832
+ return
833
+ else:
834
+ dat = data['P']
835
+
836
+ tmp = ' '*80+'\n'
837
+ tmp = sform('{0:78s}', dat.filename, tmp, 2, 79)
838
+ tmp = sform('{0:1s}', 'P', tmp, 80)
839
+
840
+ self.fobj.write(tmp)
841
+
842
+
843
+ class ExportCSV(object):
844
+ """ Export Seisan Data """
845
+ def __init__(self, parent):
846
+ self.ifile = ""
847
+ self.name = "Export CSV Data "
848
+ self.ext = ""
849
+ self.pbar = None
850
+ self.parent = parent
851
+ self.indata = {}
852
+ self.outdata = {}
853
+ self.lmod = None
854
+ self.fobj = None
855
+ # self.dirname = ""
856
+ self.showtext = self.parent.showprocesslog
857
+
858
+ def run(self):
859
+ """ Show Info """
860
+ if 'Seis' not in self.indata:
861
+ self.parent.showprocesslog(
862
+ 'Error: You need to have a Seisan data first!')
863
+ return
864
+
865
+ data = self.indata['Seis']
866
+
867
+ filename = QtGui.QFileDialog.getSaveFileName(self.parent, 'Save File',
868
+ '.', 'csv (*.csv)')
869
+
870
+ if filename == '':
871
+ return
872
+
873
+ os.chdir(filename.rpartition('/')[0])
874
+ # ofile = str(filename.rpartition('/')[-1][:-4])
875
+ self.ext = filename[-3:]
876
+
877
+ self.fobj = open(filename, 'w')
878
+
879
+ headi = ('last_action_done, date_time_of_last_action, operator, '
880
+ 'status, id, new_id_created, id_locked, ')
881
+
882
+ head1 = ('year, month, day, fixed_origin_time, hour, minutes, '
883
+ 'seconds, location_model_indicator, distance_indicator, '
884
+ 'event_id, latitude, longitude, depth, depth_indicator, '
885
+ 'locating_indicator, hypocenter_reporting_agency, '
886
+ 'number_of_stations_used, rms_of_time_residuals, '
887
+ 'magnitude_1, type_of_magnitude_1, '
888
+ 'magnitude_reporting_agency_1, magnitude_2, '
889
+ 'type_of_magnitude_2, magnitude_reporting_agency_2, '
890
+ 'magnitude_3, type_of_magnitude_3, '
891
+ 'magnitude_reporting_agency_3, ')
892
+
893
+ heade = ('gap, origin_time_error, latitude_error, longitude_error, '
894
+ 'depth_error, cov_xy, cov_xz, cov_yz, ')
895
+
896
+ head4 = ('station_name, instrument_type, dat.component, quality, '
897
+ 'phase_id, weighting_indicator, flag_auto_pick, '
898
+ 'first_motion, hour, minutes, seconds, duration, amplitude, '
899
+ 'period, direction_of_approach, phase_velocity, '
900
+ 'angle_of_incidence, azimuth_residual, travel_time_residual, '
901
+ 'weight, epicentral_distance, azimuth_at_source, ')
902
+
903
+ self.fobj.write(headi+head1+heade+head4+'\n')
904
+
905
+ for i in data:
906
+ reci = self.write_record_type_i(i)
907
+ rec1 = self.write_record_type_1(i)
908
+ rece = self.write_record_type_e(i)
909
+ rec4 = self.write_record_type_4(i)
910
+ for j in rec4:
911
+ self.fobj.write(reci+rec1+rece+j+'\n')
912
+
913
+ self.fobj.close()
914
+
915
+ def write_record_type_1(self, data):
916
+ """ Writes record type 1"""
917
+ if '1' not in data:
918
+ return ', '*27
919
+ else:
920
+ dat = data['1']
921
+ tmp = str(dat.year)+', '
922
+ tmp += str(dat.month)+', '
923
+ tmp += str(dat.day)+', '
924
+ tmp += str(dat.fixed_origin_time)+', '
925
+ tmp += str(dat.hour)+', '
926
+ tmp += str(dat.minutes)+', '
927
+ tmp += str(dat.seconds)+', '
928
+ tmp += str(dat.location_model_indicator)+', '
929
+ tmp += str(dat.distance_indicator)+', '
930
+ tmp += str(dat.event_id)+', '
931
+ tmp += str(dat.latitude)+', '
932
+ tmp += str(dat.longitude)+', '
933
+ tmp += str(dat.depth)+', '
934
+ tmp += str(dat.depth_indicator)+', '
935
+ tmp += str(dat.locating_indicator)+', '
936
+ tmp += str(dat.hypocenter_reporting_agency)+', '
937
+ tmp += str(dat.number_of_stations_used)+', '
938
+ tmp += str(dat.rms_of_time_residuals)+', '
939
+ tmp += str(dat.magnitude_1)+', '
940
+ tmp += str(dat.type_of_magnitude_1)+', '
941
+ tmp += str(dat.magnitude_reporting_agency_1)+', '
942
+ tmp += str(dat.magnitude_2)+', '
943
+ tmp += str(dat.type_of_magnitude_2)+', '
944
+ tmp += str(dat.magnitude_reporting_agency_2)+', '
945
+ tmp += str(dat.magnitude_3)+', '
946
+ tmp += str(dat.type_of_magnitude_3)+', '
947
+ tmp += str(dat.magnitude_reporting_agency_3)+', '
948
+
949
+ tmp = tmp.replace('None', '')
950
+ return tmp
951
+
952
+ def write_record_type_2(self, data):
953
+ """ Writes record type 2"""
954
+ if '2' not in data:
955
+ return
956
+ else:
957
+ dat = data['2']
958
+
959
+ tmp = ' '*80+'\n'
960
+ tmp = sform('{0:15s}', dat.description, tmp, 6, 20)
961
+ tmp = sform('{0:1s}', dat.diastrophism_code, tmp, 22)
962
+ tmp = sform('{0:1s}', dat.tsunami_code, tmp, 23)
963
+ tmp = sform('{0:1s}', dat.seiche_code, tmp, 24)
964
+ tmp = sform('{0:1s}', dat.cultural_effects, tmp, 25)
965
+ tmp = sform('{0:1s}', dat.unusual_events, tmp, 26)
966
+ tmp = sform('{0:2d}', dat.max_intensity, tmp, 28, 29)
967
+ tmp = sform('{0:1s}', dat.max_intensity_qualifier, tmp, 30)
968
+ tmp = sform('{0:2s}', dat.intensity_scale, tmp, 31, 32)
969
+ tmp = sform('{0:6.2f}', dat.macroseismic_latitude, tmp, 34, 39)
970
+ tmp = sform('{0:7.2f}', dat.macroseismic_longitude, tmp, 41, 47)
971
+ tmp = sform('{0:3.1f}', dat.macroseismic_magnitude, tmp, 49, 51)
972
+ tmp = sform('{0:1s}', dat.type_of_magnitude, tmp, 52)
973
+ tmp = sform('{0:4.2f}', dat.log_of_felt_area_radius, tmp, 53, 56)
974
+ tmp = sform('{0:5.2f}', dat.log_of_area_1, tmp, 57, 61)
975
+ tmp = sform('{0:2d}', dat.intensity_bordering_area_1, tmp, 62, 63)
976
+ tmp = sform('{0:5.2f}', dat.log_of_area_2, tmp, 64, 68)
977
+ tmp = sform('{0:2d}', dat.intensity_bordering_area_2, tmp, 69, 70)
978
+ tmp = sform('{0:1s}', dat.quality_rank, tmp, 72)
979
+ tmp = sform('{0:3s}', dat.reporting_agency, tmp, 73, 75)
980
+ tmp = sform('{0:1s}', '2', tmp, 80)
981
+
982
+ return tmp
983
+
984
+ def write_record_type_3(self, tmp):
985
+ """ Writes record type 3 - this changes depending on the preceding line
986
+ """
987
+ if '3' not in tmp:
988
+ return
989
+
990
+ tmp = ' '*80+'\n'
991
+ tmp = sform('{0:1s}', '3', tmp, 80)
992
+
993
+ return tmp
994
+
995
+ def write_record_type_4(self, data):
996
+ """ Writes record type 4"""
997
+ if '4' not in data:
998
+ return [', '*22]
999
+ else:
1000
+ dat = data['4']
1001
+
1002
+ self.write_record_type_7()
1003
+
1004
+ tmpfin = []
1005
+ for dat in data['4']:
1006
+ tmp = str(dat.station_name)+', '
1007
+ tmp += str(dat.instrument_type)+', '
1008
+ tmp += str(dat.component)+', '
1009
+ tmp += str(dat.quality)+', '
1010
+ tmp += str(dat.phase_id)+', '
1011
+ tmp += str(dat.weighting_indicator)+', '
1012
+ tmp += str(dat.flag_auto_pick)+', '
1013
+ tmp += str(dat.first_motion)+', '
1014
+ tmp += str(dat.hour)+', '
1015
+ tmp += str(dat.minutes)+', '
1016
+ tmp += str(dat.seconds)+', '
1017
+ tmp += str(dat.duration)+', '
1018
+ tmp += str(dat.amplitude)+', '
1019
+ tmp += str(dat.period)+', '
1020
+ tmp += str(dat.direction_of_approach)+', '
1021
+ tmp += str(dat.phase_velocity)+', '
1022
+ tmp += str(dat.angle_of_incidence)+', '
1023
+ tmp += str(dat.azimuth_residual)+', '
1024
+ tmp += str(dat.travel_time_residual)+', '
1025
+ tmp += str(dat.weight)+', '
1026
+ tmp += str(dat.epicentral_distance)+', '
1027
+ tmp += str(dat.azimuth_at_source)+', '
1028
+ tmp = tmp.replace('None', '')
1029
+
1030
+ tmpfin.append(tmp)
1031
+
1032
+ return tmpfin
1033
+
1034
+ def write_record_type_5(self, data):
1035
+ """ Writes record type 5"""
1036
+ if '5' not in data:
1037
+ return
1038
+ else:
1039
+ dat = data['5']
1040
+
1041
+ tmp = ' '*80+'\n'
1042
+ tmp = sform('{0:78s}', dat.text, tmp, 2, 79)
1043
+ tmp = sform('{0:1s}', '5', tmp, 80)
1044
+
1045
+ return tmp
1046
+
1047
+ def write_record_type_6(self, data):
1048
+ """ Writes record type 6"""
1049
+ if '6' not in data:
1050
+ return
1051
+ else:
1052
+ dat = data['6']
1053
+
1054
+ tmp = ' '*80+'\n'
1055
+ tmp = sform('{0:78s}', dat.tracedata_files, tmp, 2, 79)
1056
+ tmp = sform('{0:1s}', '6', tmp, 80)
1057
+
1058
+ return tmp
1059
+
1060
+ def write_record_type_7(self):
1061
+ """ Writes record type 7 """
1062
+ tmp = ' STAT SP IPHASW D HRMM SECON CODA AMPLIT PERI AZIMU VELO' + \
1063
+ ' AIN AR TRES W DIS CAZ7\n'
1064
+ return tmp
1065
+
1066
+ def write_record_type_e(self, data):
1067
+ """ Writes record type E"""
1068
+ if 'E' not in data:
1069
+ return ', '*8
1070
+ else:
1071
+ dat = data['E']
1072
+
1073
+ if dat.latitude_error == -999 or dat.latitude_error is None:
1074
+ return ', '*8
1075
+
1076
+ tmp = str(dat.gap)+', '
1077
+ tmp += str(dat.origin_time_error)+', '
1078
+ tmp += str(dat.latitude_error)+', '
1079
+ tmp += str(dat.longitude_error)+', '
1080
+ tmp += str(dat.depth_error)+', '
1081
+ tmp += str(dat.cov_xy)+', '
1082
+ tmp += str(dat.cov_xz)+', '
1083
+ tmp += str(dat.cov_yz)+', '
1084
+ tmp = tmp.replace('None', '')
1085
+
1086
+ return tmp
1087
+
1088
+ def write_record_type_f(self, data):
1089
+ """ Writes record type F"""
1090
+
1091
+ if 'F' not in data:
1092
+ return
1093
+
1094
+ for dat in data['F'].values():
1095
+ tmp = ' '*80+'\n'
1096
+ tmp = sform('{0:10.1f}', dat.strike, tmp, 1, 10)
1097
+ tmp = sform('{0:10.1f}', dat.dip, tmp, 11, 20)
1098
+ tmp = sform('{0:10.1f}', dat.rake, tmp, 21, 30)
1099
+ tmp = sform('{0:5.1f}', dat.err1, tmp, 31, 35)
1100
+ tmp = sform('{0:5.1f}', dat.err2, tmp, 36, 40)
1101
+ tmp = sform('{0:5.1f}', dat.err3, tmp, 41, 45)
1102
+ tmp = sform('{0:5.1f}', dat.fit_error, tmp, 46, 50)
1103
+ tmp = sform('{0:5.1f}', dat.station_distribution_ratio, tmp, 51,
1104
+ 55)
1105
+ tmp = sform('{0:5.1f}', dat.amplitude_ratio, tmp, 56, 60)
1106
+ tmp = sform('{0:2d}', dat.number_of_bad_polarities, tmp, 61, 62)
1107
+ tmp = sform('{0:2d}', dat.number_of_bad_amplitude_ratios, tmp, 64,
1108
+ 65)
1109
+ tmp = sform('{0:3s}', dat.agency_code, tmp, 67, 69)
1110
+ tmp = sform('{0:7s}', dat.program_used, tmp, 71, 77)
1111
+ tmp = sform('{0:1s}', dat.solution_quality, tmp, 78)
1112
+ tmp = sform('{0:1s}', 'F', tmp, 80)
1113
+
1114
+ return tmp
1115
+
1116
+ def write_record_type_h(self, data):
1117
+ """ Writes record type H"""
1118
+
1119
+ if 'H' not in data:
1120
+ return
1121
+ else:
1122
+ dat = data['1']
1123
+
1124
+ tmp = ' '*80+'\n'
1125
+ tmp = sform('{0:4d}', dat.year, tmp, 2, 5)
1126
+ tmp = sform('{0:2d}', dat.month, tmp, 7, 8)
1127
+ tmp = sform('{0:2d}', dat.day, tmp, 9, 10)
1128
+ tmp = sform('{0:1s}', dat.fixed_origin_time, tmp, 11)
1129
+ tmp = sform('{0:2d}', dat.hour, tmp, 12, 13)
1130
+ tmp = sform('{0:2d}', dat.minutes, tmp, 14, 15)
1131
+ tmp = sform('{0:6.3f}', dat.seconds, tmp, 17, 22)
1132
+ tmp = sform('{0:9.5f}', dat.latitude, tmp, 24, 32)
1133
+ tmp = sform('{0:10.5f}', dat.longitude, tmp, 34, 43)
1134
+ tmp = sform('{0:8.3f}', dat.depth, tmp, 45, 52)
1135
+ tmp = sform('{0:6.3f}', dat.depth, tmp, 54, 59)
1136
+ tmp = sform('{0:1s}', 'H', tmp, 80)
1137
+
1138
+ return tmp
1139
+
1140
+ def write_record_type_i(self, data):
1141
+ """ Writes record type I"""
1142
+ if 'I' not in data:
1143
+ return ', '*7
1144
+ else:
1145
+ dat = data['I']
1146
+
1147
+ tmp = str(dat.last_action_done)+', '
1148
+ tmp += str(dat.date_time_of_last_action)+', '
1149
+ tmp += str(dat.operator)+', '
1150
+ tmp += str(dat.status)+', '
1151
+ tmp += str(dat.id)+', '
1152
+ tmp += str(dat.new_id_created)+', '
1153
+ tmp += str(dat.id_locked)+', '
1154
+
1155
+ return tmp
1156
+
1157
+ def write_record_type_m(self, data):
1158
+ """ Writes record type M"""
1159
+
1160
+ if 'M' not in data:
1161
+ return
1162
+ else:
1163
+ dat = data['M']
1164
+
1165
+ tmp = ' '*80+'\n'
1166
+
1167
+ tmp = sform('{0:4d}', dat.year, tmp, 2, 5)
1168
+ tmp = sform('{0:2d}', dat.month, tmp, 7, 8)
1169
+ tmp = sform('{0:2d}', dat.day, tmp, 9, 10)
1170
+ tmp = sform('{0:2d}', dat.hour, tmp, 12, 13)
1171
+ tmp = sform('{0:2d}', dat.minutes, tmp, 14, 15)
1172
+ tmp = sform('{0:4.1f}', dat.seconds, tmp, 17, 20)
1173
+ tmp = sform('{0:7.3f}', dat.latitude, tmp, 24, 30)
1174
+ tmp = sform('{0:8.3f}', dat.longitude, tmp, 31, 38)
1175
+ tmp = sform('{0:5.1f}', dat.depth, tmp, 39, 43)
1176
+ tmp = sform('{0:3s}', dat.reporting_agency, tmp, 46, 48)
1177
+ tmp = sform('{0:4.1f}', dat.magnitude, tmp, 56, 59)
1178
+ tmp = sform('{0:1s}', dat.magnitude_type, tmp, 60)
1179
+ tmp = sform('{0:3s}', dat.magnitude_reporting_agency, tmp, 61, 63)
1180
+ tmp = sform('{0:7s}', dat.method_used, tmp, 71, 77)
1181
+ tmp = sform('{0:1s}', dat.quality, tmp, 78)
1182
+
1183
+ tmp = sform('{0:1s}', 'M', tmp, 80)
1184
+
1185
+ # self.fobj.write(tmp)
1186
+
1187
+ tmp = ' '*80+'\n'
1188
+
1189
+ tmp = sform('{0:2s}', 'MT', tmp, 2, 3)
1190
+ tmp = sform('{0:6.3f}', dat.mrr_mzz, tmp, 4, 9)
1191
+ tmp = sform('{0:6.3f}', dat.mtt_mxx, tmp, 11, 16)
1192
+ tmp = sform('{0:6.3f}', dat.mpp_myy, tmp, 18, 23)
1193
+ tmp = sform('{0:6.3f}', dat.mrt_mzx, tmp, 25, 30)
1194
+ tmp = sform('{0:6.3f}', dat.mrp_mzy, tmp, 32, 37)
1195
+ tmp = sform('{0:6.3f}', dat.mtp_mxy, tmp, 39, 44)
1196
+ tmp = sform('{0:3s}', dat.reporting_agency2, tmp, 46, 48)
1197
+ tmp = sform('{0:1s}', dat.mt_coordinate_system, tmp, 49)
1198
+ tmp = sform('{0:2d}', dat.exponential, tmp, 50, 51)
1199
+ tmp = sform('{0:6.3g}', dat.scalar_moment, tmp, 53, 62)
1200
+ tmp = sform('{0:7s}', dat.method_used_2, tmp, 71, 77)
1201
+ tmp = sform('{0:1s}', dat.quality_2, tmp, 78)
1202
+ tmp = sform('{0:1s}', 'M', tmp, 80)
1203
+
1204
+ return tmp
1205
+
1206
+ def write_record_type_p(self, data):
1207
+ """ Writes record type P"""
1208
+
1209
+ if 'P' not in data:
1210
+ return
1211
+ else:
1212
+ dat = data['P']
1213
+
1214
+ tmp = ' '*80+'\n'
1215
+ tmp = sform('{0:78s}', dat.filename, tmp, 2, 79)
1216
+ tmp = sform('{0:1s}', 'P', tmp, 80)
1217
+
1218
+ return tmp
1219
+
1220
+ def sform(strform, val, tmp, col1, col2=None, nval=-999):
1221
+ """
1222
+ Formats strings
1223
+
1224
+ Formats strings according with a mod for values containing the value -999
1225
+ or None. In that case it will output spaces instead. In the case of strings
1226
+ being output, they are truncated to fit the format statement. This routine
1227
+ also puts the new strings in the correct columns
1228
+
1229
+ Parameters
1230
+ ----------
1231
+ strform : python format string
1232
+ This string must be of the form {0:4.1f}, where 4.1f can be changed.
1233
+ val : float, int, str
1234
+ input value
1235
+ nval : float, int
1236
+ null value which gets substituted by spaces
1237
+ col1 : int
1238
+ start column (1 is first column)
1239
+ col2 : inr
1240
+ end column
1241
+
1242
+ Returns
1243
+ -------
1244
+ tmp : str
1245
+ Output formatted string.
1246
+ """
1247
+
1248
+ if col2 is None:
1249
+ col2 = col1
1250
+
1251
+ slen = int(re.findall("[0-9]+", strform)[1])
1252
+
1253
+ if val == nval or val is None:
1254
+ tmp2 = slen*' '
1255
+ elif 's' in strform:
1256
+ tmp2 = strform.format(val[:slen])
1257
+ else:
1258
+ tmp2 = strform.format(val)
1259
+
1260
+ tmp = tmp[:col1-1]+tmp2[:slen]+tmp[col2:]
1261
+ return tmp