code: def create_keyword_file(self, algorithm):
          keyword_io = KeywordIO()
          mmi_default_classes = default_classification_thresholds(
              earthquake_mmi_scale
          )
          mmi_default_threshold = {
              earthquake_mmi_scale['key']: {
                  'active': True,
                  'classes': mmi_default_classes
              }
          }
          generic_default_classes = default_classification_thresholds(
              generic_hazard_classes
          )
          generic_default_threshold = {
              generic_hazard_classes['key']: {
                  'active': True,
                  'classes': generic_default_classes
              }
          }
          threshold_keyword = {}
          for exposure in exposure_all:
              if exposure in earthquake_mmi_scale['exposures']:
                  threshold_keyword[exposure['key']] = mmi_default_threshold
              else:
                  threshold_keyword[
                      exposure['key']] = generic_default_threshold
          extra_keywords = {
              extra_keyword_earthquake_latitude['key']: self.latitude,
              extra_keyword_earthquake_longitude['key']: self.longitude,
              extra_keyword_earthquake_magnitude['key']: self.magnitude,
              extra_keyword_earthquake_depth['key']: self.depth,
              extra_keyword_earthquake_description['key']: self.description,
              extra_keyword_earthquake_location['key']: self.location,
              extra_keyword_earthquake_event_time['key']: self.time.strftime(
                  '%Y-%m-%dT%H:%M:%S'),
              extra_keyword_time_zone['key']: self.time_zone,
              extra_keyword_earthquake_x_minimum['key']: self.x_minimum,
              extra_keyword_earthquake_x_maximum['key']: self.x_maximum,
              extra_keyword_earthquake_y_minimum['key']: self.y_minimum,
              extra_keyword_earthquake_y_maximum['key']: self.y_maximum,
              extra_keyword_earthquake_event_id['key']: self.event_id
          }
          for key, value in list(self.extra_keywords.items()):
              extra_keywords[key] = value
          empty_keys = []
          for key, value in list(extra_keywords.items()):
              if value is None:
                  empty_keys.append(key)
          for empty_key in empty_keys:
              extra_keywords.pop(empty_key)
          keywords = {
              'hazard': hazard_earthquake['key'],
              'hazard_category': hazard_category_single_event['key'],
              'keyword_version': inasafe_keyword_version,
              'layer_geometry': layer_geometry_raster['key'],
              'layer_mode': layer_mode_continuous['key'],
              'layer_purpose': layer_purpose_hazard['key'],
              'continuous_hazard_unit': unit_mmi['key'],
              'classification': earthquake_mmi_scale['key'],
              'thresholds': threshold_keyword,
              'extra_keywords': extra_keywords,
              'active_band': 1
          }
          if self.algorithm_name:
              layer_path = os.path.join(
                  self.output_dir, '%s-%s.tif' % (
                      self.output_basename, algorithm))
          else:
              layer_path = os.path.join(
                  self.output_dir, '%s.tif' % self.output_basename)
          if len(self.title.strip()) == 0:
              keyword_title = self.output_basename
          else:
              keyword_title = self.title
          keywords['title'] = keyword_title
          hazard_layer = QgsRasterLayer(layer_path, keyword_title)
          if not hazard_layer.isValid():
              raise InvalidLayerError()
          keyword_io.write_keywords(hazard_layer, keywords)