Merge branch 'devFilterWidget' into develop

This commit is contained in:
2014-12-17 07:53:32 +01:00
9 changed files with 188 additions and 98 deletions

View File

@@ -1 +1 @@
e6ac-dirty
ef8b-dirty

View File

@@ -1,5 +1,6 @@
from pylot.core.read.data import (Data,
GenericDataStructure,
SeiscompDataStructure)
from pylot.core.read.inputs import (AutoPickParameter,
FilterOptions)
from pylot.core.read.inputs import AutoPickParameter
from pylot.core.read.inputs import FilterOptions
from pylot.core.read.data import Data
from pylot.core.read.data import GenericDataStructure
from pylot.core.read.data import SeiscompDataStructure

View File

@@ -27,7 +27,10 @@ class Data(object):
def __init__(self, parent=None, evtdata=None):
try:
self.wfdata = read()
if parent:
self.wfdata = read(parent.fnames)
else:
self.wfdata = read()
except IOError, e:
msg = 'An I/O error occured while loading data!'
inform = 'Variable wfdata will be empty.'
@@ -44,6 +47,7 @@ class Data(object):
self.wfdata = Stream()
else:
self.wfdata = Stream()
self.newevent = False
if evtdata is not None and isinstance(evtdata, Event):
self.evtdata = evtdata
elif evtdata is not None and not evtdata.endswith('.mat'):
@@ -52,17 +56,27 @@ class Data(object):
elif evtdata is not None:
cat = readMatPhases(evtdata)
else: # create an empty Event object
self.newevent = True
self.evtdata = Event()
self.orig = self.wfdata.copy()
def isNew(self):
return self.newevent
def readMatPhases(self, fname):
pass
def exportEvent(self, fnout=None, evtformat='QUAKEML'):
from pylot.core.util.defaults import OUTPUTFORMATS
if evtformat.strip() not in OUTPUTFORMATS.values():
evtformat = OUTPUTFORMATS.values()[0]
if fnout is None:
fnout = self.evtdata.getEventID()
ID = self.evtdata.getEventID()
# handle forbidden filenames especially on windows systems
fnout = fnConstructor(fnout)
fnout = fnConstructor(ID)
evtformat = evtformat.upper().strip()
@@ -77,10 +91,9 @@ class Data(object):
not implemented: {1}'''.format(evtformat, e))
def plotData(self, widget):
pass #axes = widget.axes
def getEventID(self):
def getID(self):
try:
return self.evtdata.get('resource_id').id
except:
@@ -123,10 +136,19 @@ class SeiscompDataStructure(object):
:type sdate, edate: str or UTCDateTime or None
'''
# Data type options
__typeOptions = {'waveform': 'D', # Waveform data
'detect': 'E', # Detection data
'log': 'L', # Log data
'timing': 'T', # Timing data
'calib': 'C', # Calibration data
'resp': 'R', # Response data
'opaque': 'O' # Opaque data
}
def __init__(self, dataType='waveform', sdate=None, edate=None, **kwargs):
# imports
from obspy.core import UTCDateTime
import numpy as np
def checkDate(date):
if not isinstance(date, UTCDateTime):
@@ -140,7 +162,9 @@ class SeiscompDataStructure(object):
edate = UTCDateTime(edate)
except TypeError:
edate = UTCDateTime()
sdate = edate - np.pi*1e7/2
halfyear = UTCDateTime('1970-07-01')
sdate = UTCDateTime(edate - halfyear)
del halfyear
year = ''
if not edate.year == sdate.year:
@@ -149,17 +173,7 @@ class SeiscompDataStructure(object):
year += '{0:04d},'.format(sdate.year+yr)
year = '{'+year[:-1]+'}'
else:
year = '{0:04d},'.format(sdate.year)
# Data type options
self.__typeOptions = {'waveform': 'D', # Waveform data
'detect': 'E', # Detection data
'log': 'L', # Log data
'timing': 'T', # Timing data
'calib': 'C', # Calibration data
'resp': 'R', # Response data
'opaque': 'O' # Opaque data
}
year = '{0:04d}'.format(sdate.year)
if dataType in self.__typeOptions.keys():
self.dataType = dataType
@@ -177,7 +191,7 @@ class SeiscompDataStructure(object):
'NET': '??', # up to 8 characters
'STA': '????', # up to 8 characters
'CHAN': 'HH?', # up to 8 characters
'TYPE': self._getType(), # 1 character
'TYPE': self.getType(), # 1 character
'LOC': '', # up to 8 characters
'DAY': '{0:03d}'.format(sdate.julday) # 3 digits
}
@@ -187,10 +201,14 @@ class SeiscompDataStructure(object):
if kwargs and isinstance(kwargs, dict):
for key, value in kwargs.iteritems():
key = str(key)
value = str(value)
if type(value) not in (str, int, float):
for n, val in enumerate(value):
value[n] = str(val)
else:
value = str(value)
try:
if key in self.__sdsFields.keys():
self.__sdsFields[key] = str(value)
if key in self.getSDSFields().keys():
self.getSDSFields()[key] = value
else:
raise KeyError('unknown SDS wildcard: %s.' % key)
except KeyError, e:
@@ -200,16 +218,19 @@ class SeiscompDataStructure(object):
errmsg += '%s; desired value was: %s\n' % (e, value)
print errmsg
def _getType(self):
def getType(self):
return self.__typeOptions[self.dataType]
def getSDSFields(self):
return self.__sdsFields
def expandDataPath(self):
fullChan = '{0}.{1}'.format(self.__sdsFields['CHAN'], self._getType())
dataPath = os.path.join(self.__sdsFields['SDSdir'],
self.__sdsFields['YEAR'],
self.__sdsFields['NET'],
self.__sdsFields['STA'],
fullChan = '{0}.{1}'.format(self.getSDSFields()['CHAN'], self.getType())
dataPath = os.path.join(self.getSDSFields()['SDSdir'],
self.getSDSFields()['YEAR'],
self.getSDSFields()['NET'],
self.getSDSFields()['STA'],
fullChan,
'*{0}'.format(self.__sdsFields['DAY'])
'*{0}'.format(self.getSDSFields()['DAY'])
)
return dataPath

View File

@@ -165,34 +165,34 @@ class FilterOptions(object):
'''
def __init__(self, filtertype='bandpass', freq=[2., 5.], order=3,
**kwargs):
self.setFilterType(filtertype)
self.setFreq(freq)
self.setOrder(order)
self._order = order
self._filtertype = filtertype
self._freq = freq
def __str__(self):
hrs = '''\n\tFilter parameter:\n
Type:\t\t{ftype}\n
Frequencies:\t{freq}\n
Order:\t\t{order}\n
'''.format(ftype=self.getFilterType(),
freq=self.getFreq(),
order=self.getOrder())
'''.format(ftype=self.getFilterType,
freq=self.getFreq,
order=self.getOrder)
return hrs
def getFreq(self):
return self.freq
return self.__getattribute__('_freq')
def setFreq(self, freq):
self.freq = freq
self.__setattr__('_freq', freq)
def getOrder(self):
return self.order
return self.__getattribute__('_order')
def setOrder(self, order):
self.order = order
self.__setattr__('_order', order)
def getFilterType(self):
return self.filterType
return self.__getattribute__('_filtertype')
def setFilterType(self, filtertype):
self.filterType = filtertype
self.__setattr__('_filtertype', filtertype)

View File

@@ -12,3 +12,5 @@ FILTERDEFAULTS = {'P': {'filtertype': None,
'S': {'filtertype': 'bandpass',
'order': '4',
'freq': [.5, 5]}}
OUTPUTFORMATS = {'QuakeML':'QUAKEML', 'VelEst':'VELEST'}

View File

@@ -21,7 +21,7 @@ def layoutStationButtons(data, comp):
stationButtons.append(QPushButton('%s'.format(stat)))
except:
for n in range(5):
stationButtons.append(QPushButton('ST%02d'.format(n)))
stationButtons.append(QPushButton('ST{0:02d}'.format(n+1)))
for button in stationButtons:
layout.addWidget(button)
return layout

View File

@@ -31,12 +31,14 @@ from PySide.QtGui import (QAction,
QToolBar,
QVBoxLayout,
QWidget)
from PySide.QtCore import (Qt,
from PySide.QtCore import (QSettings,
Qt,
QUrl,
SIGNAL,
SLOT)
from PySide.QtWebKit import QWebView
from pylot.core.read import FilterOptions
from pylot.core.util.defaults import OUTPUTFORMATS
class MPLWidget(FigureCanvasQTAgg):
@@ -71,17 +73,17 @@ class PropertiesDlg(QDialog):
self.setWindowTitle("{0} Properties".format(appName))
tabWidget = QTabWidget()
tabWidget.addTab(InputsTab(self), "Inputs")
tabWidget.addTab(OutputsTab(self), "Outputs")
tabWidget.addTab(PhasesTab(self), "Phases")
tabWidget.addTab(GraphicsTab(self), "Graphics")
self.tabWidget = QTabWidget()
self.tabWidget.addTab(InputsTab(self), "Inputs")
self.tabWidget.addTab(OutputsTab(self), "Outputs")
self.tabWidget.addTab(PhasesTab(self), "Phases")
self.tabWidget.addTab(GraphicsTab(self), "Graphics")
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
QDialogButtonBox.Apply |
QDialogButtonBox.Close)
layout = QVBoxLayout()
layout.addWidget(tabWidget)
layout.addWidget(self.tabWidget)
layout.addWidget(self.buttonBox)
self.setLayout(layout)
@@ -91,23 +93,40 @@ class PropertiesDlg(QDialog):
SIGNAL("clicked()"), self.apply)
self.connect(self.buttonBox, SIGNAL("rejected()"),
self, SLOT("reject()"))
pass
def apply(self):
pass
settings = QSettings()
for widint in range(self.tabWidget.count()):
curwid = self.tabWidget.widget(widint)
values = self.getValues(curwid)
settings.setValue()
class InputsTab(QWidget):
def __init__(self, parent=None):
def __init__(self, parent):
super(InputsTab, self).__init__(parent)
settings = QSettings()
fulluser = settings.value("user/FullName")
login = settings.value("user/Login")
fullNameLabel = QLabel("Full name for user '{0}'".format(login))
parent.fullNameEdit = QLineEdit()
parent.fullNameEdit.setText(fulluser)
dataroot = settings.value("data/dataRoot")
dataDirLabel = QLabel("data directory:")
dataDirEdit = QLineEdit()
parent.dataDirEdit = QLineEdit()
parent.dataDirEdit.setText(dataroot)
parent.dataDirEdit.selectAll()
layout = QGridLayout()
layout.addWidget(dataDirLabel, 0, 0)
layout.addWidget(dataDirEdit, 0, 1)
layout.addWidget(parent.dataDirEdit, 0, 1)
layout.addWidget(fullNameLabel, 1, 0)
layout.addWidget(parent.fullNameEdit, 1, 1)
self.setLayout(layout)
@@ -119,7 +138,7 @@ class OutputsTab(QWidget):
eventOutputLabel = QLabel("event ouput format")
eventOutputComboBox = QComboBox()
eventoutputformats = ["QuakeML", "VelEst"]
eventoutputformats = OUTPUTFORMATS.keys()
eventOutputComboBox.addItems(eventoutputformats)
layout = QGridLayout()
@@ -166,7 +185,7 @@ class FilterOptionsDialog(QDialog):
self.freqminSpinBox.setRange(5e-7, 1e6)
self.freqminSpinBox.setDecimals(2)
self.freqminSpinBox.setSuffix(' Hz')
self.freqminSpinBox.setValue(self.getFilterOptions().getFreq()[0])
self.freqminSpinBox.setValue(self.getFilterOptions().getFreq[0])
self.freqmaxLabel = QLabel()
self.freqmaxLabel.setText("maximum:")
self.freqmaxSpinBox = QDoubleSpinBox()
@@ -174,7 +193,7 @@ class FilterOptionsDialog(QDialog):
self.freqmaxSpinBox.setDecimals(2)
self.freqmaxSpinBox.setSuffix(' Hz')
if self.filterOptions.filterType in ['bandpass', 'bandstop']:
self.freqmaxSpinBox.setValue(self.getFilterOptions().getFreq()[1])
self.freqmaxSpinBox.setValue(self.getFilterOptions().getFreq[1])
typeOptions = ["bandpass", "bandstop", "lowpass", "highpass"]