[WIP] using multiThread to call autopylot

This commit is contained in:
Marcel Paffrath 2017-07-31 13:43:06 +02:00
parent f13542840f
commit 121ef4357f
4 changed files with 99 additions and 39 deletions

View File

@ -81,7 +81,7 @@ from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \
getDataType, ComparisonDialog, TuneAutopicker, PylotParaBox getDataType, ComparisonDialog, TuneAutopicker, PylotParaBox
from pylot.core.util.map_projection import map_projection from pylot.core.util.map_projection import map_projection
from pylot.core.util.structure import DATASTRUCTURE from pylot.core.util.structure import DATASTRUCTURE
from pylot.core.util.thread import AutoPickThread, Thread from pylot.core.util.thread import AutoPickThread, Thread, MultiThread
from pylot.core.util.version import get_git_version as _getVersionString from pylot.core.util.version import get_git_version as _getVersionString
if sys.version_info.major == 3: if sys.version_info.major == 3:
@ -1838,6 +1838,36 @@ class MainWindow(QMainWindow):
self.canvas_dict[key] = FigureCanvas(self.fig_dict[key]) self.canvas_dict[key] = FigureCanvas(self.fig_dict[key])
self.tap.fill_tabs(picked=True) self.tap.fill_tabs(picked=True)
# def autoPick(self):
# self.autosave = QFileDialog().getExistingDirectory(caption='Select autoPyLoT output')
# if not os.path.exists(self.autosave):
# QMessageBox.warning(self, "PyLoT Warning",
# "No autoPyLoT output declared!")
# return
# self.listWidget = QListWidget()
# self.setDirty(True)
# self.logDockWidget = QDockWidget("AutoPickLog", self)
# self.logDockWidget.setObjectName("LogDockWidget")
# self.logDockWidget.setAllowedAreas(
# Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
# self.logDockWidget.setWidget(self.listWidget)
# self.addDockWidget(Qt.LeftDockWidgetArea, self.logDockWidget)
# self.addListItem('Loading default values from PyLoT-input file %s'
# % self.infile)
# autopick_parameter = self._inputs
# self.addListItem(str(autopick_parameter))
# receventid = self.get_current_event_path()
# self.thread = AutoPickThread(parent=self,
# func=autoPyLoT,
# infile=self.infile,
# fnames=self.fnames,
# eventid=receventid,
# savepath=self.autosave)
# self.thread.message.connect(self.addListItem)
# self.thread.start()
# self.thread.finished.connect(self.finalizeAutoPick)
def autoPick(self): def autoPick(self):
self.autosave = QFileDialog().getExistingDirectory(caption='Select autoPyLoT output') self.autosave = QFileDialog().getExistingDirectory(caption='Select autoPyLoT output')
if not os.path.exists(self.autosave): if not os.path.exists(self.autosave):
@ -1852,26 +1882,44 @@ class MainWindow(QMainWindow):
Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
self.logDockWidget.setWidget(self.listWidget) self.logDockWidget.setWidget(self.listWidget)
self.addDockWidget(Qt.LeftDockWidgetArea, self.logDockWidget) self.addDockWidget(Qt.LeftDockWidgetArea, self.logDockWidget)
self.addListItem('Loading default values from PyLoT-input file %s' # self.addListItem('Loading default values from PyLoT-input file %s'
% self.infile) # % self.infile)
autopick_parameter = self._inputs
self.addListItem(str(autopick_parameter))
receventid = self.get_current_event_path()
self.thread = AutoPickThread(parent=self,
func=autoPyLoT,
infile=self.infile,
fnames=self.fnames,
eventid=receventid,
savepath=self.autosave)
self.thread.message.connect(self.addListItem) stations = []
self.thread.start() # catch all station names
self.thread.finished.connect(self.finalizeAutoPick) for trace in self.data.getWFData():
station = trace.stats.station
if not station in stations:
stations.append(station)
mp_args = []
# create input_dict for each station in a list for multiprocessing.Pool iteration
for station in stations:
args = {'parameter': self._inputs,
'station': station,
'fnames': 'None',
'eventid': self.get_current_event_path (),
'iplot': 0,
'fig_dict': None,
'locflag': 0}
mp_args.append(args)
self.mp_thread = MultiThread (self, autoPyLoT, args=mp_args,
ncores=0,
progressText='Picking event...',
pb_widget=None,
redirect_stdout=True)
self.addListItem(str(self._inputs))
self.mp_thread.message.connect(self.addListItem)
self.mp_thread.start()
self.mp_thread.finished.connect(self.finalizeAutoPick)
def finalizeAutoPick(self): def finalizeAutoPick(self):
self.drawPicks(picktype='auto') self.drawPicks(picktype='auto')
self.draw() self.draw()
self.thread.quit() self.mp_thread.quit()
def addPicks(self, station, picks, type='manual'): def addPicks(self, station, picks, type='manual'):
stat_picks = self.getPicksOnStation(station, type) stat_picks = self.getPicksOnStation(station, type)
@ -2218,7 +2266,7 @@ class MainWindow(QMainWindow):
# generate delete icon # generate delete icon
del_icon = QIcon() del_icon = QIcon()
del_icon.addPixmap(QPixmap(':/icons/delete.png')) del_icon.addPixmap(QPixmap(':/icons/delete.png'))
# remove old table # remove old table
if hasattr(self, 'event_table'): if hasattr(self, 'event_table'):
self.event_table.setParent(None) self.event_table.setParent(None)

View File

@ -66,6 +66,8 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
station = input_dict['station'] station = input_dict['station']
if input_dict.has_key('fnames'): if input_dict.has_key('fnames'):
fnames = input_dict['fnames'] fnames = input_dict['fnames']
if input_dict.has_key('eventid'):
eventid = input_dict['eventid']
if input_dict.has_key('iplot'): if input_dict.has_key('iplot'):
iplot = input_dict['iplot'] iplot = input_dict['iplot']
if input_dict.has_key('locflag'): if input_dict.has_key('locflag'):
@ -155,7 +157,7 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
events = [] events = []
events.append(os.path.join(datapath, events.append(os.path.join(datapath,
parameter['database'], parameter['database'],
parameter['eventID'])) eventid))
if not events: if not events:
print('autoPyLoT: No events given. Return!') print('autoPyLoT: No events given. Return!')

View File

@ -1 +1 @@
04d4-dirty f135-dirty

View File

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sys, os import sys, os
import multiprocessing
from PySide.QtCore import QThread, Signal, Qt from PySide.QtCore import QThread, Signal, Qt
from PySide.QtGui import QDialog, QProgressBar, QLabel, QHBoxLayout from PySide.QtGui import QDialog, QProgressBar, QLabel, QHBoxLayout, QPushButton
class AutoPickThread(QThread): class AutoPickThread(QThread):
@ -69,20 +70,27 @@ class Thread(QThread):
print('Exception: {}, file: {}, line: {}'.format(exc_type, fname, exc_tb.tb_lineno)) print('Exception: {}, file: {}, line: {}'.format(exc_type, fname, exc_tb.tb_lineno))
sys.stdout = sys.__stdout__ sys.stdout = sys.__stdout__
def __del__(self): # def __del__(self):
self.wait() # self.wait()
def showProgressbar(self): def showProgressbar(self):
if self.progressText: if self.progressText:
# generate widget if not given in init
if not self.pb_widget: if not self.pb_widget:
self.pb_widget = QDialog(self.parent()) self.pb_widget = QDialog(self.parent())
self.pb_widget.setWindowFlags(Qt.SplashScreen) self.pb_widget.setWindowFlags(Qt.SplashScreen)
self.pb_widget.setModal(True) self.pb_widget.setModal(True)
# add button
delete_button = QPushButton('X')
delete_button.clicked.connect(self.exit)
hl = QHBoxLayout() hl = QHBoxLayout()
pb = QProgressBar() pb = QProgressBar()
pb.setRange(0, 0) pb.setRange(0, 0)
hl.addWidget(pb) hl.addWidget(pb)
hl.addWidget(QLabel(self.progressText)) hl.addWidget(QLabel(self.progressText))
hl.addWidget(delete_button)
self.pb_widget.setLayout(hl) self.pb_widget.setLayout(hl)
self.pb_widget.show() self.pb_widget.show()
@ -101,11 +109,12 @@ class MultiThread(QThread):
finished = Signal(str) finished = Signal(str)
message = Signal(str) message = Signal(str)
def __init__(self, parent, func, args, ncores=1, def __init__(self, parent, func, args, ncores=0,
progressText=None, pb_widget=None, redirect_stdout=False): progressText=None, pb_widget=None, redirect_stdout=False):
QThread.__init__(self, parent) QThread.__init__(self, parent)
self.func = func self.func = func
self.args = args self.args = args
self.ncores = ncores
self.progressText = progressText self.progressText = progressText
self.pb_widget = pb_widget self.pb_widget = pb_widget
self.redirect_stdout = redirect_stdout self.redirect_stdout = redirect_stdout
@ -113,21 +122,22 @@ class MultiThread(QThread):
self.showProgressbar() self.showProgressbar()
def run(self): def run(self):
if self.redirect_stdout: # if self.redirect_stdout:
sys.stdout = self # sys.stdout = self
try: # #try:
pool = multiprocessing.Pool(self.ncores) if not self.ncores:
self.data = pool.map_async(self.func, self.args, callback=self.emitDone) self.ncores = multiprocessing.cpu_count()
#self.data = pool.apply_async(self.func, self.shotlist, callback=self.emitDone) #emit each time returned pool = multiprocessing.Pool(self.ncores)
pool.close() self.data = pool.map_async(self.func, self.args, callback=self.emitDone)
self._executed = True #self.data = pool.apply_async(self.func, self.shotlist, callback=self.emitDone) #emit each time returned
return result pool.close()
except Exception as e: self._executed = True
self._executed = False # except Exception as e:
self._executedError = e # self._executed = False
exc_type, exc_obj, exc_tb = sys.exc_info() # self._executedError = e
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] # exc_type, exc_obj, exc_tb = sys.exc_info()
print('Exception: {}, file: {}, line: {}'.format(exc_type, fname, exc_tb.tb_lineno)) # fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
# print('Exception: {}, file: {}, line: {}'.format(exc_type, fname, exc_tb.tb_lineno))
sys.stdout = sys.__stdout__ sys.stdout = sys.__stdout__
def __del__(self): def __del__(self):
@ -160,4 +170,4 @@ class MultiThread(QThread):
def emitDone(self, result): def emitDone(self, result):
print('emitDone!') print('emitDone!')
self.finished.emit('Done thread!') self.finished.emit('Done thread!')
self.hideProgressBar() self.hideProgressbar()