Skip to content

Commit

Permalink
Merge branch 'master' of github.com:gem/oq-engine
Browse files Browse the repository at this point in the history
  • Loading branch information
Michele Simionato committed Feb 24, 2025
2 parents 8e1bdfd + e217f5b commit 9f1a059
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 55 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/demos_ltr_latest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
required: true
push:
# TODO: it would be better to point to ltr and latest
branches: [ engine-3.16, engine-3.17, engine-3.18, engine-3.19, engine-3.20, engine-3.21, engine-3.22 ]
branches: [ engine-3.16, engine-3.17, engine-3.18, engine-3.19, engine-3.20, engine-3.21, engine-3.22, engine-3.23 ]
jobs:
demos:
runs-on: ubuntu-latest
Expand Down
32 changes: 16 additions & 16 deletions openquake/hazardlib/shakemap/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@ def _get_rup_from_json(usgs_id, rupture_file, station_data_file):
return rup, rupdic, rup_data


def get_rup_dic(dic, user=User(), approach='use_shakemap_from_usgs',
def get_rup_dic(dic, user=User(),
use_shakemap=False, rupture_file=None,
station_data_file=None, download_usgs_stations=True,
monitor=performance.Monitor()):
Expand All @@ -787,8 +787,6 @@ def get_rup_dic(dic, user=User(), approach='use_shakemap_from_usgs',
:param dic: dictionary with ShakeMap ID and other parameters
:param user: User instance
:param approach: the workflow selected by the user
(default: 'use_shakemap_from_usgs')
:param use_shakemap: download the ShakeMap only if True
:param rupture_file: None
:param station_data_file: None
Expand All @@ -800,6 +798,7 @@ def get_rup_dic(dic, user=User(), approach='use_shakemap_from_usgs',
rup_data = {}
err = {}
usgs_id = dic['usgs_id']
approach = dic['approach']
rup = None
if approach == 'provide_rup_params':
rupdic = dic.copy()
Expand All @@ -811,7 +810,6 @@ def get_rup_dic(dic, user=User(), approach='use_shakemap_from_usgs',
except ValueError as exc:
err = {"status": "failed", "error_msg": str(exc)}
return rup, rupdic, err

if rupture_file:
if rupture_file.endswith('.xml'):
rup, rupdic, err = _get_rup_dic_from_xml(
Expand All @@ -828,9 +826,19 @@ def get_rup_dic(dic, user=User(), approach='use_shakemap_from_usgs',
if err:
return None, None, err
if approach in ['use_pnt_rup_from_usgs', 'build_rup_from_usgs']:
rupdic, err = load_rupdic_from_origin(usgs_id, properties['products'])
if err:
return None, None, err
if dic.get('lon', None) is None: # don't override user-inserted values
rupdic, err = load_rupdic_from_origin(usgs_id, properties['products'])
if err:
return None, None, err
if approach == 'build_rup_from_usgs':
rupdic['nodal_planes'], err = _get_nodal_planes(properties)
if err:
return None, None, err
else:
rupdic.update(rupdic['nodal_planes']['NP1'])
else:
rupdic = dic.copy()
rupdic['require_dip_strike'] = True
elif ('download/rupture.json' not in contents
or approach == 'use_finite_rup_from_usgs'):
# happens for us6000f65h in parsers_test
Expand All @@ -839,18 +847,10 @@ def get_rup_dic(dic, user=User(), approach='use_shakemap_from_usgs',
if err:
return None, None, err

if approach == 'build_rup_from_usgs':
rupdic['nodal_planes'], err = _get_nodal_planes(properties)
rupdic['aspect_ratio'] = dic['aspect_ratio']
rupdic['msr'] = dic['msr']
if err:
return None, rupdic, err

if not rup_data and approach not in ['use_pnt_rup_from_usgs',
'build_rup_from_usgs']:
with monitor('Downloading rupture json'):
rup_data, rupture_file = download_rupture_data(
usgs_id, contents, user)
rup_data, rupture_file = download_rupture_data(usgs_id, contents, user)
if not rupdic:
rupdic = convert_rup_data(rup_data, usgs_id, rupture_file, shakemap)
if (approach != 'use_shakemap_from_usgs' and not station_data_file
Expand Down
16 changes: 10 additions & 6 deletions openquake/hazardlib/shakemap/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,18 @@ def get_oqparams(self, usgs_id, mosaic_models, trts, use_shakemap):
}

validators = {
'approach': valid.Choice('use_shakemap_from_usgs',
'use_pnt_rup_from_usgs',
'build_rup_from_usgs',
'use_finite_rup_from_usgs',
'provide_rup',
'provide_rup_params'),
'usgs_id': valid.simple_id,
'lon': valid.longitude,
'lat': valid.latitude,
'dep': valid.positivefloat,
'mag': valid.positivefloat,
'msr': valid.utf8,
'aspect_ratio': valid.positivefloat,
'rake': valid.rake_range,
'dip': valid.dip_range,
Expand All @@ -190,15 +197,15 @@ def _validate(POST):
validation_errs = {}
invalid_inputs = []
params = {}
dic = dict(usgs_id=None, lon=None, lat=None, dep=None,
dic = dict(approach=None, usgs_id=None, lon=None, lat=None, dep=None,
mag=None, msr=None, aspect_ratio=None, rake=None, dip=None, strike=None)
for field, validation_func in validators.items():
if field not in POST:
continue
try:
value = validation_func(POST.get(field))
except Exception as exc:
blankable = ['dip', 'strike',
blankable = ['dip', 'strike', 'msr',
'maximum_distance_stations', 'local_timestamp']
if field in blankable and POST.get(field) == '':
if field in dic:
Expand Down Expand Up @@ -272,12 +279,9 @@ def impact_validate(POST, user, rupture_file=None, station_data_file=None,
use_shakemap = user.level == 1
if 'use_shakemap' in POST:
use_shakemap = POST['use_shakemap'] == 'true'
approach = POST['approach']
if approach == 'build_rup_from_usgs':
dic['msr'] = POST['msr']

rup, rupdic, err = get_rup_dic(
dic, user, approach, use_shakemap, rupture_file, station_data_file,
dic, user, use_shakemap, rupture_file, station_data_file,
download_usgs_stations, monitor)
if err:
return None, None, None, err
Expand Down
78 changes: 55 additions & 23 deletions openquake/hazardlib/tests/shakemap/parsers_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,25 +41,25 @@ def test_utc_to_local_time(self):
def test_1(self):
# wrong usgs_id
_rup, _rupdic, err = get_rup_dic(
{'usgs_id': 'usp0001cc'}, User(level=2, testdir=''),
'use_shakemap_from_usgs', use_shakemap=True)
{'usgs_id': 'usp0001cc', 'approach': 'use_shakemap_from_usgs'},
User(level=2, testdir=''), use_shakemap=True)
self.assertIn('Unable to download from https://earthquake.usgs.gov/fdsnws/'
'event/1/query?eventid=usp0001cc&', err['error_msg'])

def test_2(self):
_rup, dic, _err = get_rup_dic(
{'usgs_id': 'usp0001ccb'}, user=user, approach='use_shakemap_from_usgs',
use_shakemap=True)
{'usgs_id': 'usp0001ccb', 'approach': 'use_shakemap_from_usgs'},
user=user, use_shakemap=True)
self.assertIsNotNone(dic['shakemap_array'])
_rup, dic, _err = get_rup_dic(
{'usgs_id': 'usp0001ccb'}, user=user, approach='use_shakemap_from_usgs',
use_shakemap=False)
{'usgs_id': 'usp0001ccb', 'approach': 'use_shakemap_from_usgs'},
user=user, use_shakemap=False)
self.assertIsNone(dic['shakemap_array'])

def test_3(self):
_rup, dic, _err = get_rup_dic(
{'usgs_id': 'us6000f65h'}, user=user, approach='use_pnt_rup_from_usgs',
use_shakemap=True)
{'usgs_id': 'us6000f65h', 'approach': 'use_pnt_rup_from_usgs'},
user=user, use_shakemap=True)
self.assertEqual(dic['lon'], -73.4822)
self.assertEqual(dic['lat'], 18.4335)
self.assertEqual(dic['dep'], 10.0)
Expand All @@ -78,8 +78,8 @@ def test_3(self):
def test_4(self):
# point_rup
_rup, dic, _err = get_rup_dic(
{'usgs_id': 'us6000jllz'}, user=user, approach='use_shakemap_from_usgs',
use_shakemap=True)
{'usgs_id': 'us6000jllz', 'approach': 'use_shakemap_from_usgs'},
user=user, use_shakemap=True)
self.assertEqual(dic['lon'], 37.0143)
self.assertEqual(dic['lat'], 37.2256)
self.assertEqual(dic['dep'], 10.)
Expand All @@ -88,44 +88,76 @@ def test_4(self):
def test_5(self):
# 12 vertices instead of 4 in rupture.json
rup, dic, _err = get_rup_dic(
{'usgs_id': 'us20002926'}, user=user, approach='use_shakemap_from_usgs',
use_shakemap=True)
{'usgs_id': 'us20002926', 'approach': 'use_shakemap_from_usgs'},
user=user, use_shakemap=True)
self.assertIsNone(rup)
self.assertEqual(dic['require_dip_strike'], True)
self.assertEqual(dic['rupture_issue'],
'Unable to convert the rupture from the USGS format')

def test_6(self):
_rup, dic, _err = get_rup_dic(
{'usgs_id': 'usp0001ccb'}, user=user, approach='use_pnt_rup_from_usgs',
use_shakemap=True)
{'usgs_id': 'usp0001ccb', 'approach': 'use_pnt_rup_from_usgs'},
user=user, use_shakemap=True)
self.assertEqual(dic['mag'], 6.7)
self.assertEqual(dic['require_dip_strike'], True)
self.assertEqual(dic['station_data_issue'],
'3 stations were found, but none of them are seismic')

def test_7(self):
dic_in = {'usgs_id': 'us6000jllz', 'lon': None, 'lat': None, 'dep': None,
'mag': None, 'msr': '', 'aspect_ratio': 2.0, 'rake': None,
'dip': None, 'strike': None}
_rup, dic, _err = get_rup_dic(
dic_in, user=user, approach='build_rup_from_usgs', use_shakemap=True)
'mag': None, 'msr': '', 'aspect_ratio': 2, 'rake': None,
'dip': None, 'strike': None, 'approach': 'build_rup_from_usgs'}
_rup, dic, _err = get_rup_dic(dic_in, user=user, use_shakemap=True)
self.assertEqual(
dic['nodal_planes'],
{'NP1': {'dip': 88.71, 'rake': -179.18, 'strike': 317.63},
'NP2': {'dip': 89.18, 'rake': -1.29, 'strike': 227.61}})
self.assertEqual(dic['msr'], '')
self.assertEqual(dic['aspect_ratio'], 2.0)

def test_8(self):
dic_in = {'usgs_id': 'us6000jllz', 'lon': 37.0143, 'lat': 37.2256,
'dep': 10.0, 'mag': 7.8, 'rake': 0.0}
rup, dic, _err = get_rup_dic(
dic_in, user=user, approach='use_pnt_rup_from_usgs', use_shakemap=True)
'dep': 10.0, 'mag': 7.8, 'rake': 0.0,
'approach': 'use_pnt_rup_from_usgs'}
rup, dic, _err = get_rup_dic(dic_in, user=user, use_shakemap=True)
self.assertEqual(dic['msr'], 'PointMSR')
self.assertAlmostEqual(rup.surface.length, 0.0133224)
self.assertAlmostEqual(rup.surface.width, 0.0070800)

def test_9(self):
dic_in = {'usgs_id': 'us6000jllz', 'lon': 37.0143, 'lat': 37.2256, 'dep': 10,
'mag': 7.8, 'msr': 'WC1994', 'aspect_ratio': 3,
'rake': -179.18, 'dip': 88.71, 'strike': 317.63,
'approach': 'build_rup_from_usgs'}
_rup, dic, _err = get_rup_dic(dic_in, user=user, use_shakemap=True)
self.assertEqual(dic['dep'], 10)
self.assertEqual(dic['dip'], 88.71)
self.assertEqual(dic['lat'], 37.2256)
self.assertEqual(dic['lon'], 37.0143)
self.assertEqual(dic['mag'], 7.8)
self.assertEqual(dic['msr'], 'WC1994')
self.assertEqual(dic['rake'], -179.18)
self.assertEqual(dic['strike'], 317.63)
self.assertEqual(dic['require_dip_strike'], True)
self.assertEqual(dic['aspect_ratio'], 3)

def test_10(self):
dic_in = {'usgs_id': 'us6000jllz', 'lon': 37.0143, 'lat': 37.2256, 'dep': 10.0,
'mag': 7.8, 'msr': 'WC1994', 'aspect_ratio': 2.0,
'rake': -179.18, 'dip': 88.71, 'strike': 317.63,
'approach': 'build_rup_from_usgs'}
_rup, _dic, err = get_rup_dic(
dic_in, user=user, use_shakemap=True)
self.assertIn('The depth must be greater', err['error_msg'])

def test_11(self):
dic_in = {'usgs_id': 'UserProvided', 'lon': -9, 'lat': 43, 'dep': 10,
'mag': 8.5, 'msr': 'WC1994', 'aspect_ratio': 1,
'rake': 90, 'dip': 90, 'strike': 0,
'approach': 'provide_rup_params'}
_rup, _dic, err = get_rup_dic(
dic_in, user=user, use_shakemap=False)
self.assertIn('The depth must be greater', err['error_msg'])


"""
NB: to profile a test you can use
Expand Down
7 changes: 0 additions & 7 deletions openquake/hazardlib/tests/shakemap/validate_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,6 @@ def test_1b(self):
self.assertIn('stations', rupdic['station_data_file'])
self.assertEqual(err, {})

def test_1c(self):
# giving a ValueError with aspect_ratio 2
POST = {'usgs_id': 'us6000jllz', 'approach': 'build_rup_from_usgs',
'msr': 'WC1994', 'aspect_ratio': '2'}
_rup, _rupdic, _params, err = impact_validate(POST, user)
self.assertIn('The depth must be greater', err['error_msg'])

def test_2(self):
POST = {'usgs_id': 'us7000n05d', 'approach': 'build_rup_from_usgs',
'msr': ''}
Expand Down
2 changes: 0 additions & 2 deletions openquake/server/static/js/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -751,8 +751,6 @@ function capitalizeFirstLetter(val) {
else if (data.require_dip_strike) {
$('#dip').prop('disabled', false);
$('#strike').prop('disabled', false);
$('#dip').val('90');
$('#strike').val('0');
} else {
$('#dip').prop('disabled', true);
$('#strike').prop('disabled', true);
Expand Down

0 comments on commit 9f1a059

Please sign in to comment.