Source code for openquake.mbt.notebooks.project.project_create

import os
import re
import sys
import h5py
# MN: 'shutil' imported but not used
import shutil

from openquake.mbt.tests.tools.tools import delete_and_create_project_dir
from openquake.mbt.oqt_project import OQtProject, OQtModel
from configparser import ConfigParser

HDF5_FILES = ['completeness.hdf5', 'eqk_rates.hdf5',
              'hypo_close_to_faults.hdf5', 'hypo_depths.hdf5']


[docs] class AttrDict(dict): def __init__(self, *args, **kwargs): super(AttrDict, self).__init__(*args, **kwargs) self.__dict__ = self
[docs] def create_default_files(prj, project_dir): """ Creates the basic set of hdf5 files used to store information within a project :parameter prj: An instance of :class:`OQtProject` :parameter project_dir: The path to the folder where the project is created """ # # create the completeness .hdf5 file prj.compl_hdf5_filename = 'completeness.hdf5' compl_hdf5_filename = os.path.join(project_dir, prj.compl_hdf5_filename) fhdf5 = h5py.File(compl_hdf5_filename, 'a') fhdf5.close() # # create the .hdf5 file containing information on eqk rates for the # various sources prj.eqk_rates_hdf5_filename = 'eqk_rates.hdf5' eqk_rates_hdf5_filename = os.path.join(project_dir, prj.eqk_rates_hdf5_filename) fhdf5 = h5py.File(eqk_rates_hdf5_filename, 'a') fhdf5.close() # # create the .hdf5 file with info on eqks close to faults prj.hypo_close_to_flts_hdf5_filename = 'hypo_close_to_faults.hdf5' hypo_close_to_flts_hdf5_filename = os.path.join( project_dir, prj.hypo_close_to_flts_hdf5_filename) fhdf5 = h5py.File(hypo_close_to_flts_hdf5_filename, 'a') fhdf5.close() # # create the .hdf5 with hypocentral depth information prj.hypo_depths_hdf5_filename = 'hypo_depths.hdf5' hypod_hdf5_filename = os.path.join(project_dir, prj.hypo_depths_hdf5_filename) fhdf5 = h5py.File(hypod_hdf5_filename, 'a') fhdf5.close() # create the folder where to store hypo depth data hypo_folder = os.path.join(project_dir, 'hypo_depths') if not os.path.exists(hypo_folder): os.mkdir(hypo_folder) # # create the .hdf5 with focal mechanism information prj.focal_mech_hdf5_filename = 'focal_mechs.hdf5' focm_hdf5_filename = os.path.join(project_dir, prj.hypo_depths_hdf5_filename) fhdf5 = h5py.File(focm_hdf5_filename, 'a') fhdf5.close() # create the folder where to store focal mechanism data focm_folder = os.path.join(project_dir, 'focal_mechs') if not os.path.exists(focm_folder): os.mkdir(focm_folder)
[docs] def load_model_info(config, key): """ Loads into a model the information included in a .ini file. :parameter config: An instance of :class:`ConfigParser` :parameter key: The key identifying the section with the information to be loaded """ inimodel = getattr(config._sections, key) model = OQtModel(model_id=inimodel.id, name=inimodel.name) project_dir = os.path.abspath(config._sections.project.directory) # # loop over the variables assigned to a model for mkey in inimodel.keys(): if not re.search('^__', mkey): if re.search('filename$', mkey): # # if the key is for a filename we add the path tmp = os.path.abspath(getattr(inimodel, mkey)) path = os.path.relpath(tmp) setattr(model, mkey, path) else: setattr(model, mkey, getattr(inimodel, mkey)) # # updating hdf5 files for fname in HDF5_FILES: hdf5_filename = os.path.join(project_dir, fname) fhdf5 = h5py.File(hdf5_filename, 'a') if model.model_id not in fhdf5: # MN: 'grp' assigned but never used grp = fhdf5.create_group(model.model_id) fhdf5.close() # # add the model to the project return model
[docs] def add_subfolders(project_dir): """ This creates the subfolders within a project :parameter project_dir: The path to the directory where folders will be created """ subfolders = ['reports'] for subfolder in subfolders: path = os.path.join(project_dir, subfolder) if not os.path.exists(path): os.makedirs(path)
[docs] def project_create(argv): """ This creates a new `oqmbt` project :parameter argv: A list. The first argument contains the path to the folder where the project will be created. The second parameter is the folder (this overrides the `directory` parameter in the `project` section of the .ini file """ ini_filename = argv[0] print('Reading project information from: \n{:s}'.format(ini_filename)) assert os.path.exists(ini_filename) # # reading the .ini file config = ConfigParser(dict_type=AttrDict) config.read(ini_filename) # # set project dir and name if len(argv) > 1: project_dir = argv[1] config._sections.project.directory = project_dir else: project_dir = os.path.abspath(config._sections.project.directory) project_name = config._sections.project.name # # info print('Project directory : {:s}'.format((project_dir))) print('Project name : {:s}'.format((project_name))) # # create a clean project directory delete_and_create_project_dir(project_dir) # # create the project prj = OQtProject(project_name, project_dir) # MN: 'project_filename' assigned but never used project_filename = os.path.join(project_dir, prj._get_filename()) # # create default files create_default_files(prj, project_dir) # # add standard subfolders add_subfolders(project_dir) # # load information for the various models for key in config._sections.keys(): # # search for sections containing model information if re.search('^model', key): model = load_model_info(config, key) prj.add_model(model) # # save the project prj.save()
if __name__ == "__main__": project_create(sys.argv[1:])