Release notes v2.8#

Several improvements entered in this release, most notably about the disaggregation calculator and the classical calculator with sampling. Over 110 issues were closed. For the complete list of changes, please see the changelog: .


We changed the algorithm for building the disaggregation bins. The new algorithm is simpler and depends directly on the integration distance. The big advantage compared to the past algorithm is that the bins are always the same across different realizations, therefore it will be possible to implement statistical disaggregation outputs, like a mean disaggregation matrix. This is not done yet, but it is scheduled for future releases.

Thanks to the new algorithm, performing a classical calculation when iml_disagg is set in the job.ini file has become redundant: therefore, such step has been removed. The iml_disagg configuration variable is not documented in the manual, even if it entered a long time ago, because it should still be considered experimental.

We have added more checks and validations. In particular intensity_measure_types_and_levels cannot be set if iml_disagg is set (since it is inferred from it) and poes_disagg cannot be set if iml_disagg is set. Moreover, if one or more of the parameters mag_bin_width, distance_bin_width, coordinate_bin_width, num_epsilon_bins is missing in the job.ini file an early error is raised. There is also an a posteriori check when poes_disagg is given, raising a warning if the aggregated poes are too different from the expected ones (this may happen due to numerical interpolation errors when the disaggregation intensities are extracted from the inverse hazard curves).

Since the bins may be different than before and because of other changes (in particular now a disaggregation calculation may see a smaller logic tree than before since the reduction of the logic tree feature works better), having different disaggregation outputs than before is expected. However, since the internal algorithm implemented in the hazardlib library is exactly the same as before, in comparable situations (i.e. same bins, same logic tree) the numbers will be the same as before.

Other Hazard#

The progress on hazard was not limited to the disaggregation calculator. In particular, there was a crucial progress on the classical calculator in presence of sampling: we found a performance issue affecting calculations with an extra large GSIM logic tree (case in point: the India model, with 245,760 realizations). Now the engine is not stuck anymore while sampling the logic tree. In regular cases (i.e. if your model has less than 245,760 GSIM realizations) you will not see any performance difference, but you will still see that the produced numbers are different than in previous versions of the engine, since we changed the sampling algorithm and the way the realization weights are managed. This is akin to a change of seed: the really significant quantities will not change.

A lot of refactoring went into the logic tree code; as a consequence the data transfer in the realization objects has been reduced.

We fixed and documented in the manual the magnitude-distance filtering which now has become an official feature of the engine.

We changed the HDF5 format for hazard curves and maps, when exported via the command oq extract hazard/rlzs: now it is friendlier than before. The old format is still available via the command oq extract qgis-hazard/rlzs; the name reflects the fact that it is meant to be used by the QGIS plugin via the REST API.

We improved the task distribution in large hazard calculations by improving the filtering of MultiPointSources.

There has been some work also on hazardlib, in particular on the GMPEs for the SGS model.


For what concerns risk, we continued the work on the risk outputs initiated a few releases ago. In particular, we removed all the outputs that were deprecated in engine 2.7, since they can be generated dynamically with extraction commands, the REST API or via the QGIS plugin. Moreover some bugs in the outputs were fixed. In particular now the average losses for classical_risk are exposed to the engine (before they were computed but not visible from the engine database); same for the loss_curves-stats and loss_maps-stats. The command oq export loss_curves has been fixed. A rare ordering error happening in the classical_bcr calculator has been fixed.

The parameter number_of_ground_motion_fields is optional again in all calculators reading the GMFs from an external file (in engine 2.7 it was mandatory in some cases). We fixed several bugs in the new and still experimental calculator gmf_ebrisk. We added more validation tests to the input GMFs file in .csv format, and better error messages. In particular now there are good error messages if the user forgets sites and sites.csv in the job.ini, if the user sets a wrong site_id in the sites.csv file, if the user specifies a non-existing file in the job.ini, if the user sets conditional_loss_poes but forget to set asset_loss_table, if the user forget the source_model_logic_tree file or if the user forgets the --hc option in calculations that require it.


There are two new oq command: oq abort <calc_id> to kill a running job and oq zip <job.ini> <> to collect all the files relevant for a calculation in a single zip archive. This is crucial for users that have troubles with a specific calculation and want to send use their input files for help in debugging the issue.

oq dbserver stop has been extended to stop also the zmq workers, if the zmq distribution is used.

Now the WebUI starts new jobs in separate processes, thus achieving true parallelism: before it was possible to launch only one job at the time. Each job has a process name of the form oq-job-<calc_id>, so it is easy to find and kill jobs from the task manager. Similarly, the dbserver process is now called oq-dbserver and the workers processes are called oq-worker.

We fixed some bugs when reading openquake.cfg for a Python virtual environment.

oq engine --run now works with Python 3 too.


In this release we deprecated the .geojson exporters for hazard curves and maps. In the next release they will be removed. Hazard curves and maps should be exported in .csv or .hdf5 format, or even read programmatically from the datastore.

We removed the deprecated risk outputs dmg_by_tag, dmg_total losses_by_tag and losses_total. We removed the obsolete parameter loss_curve_resolution which has not been used for a few releases.

We removed the method gsim.disaggregate_poe, but the main hazardlib disaggregation utility, openquake.hazardlib.calc.disagg.disaggregation still works as before, it is just faster.

Python 2 decommissioning#

We completed phase 1 of our roadmap for abandoning Python 2. In short, even if the engine still supports Python 2.7 and you can use it by installing from sources, we only provides installers with Python 3.5 for Windows, macOS and Linux. The official Ubuntu and Red Had packages are still using Python 2.7, but they will replaced by Python 3.5 in phase 2 of the roadmap. Next year the engine will be Python 3 only. The time to migrate is now!