Added getQualitiesFromXML and EventlistFromXML scripts and respective buttons
Changed Icons for both Button - only temporary versions at the moment
This commit is contained in:
parent
0ee239f4a6
commit
a13defbe42
22
PyLoT.py
22
PyLoT.py
@ -91,6 +91,8 @@ from pylot.core.util.array_map import Array_map
|
||||
from pylot.core.util.structure import DATASTRUCTURE
|
||||
from pylot.core.util.thread import Thread, Worker
|
||||
from pylot.core.util.version import get_git_version as _getVersionString
|
||||
from pylot.core.io.getEventListFromXML import geteventlistfromxml
|
||||
from pylot.core.io.getQualitiesfromxml import getQualitiesfromxml
|
||||
|
||||
from pylot.styles import style_settings
|
||||
|
||||
@ -333,6 +335,9 @@ class MainWindow(QMainWindow):
|
||||
compare_icon.addPixmap(QPixmap(':/icons/compare_button.png'))
|
||||
qualities_icon = QIcon()
|
||||
qualities_icon.addPixmap(QPixmap(':/icons/pick_qualities_button.png'))
|
||||
eventlist_xml_icon = QIcon()
|
||||
eventlist_xml_icon.addPixmap(QPixmap(':/icons/eventlist_xml_button.png'))
|
||||
|
||||
self.newProjectAction = self.createAction(self, "&New project ...",
|
||||
self.createNewProject,
|
||||
QKeySequence.New, newIcon,
|
||||
@ -473,6 +478,11 @@ class MainWindow(QMainWindow):
|
||||
# LK will be implemented soon, basic script has already (03/2021) been finished
|
||||
self.qualities_action.setVisible(True)
|
||||
|
||||
self.eventlist_xml_action = self.createAction(parent=self, text='Create Eventlist from XML',
|
||||
slot=self.eventlistXml, shortcut='Alt+X',
|
||||
icon=eventlist_xml_icon, tip='Create an Eventlist from a XML File')
|
||||
self.eventlist_xml_action.setEnabled(False)
|
||||
|
||||
printAction = self.createAction(self, "&Print event ...",
|
||||
self.show_event_information, QKeySequence.Print,
|
||||
print_icon,
|
||||
@ -541,7 +551,7 @@ class MainWindow(QMainWindow):
|
||||
' the complete project on grid engine.')
|
||||
self.auto_pick_sge.setEnabled(False)
|
||||
|
||||
pickActions = (self.auto_tune, self.auto_pick, self.compare_action, self.qualities_action)
|
||||
pickActions = (self.auto_tune, self.auto_pick, self.compare_action, self.qualities_action, self.eventlist_xml_action)
|
||||
|
||||
# pickToolBar = self.addToolBar("PickTools")
|
||||
# pickToolActions = (selectStation, )
|
||||
@ -1628,6 +1638,14 @@ class MainWindow(QMainWindow):
|
||||
self.cmpw.show()
|
||||
|
||||
def pickQualities(self):
|
||||
path = self._inputs['rootpath'] + '/' + self._inputs['datapath'] + '/' + self._inputs['database']
|
||||
getQualitiesfromxml(path)
|
||||
return
|
||||
|
||||
def eventlistXml(self):
|
||||
path = self._inputs['rootpath'] + '/' + self._inputs['datapath'] + '/' + self._inputs['database']
|
||||
outpath = self.project.location[:self.project.location.rfind('/')]
|
||||
geteventlistfromxml(path, outpath)
|
||||
return
|
||||
|
||||
def compareMulti(self):
|
||||
@ -2067,6 +2085,7 @@ class MainWindow(QMainWindow):
|
||||
if event.pylot_picks or event.pylot_autopicks:
|
||||
self.locateEventAction.setEnabled(True)
|
||||
self.qualities_action.setEnabled(True)
|
||||
self.eventlist_xml_action.setEnabled(True)
|
||||
if True in self.comparable.values():
|
||||
self.compare_action.setEnabled(True)
|
||||
self.draw()
|
||||
@ -2139,6 +2158,7 @@ class MainWindow(QMainWindow):
|
||||
self.loadpilotevent.setEnabled(False)
|
||||
self.compare_action.setEnabled(False)
|
||||
self.qualities_action.setEnabled(False)
|
||||
self.eventlist_xml_action.setEnabled(False)
|
||||
self.locateEventAction.setEnabled(False)
|
||||
if not refresh_plot:
|
||||
self.wf_scroll_area.setVisible(False)
|
||||
|
@ -30,6 +30,7 @@
|
||||
<file>icons/openloc.png</file>
|
||||
<file>icons/compare_button.png</file>
|
||||
<file>icons/pick_qualities_button.png</file>
|
||||
<file>icons/eventlist_xml_button.png</file>
|
||||
<file>icons/locate_button.png</file>
|
||||
<file>icons/Matlab_PILOT_icon.png</file>
|
||||
<file>icons/printer.png</file>
|
||||
|
9041
icons_rc_2.py
9041
icons_rc_2.py
File diff suppressed because it is too large
Load Diff
79
pylot/core/io/getEventListFromXML.py
Normal file
79
pylot/core/io/getEventListFromXML.py
Normal file
@ -0,0 +1,79 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script to get event parameters from PyLoT-xml file to write
|
||||
them into eventlist.
|
||||
LK, igem, 03/2021
|
||||
Edited for use in PyLoT
|
||||
JG, igem, 01/2022
|
||||
"""
|
||||
import pdb
|
||||
import os
|
||||
import argparse
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from obspy.core.event import read_events
|
||||
from pyproj import Proj
|
||||
import glob
|
||||
|
||||
"""
|
||||
Creates an eventlist file summarizing all events found in a certain folder. Only called by pressing UI Button eventlis_xml_action
|
||||
|
||||
:rtype:
|
||||
:param path: Path to root folder where single Event folder are to found
|
||||
"""
|
||||
|
||||
def geteventlistfromxml(path, outpath):
|
||||
p = Proj(proj='utm', zone=32, ellps='WGS84')
|
||||
|
||||
|
||||
# open eventlist file and write header
|
||||
evlist = outpath + '/eventlist'
|
||||
evlistobj = open(evlist, 'w')
|
||||
evlistobj.write('EventID Date To Lat Lon EAST NORTH Dep Ml NoP NoS RMS errH errZ Gap \n')
|
||||
|
||||
# data path
|
||||
dp = path + "/e*/*.xml"
|
||||
# list of all available xml-files
|
||||
xmlnames = glob.glob(dp)
|
||||
|
||||
# read all onset weights
|
||||
for names in xmlnames:
|
||||
print("Getting location parameters from {}".format(names))
|
||||
cat = read_events(names)
|
||||
try:
|
||||
st = cat.events[0].origins[0].time
|
||||
Lat = cat.events[0].origins[0].latitude
|
||||
Lon = cat.events[0].origins[0].longitude
|
||||
EAST, NORTH = p(Lon, Lat)
|
||||
Dep = cat.events[0].origins[0].depth / 1000
|
||||
Ml = cat.events[0].magnitudes[1].mag
|
||||
NoP = []
|
||||
NoS = []
|
||||
except IndexError:
|
||||
print ('Insufficient data found for event (not localised): ' + names.split('/')[-1].split('_')[-1][:-4] + ' Skipping event for eventlist.' )
|
||||
continue
|
||||
|
||||
for i in range(len(cat.events[0].origins[0].arrivals)):
|
||||
if cat.events[0].origins[0].arrivals[i].phase == 'P':
|
||||
NoP.append(cat.events[0].origins[0].arrivals[i].phase)
|
||||
elif cat.events[0].origins[0].arrivals[i].phase == 'S':
|
||||
NoS.append(cat.events[0].origins[0].arrivals[i].phase)
|
||||
#NoP = cat.events[0].origins[0].quality.used_station_count
|
||||
errH = cat.events[0].origins[0].origin_uncertainty.max_horizontal_uncertainty
|
||||
errZ = cat.events[0].origins[0].depth_errors.uncertainty
|
||||
Gap = cat.events[0].origins[0].quality.azimuthal_gap
|
||||
#evID = names.split('/')[6]
|
||||
evID = names.split('/')[-1].split('_')[-1][:-4]
|
||||
Date = str(st.year) + str('%02d' % st.month) + str('%02d' % st.day)
|
||||
To = str('%02d' % st.hour) + str('%02d' % st.minute) + str('%02d' % st.second) + \
|
||||
'.' + str('%06d' % st.microsecond)
|
||||
|
||||
# write into eventlist
|
||||
evlistobj.write('%s %s %s %9.6f %9.6f %13.6f %13.6f %8.6f %3.1f %d %d NaN %d %d %d\n' %(evID, \
|
||||
Date, To, Lat, Lon, EAST, NORTH, Dep, Ml, len(NoP), len(NoS), errH, errZ, Gap))
|
||||
print ('Adding Event ' + names.split('/')[-1].split('_')[-1][:-4] + ' to eventlist')
|
||||
print('Eventlist created and saved in: ' + outpath)
|
||||
evlistobj.close()
|
||||
|
139
pylot/core/io/getQualitiesfromxml.py
Normal file
139
pylot/core/io/getQualitiesfromxml.py
Normal file
@ -0,0 +1,139 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Script to get onset uncertainties from Quakeml.xml files created by PyLoT.
|
||||
Uncertainties are tranformed into quality classes and visualized via histogram if desired.
|
||||
Ludger Küperkoch, BESTEC GmbH, 07/2017
|
||||
rev.: Ludger Küperkoch, igem, 10/2020
|
||||
Edited for usage in PyLoT: Jeldrik Gaal, igem, 01/2022
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from obspy.core.event import read_events
|
||||
import glob
|
||||
|
||||
def getQualitiesfromxml(path):
|
||||
|
||||
# uncertainties
|
||||
ErrorsP = [0.02, 0.04, 0.08, 0.16]
|
||||
ErrorsS = [0.04, 0.08, 0.16, 0.32]
|
||||
|
||||
Pw0 = []
|
||||
Pw1 = []
|
||||
Pw2 = []
|
||||
Pw3 = []
|
||||
Pw4 = []
|
||||
Sw0 = []
|
||||
Sw1 = []
|
||||
Sw2 = []
|
||||
Sw3 = []
|
||||
Sw4 = []
|
||||
|
||||
# data path
|
||||
dp = path + '/e*/*.xml'
|
||||
# list of all available xml-files
|
||||
xmlnames = glob.glob(dp)
|
||||
|
||||
# read all onset weights
|
||||
for names in xmlnames:
|
||||
print("Getting onset weights from {}".format(names))
|
||||
cat = read_events(names)
|
||||
arrivals = cat.events[0].picks
|
||||
for Pick in arrivals:
|
||||
if Pick.phase_hint[0] == 'P':
|
||||
if Pick.time_errors.uncertainty <= ErrorsP[0]:
|
||||
Pw0.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsP[0] and \
|
||||
Pick.time_errors.uncertainty <= ErrorsP[1]:
|
||||
Pw1.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsP[1] and \
|
||||
Pick.time_errors.uncertainty <= ErrorsP[2]:
|
||||
Pw2.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsP[2] and \
|
||||
Pick.time_errors.uncertainty <= ErrorsP[3]:
|
||||
Pw3.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsP[3]:
|
||||
Pw4.append(Pick.time_errors.uncertainty)
|
||||
else:
|
||||
pass
|
||||
elif Pick.phase_hint[0] == 'S':
|
||||
if Pick.time_errors.uncertainty <= ErrorsS[0]:
|
||||
Sw0.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsS[0] and \
|
||||
Pick.time_errors.uncertainty <= ErrorsS[1]:
|
||||
Sw1.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsS[1] and \
|
||||
Pick.time_errors.uncertainty <= ErrorsS[2]:
|
||||
Sw2.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsS[2] and \
|
||||
Pick.time_errors.uncertainty <= ErrorsS[3]:
|
||||
Sw3.append(Pick.time_errors.uncertainty)
|
||||
elif Pick.time_errors.uncertainty > ErrorsS[3]:
|
||||
Sw4.append(Pick.time_errors.uncertainty)
|
||||
else:
|
||||
pass
|
||||
else:
|
||||
print("Phase hint not defined for picking!")
|
||||
pass
|
||||
# get percentage of weights
|
||||
numPweights = np.sum([len(Pw0), len(Pw1), len(Pw2), len(Pw3), len(Pw4)])
|
||||
numSweights = np.sum([len(Sw0), len(Sw1), len(Sw2), len(Sw3), len(Sw4)])
|
||||
try:
|
||||
P0perc = 100.0 / numPweights * len(Pw0)
|
||||
except:
|
||||
P0perc = 0
|
||||
try:
|
||||
P1perc = 100.0 / numPweights * len(Pw1)
|
||||
except:
|
||||
P1perc = 0
|
||||
try:
|
||||
P2perc = 100.0 / numPweights * len(Pw2)
|
||||
except:
|
||||
P2perc = 0
|
||||
try:
|
||||
P3perc = 100.0 / numPweights * len(Pw3)
|
||||
except:
|
||||
P3perc = 0
|
||||
try:
|
||||
P4perc = 100.0 / numPweights * len(Pw4)
|
||||
except:
|
||||
P4perc = 0
|
||||
try:
|
||||
S0perc = 100.0 / numSweights * len(Sw0)
|
||||
except:
|
||||
Soperc = 0
|
||||
try:
|
||||
S1perc = 100.0 / numSweights * len(Sw1)
|
||||
except:
|
||||
S1perc = 0
|
||||
try:
|
||||
S2perc = 100.0 / numSweights * len(Sw2)
|
||||
except:
|
||||
S2perc = 0
|
||||
try:
|
||||
S3perc = 100.0 / numSweights * len(Sw3)
|
||||
except:
|
||||
S3perc = 0
|
||||
try:
|
||||
S4perc = 100.0 / numSweights * len(Sw4)
|
||||
except:
|
||||
S4perc = 0
|
||||
|
||||
weights = ('0', '1', '2', '3', '4')
|
||||
y_pos = np.arange(len(weights))
|
||||
width = 0.34
|
||||
p1, = plt.bar(0 - width, P0perc, width, color='black')
|
||||
p2, = plt.bar(0, S0perc, width, color='red')
|
||||
plt.bar(y_pos - width, [P0perc, P1perc, P2perc, P3perc, P4perc], width, color='black')
|
||||
plt.bar(y_pos, [S0perc, S1perc, S2perc, S3perc, S4perc], width, color='red')
|
||||
plt.ylabel('%')
|
||||
plt.xticks(y_pos, weights)
|
||||
plt.xlim([-0.5, 4.5])
|
||||
plt.xlabel('Qualities')
|
||||
plt.title('{0} P-Qualities, {1} S-Qualities'.format(numPweights, numSweights))
|
||||
plt.legend([p1, p2], ['P-Weights', 'S-Weights'])
|
||||
plt.show()
|
||||
|
Loading…
Reference in New Issue
Block a user