forked from gem/oq-engine
/
oqvalidation.py
1664 lines (1459 loc) · 60.6 KB
/
oqvalidation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (C) 2014-2021 GEM Foundation
#
# OpenQuake is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenQuake is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with OpenQuake. If not, see <http://www.gnu.org/licenses/>.
import os
import re
import json
import inspect
import logging
import functools
import multiprocessing
import numpy
from openquake.baselib import __version__, hdf5, python3compat
from openquake.baselib.general import DictArray, AccumDict
from openquake.hazardlib.imt import from_string
from openquake.hazardlib.shakemap.maps import get_array
from openquake.hazardlib import correlation, stats, calc
from openquake.hazardlib import valid, InvalidFile
from openquake.sep.classes import SecondaryPeril
from openquake.commonlib import logictree, util
from openquake.risklib.riskmodels import get_risk_files
__doc__ = """\
Full list of configuration parameters
=====================================
Engine Version: %s
Some parameters have a default that it is used when the parameter is
not specified in the job.ini file. Some other parameters have no default,
which means that not specifying them will raise an error when running
a calculation for which they are required.
aggregate_by:
Used to compute aggregate losses and aggregate loss curves in risk
calculations. Takes in input one or more exposure tags.
Example: *aggregate_by = region, taxonomy*.
Default: empty list
amplification_method:
Used in classical PSHA calculations to amplify the hazard curves with
the convolution or kernel method.
Example: *amplification_method = convolution*.
Default: None
area_source_discretization:
Discretization parameters (in km) for area sources.
Example: *area_source_discretization = 10*.
Default: 10
ash_wet_amplification_factor:
Used in volcanic risk calculations.
Example: *ash_wet_amplification_factor=1.0*.
Default: 1.0
asset_correlation:
Used in risk calculations to take into account asset correlation. Accepts
only the values 1 (full correlation) and 0 (no correlation).
Example: *asset_correlation=1*.
Default: 0
asset_hazard_distance:
In km, used in risk calculations to print a warning when there are assets
too distant from the hazard sites.
Example: *asset_hazard_distance = 5*.
Default: 15
asset_life_expectancy:
Used in the classical_bcr calculator.
Example: *asset_life_expectancy = 50*.
Default: no default
assets_per_site_limit:
INTERNAL
avg_losses:
Used in risk calculations to compute average losses.
Example: *avg_losses=false*.
Default: True
base_path:
INTERNAL
cachedir:
INTERNAL
calculation_mode:
One of classical, disaggregation, event_based, scenario, scenario_risk,
scenario_damage, event_based_risk, classical_risk, classical_bcr.
Example: *calculation_mode=classical*
Default: no default
collapse_gsim_logic_tree:
INTERNAL
collapse_level:
INTERNAL
collect_rlzs:
Collect all realizations into a single effective realizations. Used in
event_based_risk calculations with sampling.
Example: *collect_rlzs=true*.
Default: False
compare_with_classical:
Used in event based calculation to perform also a classical calculation,
so that the hazard curves can be compared.
Example: *compare_with_classical = true*.
Default: False
complex_fault_mesh_spacing:
In km, used to discretize complex faults.
Example: *complex_fault_mesh_spacing = 15*.
Default: 5
concurrent_tasks:
A hint to the engine for the number of tasks to generate. Do not set
it unless you know what you are doing.
Example: *concurrent_tasks = 100*.
Default: twice the number of cores
conditional_loss_poes:
Used in classical_risk calculations to compute loss curves.
Example: *conditional_loss_poes = 0.01 0.02*.
Default: empty list
float_dmg_dist:
Flag used in scenario_damage calculations to specify that the damage
distributions should be stored as floating point numbers (float32)
and not as integers (uint32).
Example: *float_dmg_dist = true*.
Default: False
cholesky_limit:
When generating the GMFs from a ShakeMap the engine needs to perform a
Cholesky decomposition of a matrix of size (M x N)^2, being M the number
of intensity measure types and N the number of sites. The decomposition
can become ultra-slow, run out of memory, or produce bogus negative
eigenvalues, therefore there is a limit on the maximum size of M x N.
Example: *cholesky_limit = 1000*.
Default: 10,000
continuous_fragility_discretization:
Used when discretizing continuuos fragility functions.
Example: *continuous_fragility_discretization = 10*.
Default: 20
coordinate_bin_width:
Used in disaggregation calculations.
Example: *coordinate_bin_width = 1.0*.
Default: no default
cross_correlation:
Used in ShakeMap calculations. Valid choices are "yes", "no" "full",
same as for *spatial_correlation*.
Example: *cross_correlation = no*.
Default: "yes"
description:
A string describing the calculation.
Example: *description = Test calculation*.
Default: no default
disagg_by_src:
Flag used to enable disaggregation by source when possible.
Example: *disagg_by_src = true*.
Default: False
disagg_outputs:
Used in disaggregation calculations to restrict the number of exported
outputs.
Example: *disagg_outputs = Mag_Dist*
Default: list of all possible outputs
discard_assets:
Flag used in risk calculations to discard assets from the exposure.
Example: *discard_assets = true*.
Default: False
discard_trts:
Used to discard tectonic region types that do not contribute to the hazard.
Example: *discard_trts = Volcanic*.
Default: empty list
distance_bin_width:
In km, used in disaggregation calculations to specify the distance bins.
Example: *distance_bin_width = 20*.
Default: no default
ebrisk_maxsize:
INTERNAL
ignore_master_seed:
If set, estimate analytically the uncertainty on the losses due to the
uncertainty on the vulnerability functions.
Example: *ignore_master_seed = vulnerability*.
Default: None
export_dir:
Set the export directory.
Example: *export_dir = /tmp*.
Default: the current directory, "."
exports:
Specify what kind of outputs to export by default.
Example: *exports = csv, rst*.
Default: empty list
ground_motion_correlation_model:
Enable ground motion correlation.
Example: *ground_motion_correlation_model = JB2009*.
Default: None
ground_motion_correlation_params:
To be used together with ground_motion_correlation_model.
Example: *ground_motion_correlation_params = {"vs30_clustering": False}*.
Default: empty dictionary
ground_motion_fields:
Flag to turn on/off the calculation of ground motion fields.
Example: *ground_motion_fields = false*.
Default: True
gsim:
Used to specify a GSIM in scenario or event based calculations.
Example: *gsim = BooreAtkinson2008*.
Default: "[FromFile]"
hazard_calculation_id:
Used to specify a previous calculation from which the hazard is read.
Example: *hazard_calculation_id = 42*.
Default: None
hazard_curves_from_gmfs:
Used in scenario/event based calculations. If set, generates hazard curves
from the ground motion fields.
Example: *hazard_curves_from_gmfs = true*.
Default: False
hazard_maps:
Set it to true to export the hazard maps.
Example: *hazard_maps = true*.
Default: False
ignore_covs:
Used in risk calculations to set all the coefficients of variation of the
vulnerability functions to zero.
Example *ignore_covs = true*
Default: False
ignore_missing_costs:
Accepts exposures with missing costs (by discarding such assets).
Example: *ignore_missing_costs = nonstructural, business_interruption*.
Default: False
iml_disagg:
Used in disaggregation calculations to specify an intensity measure type
and level.
Example: *iml_disagg = {'PGA': 0.02}*.
Default: no default
individual_curves:
When set, store the individual hazard curves and/or individual risk curves
for each realization.
Example: *individual_curves = true*.
Default: False
inputs:
INTERNAL. Dictionary with the input files paths.
intensity_measure_types:
List of intensity measure types in an event based calculation.
Example: *intensity_measure_types = PGA SA(0.1)*.
Default: empty list
intensity_measure_types_and_levels:
List of intensity measure types and levels in a classical calculation.
Example: *intensity_measure_types_and_levels={"PGA": logscale(0.1, 1, 20)}*.
Default: empty dictionary
interest_rate:
Used in classical_bcr calculations.
Example: *interest_rate = 0.05*.
Default: no default
investigation_time:
Hazard investigation time in years, used in classical and event based
calculations.
Example: *investigation_time = 50*.
Default: no default
lrem_steps_per_interval:
Used in the vulnerability functions.
Example: *lrem_steps_per_interval = 1*.
Default: 0
mag_bin_width:
Width of the magnitude bin used in disaggregation calculations.
Example: *mag_bin_width = 0.5*.
Default: no default
master_seed:
Seed used to control the generation of the epsilons, relevant for risk
calculations with vulnerability functions with nonzero coefficients of
variation.
Example: *master_seed = 1234*.
Default: 123456789
max:
Compute the maximum across realizations. Akin to mean and quantiles.
Example: *max = true*.
Default: False
max_data_transfer:
INTERNAL. Restrict the maximum data transfer in disaggregation calculations.
max_potential_gmfs:
Restrict the product *num_sites * num_events*.
Example: *max_potential_gmfs = 1E9*.
Default: 2E11
max_potential_paths:
Restrict the maximum number of realizations.
Example: *max_potential_paths = 200*.
Default: 100
max_sites_disagg:
Maximum number of sites for which to store rupture information.
In disaggregation calculations with many sites you may be forced to raise
*max_sites_disagg*, that must be greater or equal to the number of sites.
Example: *max_sites_disagg = 100*
Default: 10
max_sites_per_gmf:
Restrict the maximum number of sites in event based calculation with GMFs.
Example: *max_sites_per_gmf = 100_000*.
Default: 65536
max_sites_per_tile:
INTERNAL
max_weight:
INTERNAL
maximum_distance:
Integration distance. Can be give as a scalar, as a dictionary TRT -> scalar
or as dictionary TRT -> [(mag, dist), ...]
Example: *maximum_distance = 200*.
Default: no default
mean:
Flag to enable/disable the calculation of mean curves.
Example: *mean = false*.
Default: True
min_weight:
INTERNAL
minimum_asset_loss:
Used in risk calculations. If set, losses smaller than the
*minimum_asset_loss* are consider zeros.
Example: *minimum_asset_loss = {"structural": 1000}*.
Default: empty dictionary
minimum_intensity:
If set, ground motion values below the *minimum_intensity* are
considered zeros.
Example: *minimum_intensity = {'PGA': .01}*.
Default: empty dictionary
minimum_magnitude:
If set, ruptures below the *minimum_magnitude* are discarded.
Example: *minimum_magnitude = 5.0*.
Default: 0
modal_damage_state:
Used in scenario_damage calculations to export only the damage state
with the highest probability.
Example: *modal_damage_state = true*.
Default: false
num_epsilon_bins:
Number of epsilon bins in disaggregation calculations.
Example: *num_epsilon_bins = 3*.
Default: no default
num_rlzs_disagg:
Used in disaggregation calculation to specify how many outputs will be
generated.
Example: *num_rlzs_disagg=1*.
Default: None
number_of_ground_motion_fields:
Used in scenario calculations to specify how many random ground motion
fields to generate.
Example: *number_of_ground_motion_fields = 100*.
Default: no default
number_of_logic_tree_samples:
Used to specify the number of realizations to generate when using logic tree
sampling. If zero, full enumeration is performed.
Example: *number_of_logic_tree_samples = 0*.
Default: no default
poes:
Probabilities of Exceedance used to specify the hazard maps or hazard spectra
to compute.
Example: *poes = 0.01 0.02*.
Default: empty list
poes_disagg:
Alias for poes.
pointsource_distance:
Used in classical calculations to collapse the point sources. Can also be
used in conjunction with *ps_grid_spacing*.
Example: *pointsource_distance = 50*.
Default: empty dictionary
ps_grid_spacing:
Used in classical calculations to grid the point sources. Requires the
*pointsource_distance* to be set too.
Example: *ps_grid_spacing = 50*.
Default: no default
quantiles:
List of probabilities used to compute the quantiles across realizations.
Example: quantiles = 9.15 0.50 0.85
Default: empty list
random_seed:
Seed used in the sampling of the logic tree.
Example: *random_seed = 1234*.
Default: 42
reference_backarc:
Used when there is no site model to specify a global backarc parameter,
used in some GMPEs. Can be True or False
Example: *reference_backarc = true*.
Default: False
reference_depth_to_1pt0km_per_sec:
Used when there is no site model to specify a global z1pt0 parameter,
used in some GMPEs.
Example: *reference_depth_to_1pt0km_per_sec = 100*.
Default: no default
reference_depth_to_2pt5km_per_sec:
Used when there is no site model to specify a global z2pt5 parameter,
used in some GMPEs.
Example: *reference_depth_to_2pt5km_per_sec = 5*.
Default: no default
reference_siteclass:
Used when there is no site model to specify a global site class.
The siteclass is a one-character letter used in some GMPEs, like the
McVerry (2006), and has values "A", "B", "C" or "D".
Example: *reference_siteclass = "A"*.
Default: "D"
reference_soiltype:
Used when there is no site model to specify a global soil type.
The soiltype is an integer between 1 (rock) and 6, and it is used in some
GMPEs, like Idini (2017).
Example: *reference_soiltype = 3*.
Default: 1
reference_vs30_type:
Used when there is no site model to specify a global vs30 type.
The choices are "inferred" or "measured"
Example: *reference_vs30_type = inferred".
Default: "measured"
reference_vs30_value:
Used when there is no site model to specify a global vs30 value.
Example: *reference_vs30_value = 760*.
Default: no default
region:
A list of lon/lat pairs used to specify a region of interest
Example: *region = 10.0 43.0, 12.0 43.0, 12.0 46.0, 10.0 46.0*
Default: None
region_grid_spacing:
Used together with the *region* option to generate the hazard sites.
Example: *region_grid_spacing = 10*.
Default: None
return_periods:
Used in the computation of the loss curves.
Example: *return_periods = 200 500 1000*.
Default: empty list.
risk_imtls:
INTERNAL. Automatically set by the engine.
risk_investigation_time:
Used in risk calculations. If not specified, the (hazard) investigation_time
is used instead.
Example: *risk_investigation_time = 50*.
Default: None
rlz_index:
Used in disaggregation calculations to specify the realization from which
to start the disaggregation.
Example: *rlz_index = 0*.
Default: None
rupture_mesh_spacing:
Set the discretization parameter (in km) for rupture geometries.
Example: *rupture_mesh_spacing = 2.0*.
Default: 5.0
ruptures_per_block:
INTERNAL
sampling_method:
One of early_weights, late_weights, early_latin, late_latin)
Example: *sampling_method = early_latin*.
Default: 'early_weights'
save_disk_space:
INTERNAL
sec_peril_params:
INTERNAL
secondary_perils:
INTERNAL
secondary_simulations:
INTERNAL
sensitivity_analysis:
Dictionary describing a sensitivity analysis.
Example: *sensitivity_analysis = {'maximum_distance': [200, 300]}*.
Default: empty dictionary
ses_per_logic_tree_path:
Set the number of stochastic event sets per logic tree realization in
event based calculations.
Example: *ses_per_logic_tree_path = 100*.
Default: 1
ses_seed:
Seed governing the generation of the ground motion field.
Example: *ses_seed = 123*.
Default: 42
shakemap_id:
Used in ShakeMap calculations to download a ShakeMap from the USGS site
Example: *shakemap_id = usp000fjta*.
Default: no default
shakemap_uri:
Dictionary used in ShakeMap calculations to specify a ShakeMap. Must contain
a key named "kind" with values "usgs_id", "usgs_xml" or "file_npy".
Example: *shakemap_uri = {
"kind": "usgs_xml",
"grid_url": "file:///home/michele/usp000fjta/grid.xml",
"uncertainty_url": "file:///home/michele/usp000fjta/uncertainty.xml"*.
Default: empty dictionary
shift_hypo:
Used in classical calculations to shift the rupture hypocenter.
Example: *shift_hypo = true*.
Default: false
site_effects:
Flag used in ShakeMap calculations to turn out GMF amplification
Example: *site_effects = true*.
Default: False
sites:
Used to specify a list of sites.
Example: *sites = 10.1 45, 10.2 45*.
sites_slice:
INTERNAL
soil_intensities:
Used in classical calculations with amplification_method = convolution
source_id:
Used for debugging purposes. When given, restricts the source model to the
given source IDs.
Example: *source_id = src001 src002*.
Default: empty list
spatial_correlation:
Used in the ShakeMap calculator. The choics are "yes", "no" and "full".
Example: *spatial_correlation = full*.
Default: "yes"
specific_assets:
INTERNAL
split_sources:
INTERNAL
std:
Compute the standard deviation across realizations. Akin to mean and max.
Example: *std = true*.
Default: False
steps_per_interval:
Used in the fragility functions when building the intensity levels
Example: *steps_per_interval = 4*.
Default: 1
time_event:
Used in scenario_risk calculations when the occupancy depend on the time.
Valid choices are "day", "night", "transit".
Example: *time_event = day*.
Default: None
truncation_level:
Truncation level used in the GMPEs.
Example: *truncation_level = 0* to compute median GMFs.
Default: no default
uniform_hazard_spectra:
Flag used to generated uniform hazard specta for the given poes
Example: *uniform_hazard_spectra = true*.
Default: False
vs30_tolerance:
Used when amplification_method = convolution.
Example: *vs30_tolerance = 20*.
Default: 0
width_of_mfd_bin:
Used to specify the width of the Magnitude Frequency Distribution.
Example: *width_of_mfd_bin = 0.2*.
Default: None
""" % __version__
GROUND_MOTION_CORRELATION_MODELS = ['JB2009', 'HM2018']
TWO16 = 2 ** 16 # 65536
TWO32 = 2 ** 32
U16 = numpy.uint16
U32 = numpy.uint32
U64 = numpy.uint64
F32 = numpy.float32
F64 = numpy.float64
def check_same_levels(imtls):
"""
:param imtls: a dictionary (or dict-like) imt -> imls
:returns: the periods and the levels
:raises: a ValueError if the levels are not the same across all IMTs
"""
if not imtls:
raise ValueError('There are no intensity_measure_types_and_levels!')
imls = imtls[next(iter(imtls))]
for imt in imtls:
if not imt.startswith(('PGA', 'SA')):
raise ValueError('Site amplification works only with '
'PGA and SA, got %s' % imt)
if (imtls[imt] == 0).all():
raise ValueError(
'You forgot to set intensity_measure_types_and_levels!')
elif len(imtls[imt]) != len(imls) or any(
l1 != l2 for l1, l2 in zip(imtls[imt], imls)):
raise ValueError('Site amplification works only if the '
'levels are the same across all IMTs')
periods = [from_string(imt).period for imt in imtls]
return periods, imls
class OqParam(valid.ParamSet):
KNOWN_INPUTS = {'rupture_model', 'exposure', 'site_model',
'source_model', 'shakemap', 'gmfs', 'gsim_logic_tree',
'source_model_logic_tree', 'hazard_curves', 'insurance',
'sites', 'job_ini', 'multi_peril', 'taxonomy_mapping',
'fragility', 'consequence', 'reqv', 'input_zip',
'amplification',
'nonstructural_vulnerability',
'nonstructural_fragility',
'nonstructural_consequence',
'structural_vulnerability',
'structural_fragility',
'structural_consequence',
'contents_vulnerability',
'contents_fragility',
'contents_consequence',
'business_interruption_vulnerability',
'business_interruption_fragility',
'business_interruption_consequence',
'structural_vulnerability_retrofitted',
'occupants_vulnerability'}
hazard_imtls = {}
siteparam = dict(
vs30measured='reference_vs30_type',
vs30='reference_vs30_value',
z1pt0='reference_depth_to_1pt0km_per_sec',
z2pt5='reference_depth_to_2pt5km_per_sec',
siteclass='reference_siteclass',
backarc='reference_backarc',
soiltype='reference_soiltype')
aggregate_by = valid.Param(valid.namelist, [])
amplification_method = valid.Param(
valid.Choice('convolution', 'kernel'), None)
minimum_asset_loss = valid.Param(valid.floatdict, {'default': 0})
area_source_discretization = valid.Param(
valid.NoneOr(valid.positivefloat), None)
asset_correlation = valid.Param(valid.Choice('0', '1'), 0)
asset_life_expectancy = valid.Param(valid.positivefloat)
assets_per_site_limit = valid.Param(valid.positivefloat, 1000)
avg_losses = valid.Param(valid.boolean, True)
base_path = valid.Param(valid.utf8, '.')
calculation_mode = valid.Param(valid.Choice()) # -> get_oqparam
collapse_gsim_logic_tree = valid.Param(valid.namelist, [])
collapse_level = valid.Param(valid.Choice('0', '1', '2', '3'), 0)
collect_rlzs = valid.Param(valid.boolean, False)
coordinate_bin_width = valid.Param(valid.positivefloat)
compare_with_classical = valid.Param(valid.boolean, False)
concurrent_tasks = valid.Param(
valid.positiveint, multiprocessing.cpu_count() * 2) # by M. Simionato
conditional_loss_poes = valid.Param(valid.probabilities, [])
continuous_fragility_discretization = valid.Param(valid.positiveint, 20)
cross_correlation = valid.Param(valid.Choice('yes', 'no', 'full'), 'yes')
cholesky_limit = valid.Param(valid.positiveint, 10_000)
cachedir = valid.Param(valid.utf8, '')
description = valid.Param(valid.utf8_not_empty)
disagg_by_src = valid.Param(valid.boolean, False)
disagg_outputs = valid.Param(valid.disagg_outputs,
list(calc.disagg.pmf_map))
discard_assets = valid.Param(valid.boolean, False)
discard_trts = valid.Param(str, '') # tested in the cariboo example
distance_bin_width = valid.Param(valid.positivefloat)
float_dmg_dist = valid.Param(valid.boolean, False)
mag_bin_width = valid.Param(valid.positivefloat)
ignore_master_seed = valid.Param(valid.boolean, False)
export_dir = valid.Param(valid.utf8, '.')
exports = valid.Param(valid.export_formats, ())
ground_motion_correlation_model = valid.Param(
valid.NoneOr(valid.Choice(*GROUND_MOTION_CORRELATION_MODELS)), None)
ground_motion_correlation_params = valid.Param(valid.dictionary, {})
ground_motion_fields = valid.Param(valid.boolean, True)
gsim = valid.Param(valid.utf8, '[FromFile]')
hazard_calculation_id = valid.Param(valid.NoneOr(valid.positiveint), None)
hazard_curves_from_gmfs = valid.Param(valid.boolean, False)
hazard_maps = valid.Param(valid.boolean, False)
ignore_missing_costs = valid.Param(valid.namelist, [])
ignore_covs = valid.Param(valid.boolean, False)
iml_disagg = valid.Param(valid.floatdict, {}) # IMT -> IML
individual_curves = valid.Param(valid.boolean, False)
inputs = valid.Param(dict, {})
ash_wet_amplification_factor = valid.Param(valid.positivefloat, 1.0)
intensity_measure_types = valid.Param(valid.intensity_measure_types, '')
intensity_measure_types_and_levels = valid.Param(
valid.intensity_measure_types_and_levels, None)
interest_rate = valid.Param(valid.positivefloat)
investigation_time = valid.Param(valid.positivefloat, None)
lrem_steps_per_interval = valid.Param(valid.positiveint, 0)
steps_per_interval = valid.Param(valid.positiveint, 1)
master_seed = valid.Param(valid.positiveint, 123456789)
maximum_distance = valid.Param(valid.MagDepDistance.new) # km
asset_hazard_distance = valid.Param(valid.floatdict, {'default': 15}) # km
max = valid.Param(valid.boolean, False)
max_data_transfer = valid.Param(valid.positivefloat, 2E11)
max_potential_gmfs = valid.Param(valid.positiveint, 2E11)
max_potential_paths = valid.Param(valid.positiveint, 100)
max_sites_per_gmf = valid.Param(valid.positiveint, 65536)
max_sites_per_tile = valid.Param(valid.positiveint, 500_000)
max_sites_disagg = valid.Param(valid.positiveint, 10)
mean_hazard_curves = mean = valid.Param(valid.boolean, True)
std = valid.Param(valid.boolean, False)
minimum_intensity = valid.Param(valid.floatdict, {}) # IMT -> minIML
minimum_magnitude = valid.Param(valid.floatdict, {'default': 0}) # by TRT
modal_damage_state = valid.Param(valid.boolean, False)
number_of_ground_motion_fields = valid.Param(valid.positiveint)
number_of_logic_tree_samples = valid.Param(valid.positiveint, 0)
num_epsilon_bins = valid.Param(valid.positiveint)
num_rlzs_disagg = valid.Param(valid.positiveint, None)
poes = valid.Param(valid.probabilities, [])
poes_disagg = valid.Param(valid.probabilities, [])
pointsource_distance = valid.Param(valid.MagDepDistance.new, None)
ps_grid_spacing = valid.Param(valid.positivefloat, None)
quantile_hazard_curves = quantiles = valid.Param(valid.probabilities, [])
random_seed = valid.Param(valid.positiveint, 42)
reference_depth_to_1pt0km_per_sec = valid.Param(
valid.positivefloat, numpy.nan)
reference_depth_to_2pt5km_per_sec = valid.Param(
valid.positivefloat, numpy.nan)
reference_vs30_type = valid.Param(
valid.Choice('measured', 'inferred'), 'measured')
reference_vs30_value = valid.Param(
valid.positivefloat, numpy.nan)
reference_siteclass = valid.Param(valid.Choice('A', 'B', 'C', 'D'), 'D')
reference_backarc = valid.Param(valid.boolean, False)
reference_soiltype = valid.Param(valid.positiveints, 1)
region = valid.Param(valid.wkt_polygon, None)
region_grid_spacing = valid.Param(valid.positivefloat, None)
risk_imtls = valid.Param(valid.intensity_measure_types_and_levels, {})
risk_investigation_time = valid.Param(valid.positivefloat, None)
rlz_index = valid.Param(valid.positiveints, None)
rupture_mesh_spacing = valid.Param(valid.positivefloat, 5.0)
complex_fault_mesh_spacing = valid.Param(
valid.NoneOr(valid.positivefloat), None)
return_periods = valid.Param(valid.positiveints, [])
ruptures_per_block = valid.Param(valid.positiveint, 500) # for UCERF
sampling_method = valid.Param(
valid.Choice('early_weights', 'late_weights',
'early_latin', 'late_latin'), 'early_weights')
save_disk_space = valid.Param(valid.boolean, False)
secondary_perils = valid.Param(valid.namelist, [])
sec_peril_params = valid.Param(valid.dictionary, {})
secondary_simulations = valid.Param(valid.dictionary, {})
sensitivity_analysis = valid.Param(valid.dictionary, {})
ses_per_logic_tree_path = valid.Param(
valid.compose(valid.nonzero, valid.positiveint), 1)
ses_seed = valid.Param(valid.positiveint, 42)
shakemap_id = valid.Param(valid.nice_string, None)
shakemap_uri = valid.Param(valid.dictionary, {})
shift_hypo = valid.Param(valid.boolean, False)
site_effects = valid.Param(valid.boolean, False) # shakemap amplification
sites = valid.Param(valid.NoneOr(valid.coordinates), None)
sites_slice = valid.Param(valid.simple_slice, (None, None))
soil_intensities = valid.Param(valid.positivefloats, None)
source_id = valid.Param(valid.namelist, [])
spatial_correlation = valid.Param(valid.Choice('yes', 'no', 'full'), 'yes')
specific_assets = valid.Param(valid.namelist, [])
split_sources = valid.Param(valid.boolean, True)
ebrisk_maxsize = valid.Param(valid.positivefloat, 2E10) # used in ebrisk
# NB: you cannot increase too much min_weight otherwise too few tasks will
# be generated in cases like Ecuador inside full South America
min_weight = valid.Param(valid.positiveint, 200) # used in classical
max_weight = valid.Param(valid.positiveint, 1E6) # used in classical
time_event = valid.Param(str, None)
truncation_level = valid.Param(valid.NoneOr(valid.positivefloat), None)
uniform_hazard_spectra = valid.Param(valid.boolean, False)
vs30_tolerance = valid.Param(valid.positiveint, 0)
width_of_mfd_bin = valid.Param(valid.positivefloat, None)
@property
def risk_files(self):
try:
return self._risk_files
except AttributeError:
self._risk_files = get_risk_files(self.inputs)
return self._risk_files
@property
def input_dir(self):
"""
:returns: absolute path to where the job.ini is
"""
return os.path.abspath(os.path.dirname(self.inputs['job_ini']))
def get_reqv(self):
"""
:returns: an instance of class:`RjbEquivalent` if reqv_hdf5 is set
"""
if 'reqv' not in self.inputs:
return
return {key: valid.RjbEquivalent(value)
for key, value in self.inputs['reqv'].items()}
def __init__(self, **names_vals):
if '_job_id' in names_vals: # called from engine
del names_vals['_job_id']
# support legacy names
for name in list(names_vals):
if name == 'quantile_hazard_curves':
names_vals['quantiles'] = names_vals.pop(name)
elif name == 'mean_hazard_curves':
names_vals['mean'] = names_vals.pop(name)
elif name == 'max':
names_vals['max'] = names_vals.pop(name)
super().__init__(**names_vals)
if 'job_ini' not in self.inputs:
self.inputs['job_ini'] = '<in-memory>'
job_ini = self.inputs['job_ini']
if 'calculation_mode' not in names_vals:
raise InvalidFile('Missing calculation_mode in %s' % job_ini)
if 'region_constraint' in names_vals:
if 'region' in names_vals:
raise InvalidFile('You cannot have both region and '
'region_constraint in %s' % job_ini)
logging.warning(
'region_constraint is obsolete, use region instead')
self.region = valid.wkt_polygon(
names_vals.pop('region_constraint'))
self.risk_investigation_time = (
self.risk_investigation_time or self.investigation_time)
self.collapse_level = int(self.collapse_level)
if ('intensity_measure_types_and_levels' in names_vals and
'intensity_measure_types' in names_vals):
logging.warning('Ignoring intensity_measure_types since '
'intensity_measure_types_and_levels is set')
if 'iml_disagg' in names_vals:
self.iml_disagg.pop('default')
# normalize things like SA(0.10) -> SA(0.1)
self.iml_disagg = {str(from_string(imt)): [iml]
for imt, iml in self.iml_disagg.items()}
self.hazard_imtls = self.iml_disagg
if 'intensity_measure_types_and_levels' in names_vals:
raise InvalidFile(
'Please remove the intensity_measure_types_and_levels '
'from %s: they will be inferred from the iml_disagg '
'dictionary' % job_ini)
elif 'intensity_measure_types_and_levels' in names_vals:
self.hazard_imtls = self.intensity_measure_types_and_levels
delattr(self, 'intensity_measure_types_and_levels')
lens = set(map(len, self.hazard_imtls.values()))
if len(lens) > 1:
dic = {imt: len(ls) for imt, ls in self.hazard_imtls.items()}
raise ValueError(
'Each IMT must have the same number of levels, instead '
'you have %s' % dic)
elif 'intensity_measure_types' in names_vals:
self.hazard_imtls = dict.fromkeys(
self.intensity_measure_types, [0])
delattr(self, 'intensity_measure_types')
if ('ps_grid_spacing' in names_vals and
'pointsource_distance' not in names_vals):
raise InvalidFile('%s: ps_grid_spacing requires setting a '
'pointsource_distance!' % self.inputs['job_ini'])
self._risk_files = get_risk_files(self.inputs)
if self.hazard_precomputed() and self.job_type == 'risk':
self.check_missing('site_model', 'debug')
self.check_missing('gsim_logic_tree', 'debug')
self.check_missing('source_model_logic_tree', 'debug')
# check investigation_time
if (self.investigation_time and
self.calculation_mode.startswith('scenario')):
raise ValueError('%s: there cannot be investigation_time in %s'
% (self.inputs['job_ini'], self.calculation_mode))
# check the gsim_logic_tree
if self.inputs.get('gsim_logic_tree'):
if self.gsim != '[FromFile]':
raise InvalidFile('%s: if `gsim_logic_tree_file` is set, there'
' must be no `gsim` key' % job_ini)
path = os.path.join(
self.base_path, self.inputs['gsim_logic_tree'])
gsim_lt = logictree.GsimLogicTree(path, ['*'])
# check the IMTs vs the GSIMs
self._trts = set(gsim_lt.values)
for gsims in gsim_lt.values.values():
self.check_gsims(gsims)
elif self.gsim is not None:
self.check_gsims([valid.gsim(self.gsim, self.base_path)])
# check inputs
unknown = set(self.inputs) - self.KNOWN_INPUTS
if unknown:
raise ValueError('Unknown key %s_file in %s' %
(unknown.pop(), self.inputs['job_ini']))
# checks for disaggregation
if self.calculation_mode == 'disaggregation':
if not self.poes_disagg and self.poes:
self.poes_disagg = self.poes
elif not self.poes and self.poes_disagg:
self.poes = self.poes_disagg
elif self.poes != self.poes_disagg:
raise InvalidFile(
'poes_disagg != poes: %s!=%s in %s' %
(self.poes_disagg, self.poes, self.inputs['job_ini']))
if not self.poes_disagg and not self.iml_disagg:
raise InvalidFile('poes_disagg or iml_disagg must be set '
'in %(job_ini)s' % self.inputs)
elif self.poes_disagg and self.iml_disagg:
raise InvalidFile(
'%s: iml_disagg and poes_disagg cannot be set '
'at the same time' % job_ini)
for k in ('mag_bin_width', 'distance_bin_width',
'coordinate_bin_width', 'num_epsilon_bins'):
if k not in vars(self):
raise InvalidFile('%s must be set in %s' % (k, job_ini))
if self.disagg_outputs and not any(
'Eps' in out for out in self.disagg_outputs):
self.num_epsilon_bins = 1
if (self.rlz_index is not None
and self.num_rlzs_disagg is not None):