def process_hazardset(hazardset_id, force=False): hazardset = DBSession.query(HazardSet).get(hazardset_id) if hazardset is None: raise ProcessException('Hazardset {} does not exist.' .format(hazardset_id)) chrono = datetime.datetime.now() if hazardset.processed: if force: hazardset.processed = False else: raise ProcessException('Hazardset {} has already been processed.' .format(hazardset.id)) logger.info(" Cleaning previous outputs") DBSession.query(Output) \ .filter(Output.hazardset_id == hazardset.id) \ .delete() DBSession.flush() type_settings = settings['hazard_types'][hazardset.hazardtype.mnemonic] with rasterio.drivers(): try: logger.info(" Opening raster files") # Open rasters layers = {} readers = {} if 'values' in type_settings.keys(): # preprocessed layer layer = DBSession.query(Layer) \ .filter(Layer.hazardset_id == hazardset.id) \ .one() reader = rasterio.open(layer_path(layer)) layers[0] = layer readers[0] = reader else: for level in (u'HIG', u'MED', u'LOW'): hazardlevel = HazardLevel.get(level) layer = DBSession.query(Layer) \ .filter(Layer.hazardset_id == hazardset.id) \ .filter(Layer.hazardlevel_id == hazardlevel.id) \ .one() reader = rasterio.open(layer_path(layer)) layers[level] = layer readers[level] = reader if ('mask_return_period' in type_settings): layer = DBSession.query(Layer) \ .filter(Layer.hazardset_id == hazardset.id) \ .filter(Layer.mask.is_(True)) \ .one() reader = rasterio.open(layer_path(layer)) layers['mask'] = layer readers['mask'] = reader outputs = create_outputs(hazardset, layers, readers) if outputs: DBSession.add_all(outputs) finally: logger.info(" Closing raster files") for key, reader in readers.iteritems(): if reader and not reader.closed: reader.close() hazardset.processed = True DBSession.flush() logger.info(' Successfully processed {}, {} outputs generated in {}' .format(hazardset.id, len(outputs), datetime.datetime.now() - chrono)) return True