[refs #137] implementation of GUI driven NonLinLoc location started
This commit is contained in:
		
							parent
							
								
									135ac0ef80
								
							
						
					
					
						commit
						e53dd99d75
					
				
							
								
								
									
										14
									
								
								QtPyLoT.py
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								QtPyLoT.py
									
									
									
									
									
								
							| @ -44,7 +44,7 @@ from pylot.core.io.inputs import FilterOptions, AutoPickParameter | ||||
| from pylot.core.pick.autopick import autopickevent | ||||
| from pylot.core.pick.compare import Comparison | ||||
| from pylot.core.io.phases import picksdict_from_picks | ||||
| from pylot.core.loc.nll import locate as locateNll | ||||
| import pylot.core.loc.nll as nll | ||||
| from pylot.core.util.defaults import FILTERDEFAULTS, COMPNAME_MAP, \ | ||||
|     AUTOMATIC_DEFAULTS | ||||
| from pylot.core.util.errors import FormatError, DatastructureError, \ | ||||
| @ -61,7 +61,7 @@ from pylot.core.util.thread import AutoPickThread | ||||
| from pylot.core.util.version import get_git_version as _getVersionString | ||||
| import icons_rc | ||||
| 
 | ||||
| locateTool = dict(nll=locateNll) | ||||
| locateTool = dict(nll=nll) | ||||
| 
 | ||||
| 
 | ||||
| class MainWindow(QMainWindow): | ||||
| @ -890,10 +890,14 @@ class MainWindow(QMainWindow): | ||||
| 
 | ||||
|     def locateEvent(self): | ||||
|         settings = QSettings() | ||||
|         # get location tool hook | ||||
|         loctool = settings.value("loc/tool", "nll") | ||||
|         extlocpath = settings.value("%s/binPath".format(loctool), None) | ||||
|         locroot = settings.value("%s/rootPath".format(loctool), None) | ||||
|         if extlocpath is None or locroot is None: | ||||
|         lt = locateTool[loctool] | ||||
|         # get working directory | ||||
|         locroot = settings.value("{0}/rootPath".format(loctool), None) | ||||
|         infile = settings.value("{0}/inputFile".format(loctool), None) | ||||
|         lt.locate(infile) | ||||
|         if locroot is None: | ||||
|             self.PyLoTprefs() | ||||
| 
 | ||||
|     def check4Loc(self): | ||||
|  | ||||
							
								
								
									
										37
									
								
								autoPyLoT.py
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								autoPyLoT.py
									
									
									
									
									
								
							| @ -6,13 +6,15 @@ from __future__ import print_function | ||||
| import argparse | ||||
| import glob | ||||
| import string | ||||
| import os | ||||
| 
 | ||||
| import numpy as np | ||||
| 
 | ||||
| from pylot.core.analysis.magnitude import M0Mw | ||||
| from pylot.core.io.data import Data | ||||
| from pylot.core.io.inputs import AutoPickParameter | ||||
| from pylot.core.loc.nll import * | ||||
| import pylot.core.loc.nll as nll | ||||
| import pylot.core.loc.hsat as hsat | ||||
| from pylot.core.pick.autopick import autopickevent, iteratepicker | ||||
| from pylot.core.util.structure import DATASTRUCTURE | ||||
| from pylot.core.util.version import get_git_version as _getVersionString | ||||
| @ -112,16 +114,17 @@ def autoPyLoT(inputfile): | ||||
|                 # locating | ||||
|                 if locflag == 1: | ||||
|                     # write phases to NLLoc-phase file | ||||
|                     picksExport(picks, 'NLLoc', phasefile) | ||||
|                     nll.export(picks, phasefile) | ||||
| 
 | ||||
|                     # For locating the event the NLLoc-control file has to be modified! | ||||
|                     evID = event[string.rfind(event, "/") + 1: len(events) - 1] | ||||
|                     nllocout = '%s_%s' % (evID, nllocoutpatter) | ||||
|                     # create comment line for NLLoc-control file | ||||
|                     modifyInputFile(ctrf, nllocroot, nllocout, phasef, ttpat) | ||||
|                     nll.modifyInputFile(ctrf, nllocroot, nllocout, phasef, | ||||
|                                         ttpat) | ||||
| 
 | ||||
|                     # locate the event | ||||
|                     locate(nlloccall, ctrfile) | ||||
|                     nll.locate(ctrfile) | ||||
| 
 | ||||
|                     # !iterative picking if traces remained unpicked or occupied with bad picks! | ||||
|                     # get theoretical onset times for picks with weights >= 4 | ||||
| @ -162,11 +165,11 @@ def autoPyLoT(inputfile): | ||||
|                                 print("autoPyLoT: Starting with iteration No. %d ..." % nlloccounter) | ||||
|                                 picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter) | ||||
|                                 # write phases to NLLoc-phase file | ||||
|                                 picksExport(picks, 'NLLoc', phasefile) | ||||
|                                 nll.export(picks, phasefile) | ||||
|                                 # remove actual NLLoc-location file to keep only the last | ||||
|                                 os.remove(nllocfile) | ||||
|                                 # locate the event | ||||
|                                 locate(nlloccall, ctrfile) | ||||
|                                 nll.locate(ctrfile) | ||||
|                                 print("autoPyLoT: Iteration No. %d finished." % nlloccounter) | ||||
|                                 # get updated NLLoc-location file | ||||
|                                 nllocfile = max(glob.glob(locsearch), key=os.path.getctime) | ||||
| @ -201,13 +204,13 @@ def autoPyLoT(inputfile): | ||||
|                 hypo71file = '%s/autoPyLoT_HYPO71.pha' % event | ||||
|                 if hasattr(finalpicks, 'getpicdic'): | ||||
|                     if finalpicks.getpicdic() is not None: | ||||
|                         writephases(finalpicks.getpicdic(), 'HYPO71', hypo71file) | ||||
|                         hsat.export(finalpicks.getpicdic(), hypo71file) | ||||
|                         data.applyEVTData(finalpicks.getpicdic()) | ||||
|                     else: | ||||
|                         writephases(picks, 'HYPO71', hypo71file) | ||||
|                         hsat.export(picks, hypo71file) | ||||
|                         data.applyEVTData(picks) | ||||
|                 else: | ||||
|                     writephases(picks, 'HYPO71', hypo71file) | ||||
|                     hsat.export(picks, hypo71file) | ||||
|                     data.applyEVTData(picks) | ||||
|                 fnqml = '%s/autoPyLoT' % event | ||||
|                 data.exportEvent(fnqml) | ||||
| @ -235,15 +238,15 @@ def autoPyLoT(inputfile): | ||||
|             # locating | ||||
|             if locflag == 1: | ||||
|                 # write phases to NLLoc-phase file | ||||
|                 picksExport(picks, 'NLLoc', phasefile) | ||||
|                 nll.export(picks, phasefile) | ||||
| 
 | ||||
|                 # For locating the event the NLLoc-control file has to be modified! | ||||
|                 nllocout = '%s_%s' % (parameter.get('eventID'), nllocoutpatter) | ||||
|                 # create comment line for NLLoc-control file | ||||
|                 modifyInputFile(ctrf, nllocroot, nllocout, phasef, ttpat) | ||||
|                 nll.modifyInputFile(ctrf, nllocroot, nllocout, phasef, ttpat) | ||||
| 
 | ||||
|                 # locate the event | ||||
|                 locate(nlloccall, ctrfile) | ||||
|                 nll.locate(ctrfile) | ||||
|                 # !iterative picking if traces remained unpicked or occupied with bad picks! | ||||
|                 # get theoretical onset times for picks with weights >= 4 | ||||
|                 # in order to reprocess them using smaller time windows around theoretical onset | ||||
| @ -283,11 +286,11 @@ def autoPyLoT(inputfile): | ||||
|                             print("autoPyLoT: Starting with iteration No. %d ..." % nlloccounter) | ||||
|                             picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter) | ||||
|                             # write phases to NLLoc-phase file | ||||
|                             picksExport(picks, 'NLLoc', phasefile) | ||||
|                             nll.export(picks, phasefile) | ||||
|                             # remove actual NLLoc-location file to keep only the last | ||||
|                             os.remove(nllocfile) | ||||
|                             # locate the event | ||||
|                             locate(nlloccall, ctrfile) | ||||
|                             nll.locate(ctrfile) | ||||
|                             print("autoPyLoT: Iteration No. %d finished." % nlloccounter) | ||||
|                             # get updated NLLoc-location file | ||||
|                             nllocfile = max(glob.glob(locsearch), key=os.path.getctime) | ||||
| @ -322,13 +325,13 @@ def autoPyLoT(inputfile): | ||||
|             hypo71file = '%s/%s/autoPyLoT_HYPO71.pha' % (datapath, parameter.get('eventID')) | ||||
|             if hasattr(finalpicks, 'getpicdic'): | ||||
|                 if finalpicks.getpicdic() is not None: | ||||
|                     writephases(finalpicks.getpicdic(), 'HYPO71', hypo71file) | ||||
|                     hsat.export(finalpicks.getpicdic(), hypo71file) | ||||
|                     data.applyEVTData(finalpicks.getpicdic()) | ||||
|                 else: | ||||
|                     writephases(picks, 'HYPO71', hypo71file) | ||||
|                     hsat.export(picks, hypo71file) | ||||
|                     data.applyEVTData(picks) | ||||
|             else: | ||||
|                 writephases(picks, 'HYPO71', hypo71file) | ||||
|                 hsat.export(picks, hypo71file) | ||||
|                 data.applyEVTData(picks) | ||||
|             fnqml =  '%s/%s/autoPyLoT' % (datapath, parameter.get('eventID')) | ||||
|             data.exportEvent(fnqml) | ||||
|  | ||||
| @ -1,2 +1,21 @@ | ||||
| #!/usr/bin/env python | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from pylot.core.io.phases import writephases | ||||
| from pylot.core.util.version import get_git_version as _getVersionString | ||||
| 
 | ||||
| __version__ = _getVersionString() | ||||
| 
 | ||||
| def export(picks, fnout): | ||||
|     ''' | ||||
|     Take <picks> dictionary and exports picking data to a NLLOC-obs | ||||
|     <phasefile> without creating an ObsPy event object. | ||||
| 
 | ||||
|     :param picks: picking data dictionary | ||||
|     :type picks: dict | ||||
| 
 | ||||
|     :param fnout: complete path to the exporting obs file | ||||
|     :type fnout: str | ||||
|     ''' | ||||
|     # write phases to NLLoc-phase file | ||||
|     writephases(picks, 'HYPO71', fnout) | ||||
|  | ||||
| @ -3,14 +3,17 @@ | ||||
| 
 | ||||
| import subprocess | ||||
| import os | ||||
| from obspy import read_events | ||||
| from pylot.core.io.phases import writephases | ||||
| from pylot.core.util.utils import getPatternLine, runProgram | ||||
| from pylot.core.util.utils import getPatternLine, runProgram, which | ||||
| from pylot.core.util.version import get_git_version as _getVersionString | ||||
| 
 | ||||
| __version__ = _getVersionString() | ||||
| 
 | ||||
| class NLLocError(EnvironmentError): | ||||
|     pass | ||||
| 
 | ||||
| def picksExport(picks, locrt, phasefile): | ||||
| def export(picks, fnout): | ||||
|     ''' | ||||
|     Take <picks> dictionary and exports picking data to a NLLOC-obs | ||||
|     <phasefile> without creating an ObsPy event object. | ||||
| @ -18,14 +21,11 @@ def picksExport(picks, locrt, phasefile): | ||||
|     :param picks: picking data dictionary | ||||
|     :type picks: dict | ||||
| 
 | ||||
|     :param locrt: choose location routine | ||||
|     :type locrt: str | ||||
| 
 | ||||
|     :param phasefile: complete path to the exporting obs file | ||||
|     :type phasefile: str | ||||
|     :param fnout: complete path to the exporting obs file | ||||
|     :type fnout: str | ||||
|     ''' | ||||
|     # write phases to NLLoc-phase file | ||||
|     writephases(picks, locrt, phasefile) | ||||
|     writephases(picks, 'NLLoc', fnout) | ||||
| 
 | ||||
| 
 | ||||
| def modifyInputFile(ctrfn, root, nllocoutn, phasefn, tttn): | ||||
| @ -66,24 +66,27 @@ def modifyInputFile(ctrfn, root, nllocoutn, phasefn, tttn): | ||||
|     nllfile.close() | ||||
| 
 | ||||
| 
 | ||||
| def locate(call, fnin): | ||||
|     ''' | ||||
|     Takes paths to NLLoc executable <call> and input parameter file <fnin> | ||||
|     and starts the location calculation. | ||||
| def locate(fnin): | ||||
|     """ | ||||
|     takes an external program name | ||||
|     :param fnin: | ||||
|     :return: | ||||
|     """ | ||||
| 
 | ||||
|     :param call: full path to NLLoc executable | ||||
|     :type call: str | ||||
|     exe_path = which('NLLoc') | ||||
|     if exe_path is None: | ||||
|         raise NLLocError('NonLinLoc executable not found; check your ' | ||||
|                          'environment variables') | ||||
| 
 | ||||
|     :param fnin: full path to input parameter file | ||||
|     :type fnin: str | ||||
|     ''' | ||||
| 
 | ||||
|     # locate the event | ||||
|     runProgram(call, fnin) | ||||
|     # locate the event utilizing external NonLinLoc installation | ||||
|     try: | ||||
|         runProgram(exe_path, fnin) | ||||
|     except subprocess.CalledProcessError as e: | ||||
|         print(e.output) | ||||
| 
 | ||||
| 
 | ||||
| def readLocation(fn): | ||||
|     pass | ||||
|     return read_events(fn) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|  | ||||
| @ -277,6 +277,15 @@ def getPatternLine(fn, pattern): | ||||
| 
 | ||||
|     return None | ||||
| 
 | ||||
| def is_executable(fn): | ||||
|     """ | ||||
|     takes a filename and returns True if the file is executable on the system | ||||
|     and False otherwise | ||||
|     :param fn: path to the file to be tested | ||||
|     :return: True or False | ||||
|     """ | ||||
|     return os.path.isfile(fn) and os.access(fn, os.X_OK) | ||||
| 
 | ||||
| 
 | ||||
| def isSorted(iterable): | ||||
|     ''' | ||||
| @ -393,9 +402,36 @@ def runProgram(cmd, parameter=None): | ||||
|         cmd.strip() | ||||
|         cmd += ' %s 2>&1' % parameter | ||||
| 
 | ||||
|     output = subprocess.check_output('{} | tee /dev/stderr'.format(cmd), | ||||
|                                      shell=True) | ||||
|     subprocess.check_output('{} | tee /dev/stderr'.format(cmd), shell=True) | ||||
| 
 | ||||
| def which(program): | ||||
|     """ | ||||
|     takes a program name and returns the full path to the executable or None | ||||
|     found on: http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python | ||||
|     :param program: name of the desired external program | ||||
|     :return: full path of the executable file | ||||
|     """ | ||||
| 
 | ||||
|     def is_exe(fpath): | ||||
|         return os.path.exists(fpath) and os.access(fpath, os.X_OK) | ||||
| 
 | ||||
|     def ext_candidates(fpath): | ||||
|         yield fpath | ||||
|         for ext in os.environ.get("PATHEXT", "").split(os.pathsep): | ||||
|             yield fpath + ext | ||||
| 
 | ||||
|     fpath, fname = os.path.split(program) | ||||
|     if fpath: | ||||
|         if is_exe(program): | ||||
|             return program | ||||
|     else: | ||||
|         for path in os.environ["PATH"].split(os.pathsep): | ||||
|             exe_file = os.path.join(path, program) | ||||
|             for candidate in ext_candidates(exe_file): | ||||
|                 if is_exe(candidate): | ||||
|                     return candidate | ||||
| 
 | ||||
|     return None | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     import doctest | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user