def test_from_CMTSOLUTION_file(cmt): origin_time = obspy.UTCDateTime(2001, 9, 9, 23, 59, 17.78) cmt_time = origin_time + 2.0 cmt_true = \ CMTSource(origin_time=origin_time, pde_latitude=34.0745, pde_longitude=-118.3792, pde_depth_in_m=6400, mb=4.2, ms=4.2, region_tag="Hollywood", eventname="9703873", cmt_time=cmt_time, half_duration=1.0, latitude=34.1745, longitude=-118.4792, depth_in_m=5400.0, m_rr=1.0e22, m_tt=-1.0e22) assert cmt == cmt_true
def get_stats_json(filename): """Reads the stats json and outputs dictionary with all the necessary data """ d = load_json(os.path.abspath(filename)) data_container = { "sta_lon": np.array(d["sta_lon"]), "sta_lat": np.array(d["sta_lat"]), "nwindows": d["nwindows"], "nwin_on_trace": d["nwin_on_trace"] } cmtsource = CMTSource.from_dictionary(d["oldcmt"]) new_cmtsource = CMTSource.from_dictionary(d["newcmt"]) config = Struct(**d["config"]) nregions = d["nregions"] bootstrap_mean = np.array(d["bootstrap_mean"]) bootstrap_std = np.array(d["bootstrap_std"]) var_reduction = d["var_reduction"] mode = d["mode"] G = d["G"] stats = d["stats"] return (data_container, cmtsource, new_cmtsource, config, nregions, bootstrap_mean, bootstrap_std, var_reduction, mode, G, stats)
def test_pycmt3d(): npar = 9 cmtsource = CMTSource.from_CMTSOLUTION_file(cmtfile) # modify the flexwin output file by adding the absolute path flexwin_output = modify_input_winfile(original_flexwin_output) data_con = DataContainer(PAR_LIST[0:npar]) data_con.add_measurements_from_sac(flexwin_output) config = Config(npar, dlocation=0.03, ddepth=3.0, dmoment=2.0e+23, weight_data=True, weight_function=None, normalize_window=True, station_correction=True, zero_trace=True, double_couple=False, lamda_damping=0.0, bootstrap=True) srcinv = Cmt3D(cmtsource, data_con, config) srcinv.source_inversion()
def gradient(cmt_file_db, param_path): """Runs the actual inversion. :param cmt_file_db: :param param_path: :return: Nothing, inversion results are written to file. """ # Inversion Params inversionparam_path = os.path.join(param_path, "CMTInversion/InversionParams.yml") INV_params = read_yaml_file(inversionparam_path) # Weight Params weightparam_path = os.path.join(param_path, "CMTInversion/WeightParams.yml") weight_params = read_yaml_file(weightparam_path) # Check if grid search should be performed from the parameters file if not bool(INV_params["gridsearch"]): return # Get processing path from cmt_filename in database cmt_dir = os.path.dirname(os.path.abspath(cmt_file_db)) # Create cmt source: cmtsource = CMTSource.from_CMTSOLUTION_file(cmt_file_db) # Inversion dictionary directory inv_dict_dir = os.path.join(cmt_dir, "inversion", "inversion_dicts") # Inversion dictionaries inv_dict_files = glob.glob(os.path.join(inv_dict_dir, "grid*")) # Inversion output directory inv_out_dir = os.path.join(cmt_dir, "inversion", "inversion_output", "g3d") # WRite start of inversion process logger.info(" ") logger.info("#######################################################") logger.info("# #") logger.info("# Starting inversion ... #") logger.info("# #") logger.info("#######################################################") logger.info(" ") # Creating Data container dcon = DataContainer() for _i, inv_dict_file in enumerate(inv_dict_files): # Get processing band bandstring1 = str(os.path.basename(inv_dict_file).split(".")[1]) if "surface" in bandstring1 or "body" in bandstring1: bandstring = bandstring1.split("#")[0] else: bandstring = bandstring1 band = [float(x) for x in bandstring.split("_")] logger.info(" ") logger.info(" " + 54 * "*") logger.info(" Getting data for inversion from period band:") logger.info(" Low: %d s || High: %d s" % tuple(band)) logger.info(" " + 54 * "*") logger.info(" ") # Load inversion file dictionary inv_dict = read_yaml_file(inv_dict_file) asdf_dict = inv_dict["asdf_dict"] window_file = inv_dict["window_file"] # Adding measurements # Print Inversion parameters: logger.info(" Adding measurements to data container:") logger.info(" _____________________________________________________") logger.info(" ") # Add measurements from ASDF file and windowfile logger.info(" Window file:") logger.info(" " + window_file) logger.info(" ") logger.info(" ASDF files:") for key, value in asdf_dict.items(): logger.info(" " + key + ": " + value) dcon.add_measurements_from_asdf(window_file, asdf_dict) logger.info(" _____________________________________________________") logger.info(" ... ") logger.info(" ") logger.info(" ... ") logger.info(" Setting up inversion classes .... ") logger.info(" " + 54 * "*") logger.info(" ... ") # Setting up weight config inv_weight_config = weight_params["weight_config"] grad3d_params = INV_params["grad3d_config"] weight_config_grad3d = WeightConfig( normalize_by_energy=inv_weight_config["normalize_by_energy"], normalize_by_category=inv_weight_config["normalize_by_category"], azi_bins=inv_weight_config["azi_bins"], azi_exp_idx=inv_weight_config["azi_exp_idx"]) grad3d_config = Gradient3dConfig( method=grad3d_params["method"], weight_data=bool(grad3d_params["weight_data"]), weight_config=weight_config_grad3d, # flag to use the gradient method on inverted traces. taper_type=grad3d_params["taper_type"], c1=float(grad3d_params["c1"]), c2=float(grad3d_params["c2"]), idt=float(grad3d_params["idt"]), ia=float(grad3d_params["ia"]), nt=int(grad3d_params["nt"]), nls=int(grad3d_params["nls"]), crit=float(grad3d_params["crit"]), precond=bool(grad3d_params["precond"]), reg=bool(grad3d_params["reg"]), bootstrap=bool(grad3d_params["bootstrap"]), bootstrap_repeat=int(grad3d_params["bootstrap_repeat"]), bootstrap_subset_ratio=float(grad3d_params["bootstrap_subset_ratio"]), mpi_env=bool(grad3d_params["mpi_env"]), parallel=bool(grad3d_params["parallel"])) logger.info(" PyCMT3D is finding an improved CMTSOLUTION .... ") logger.info(" " + 54 * "*") logger.info(" ") logger.info(" ") # Create Gradient3d class g3d = Gradient3d(cmtsource, dcon, grad3d_config) # Run inversion g3d.search() # Plot results if bool(INV_params["summary_plot"]): pass # g3d.plot_summary(inv_out_dir, figure_format="pdf") if bool(INV_params["statistics_plot"]): # Plot Statistics for inversion g3d.plot_stats_histogram(outputdir=inv_out_dir) if bool(INV_params["summary_json"]): g3d.write_summary_json(outputdir=inv_out_dir, mode="global") if bool(INV_params["write_new_cmt"]): g3d.write_new_cmtfile(outputdir=inv_out_dir) if bool(INV_params["write_new_synt"]): g3d.write_new_syn(outputdir=os.path.join(inv_out_dir, "new_synt"), file_format="asdf") if bool(INV_params["plot_new_synthetics"]): g3d.plot_new_synt_seismograms(outputdir=os.path.join(inv_out_dir, "waveform_plots"), figure_format="pdf")
from pycmt3d.cmt3d import Cmt3D from pycmt3d.source import CMTSource from pycmt3d.config import Config from pycmt3d.window import * from pycmt3d.const import PAR_LIST from pycmt3d.const import NREGIONS eventname = "010403A" cmtfile = "/ccs/home/lei/SOURCE_INVERSION/CMT_BIN/from_quakeml/" + eventname cmtsource = CMTSource.from_CMTSOLUTION_file(cmtfile) #print cmtsource.depth_in_m config = Config(9, dlocation=0.03, dmoment=2.0e23, ddepth=3.0, double_couple=False, station_correction=True, bootstrap=True, bootstrap_repeat=300, normalize_window=True) data_con = DataContainer(PAR_LIST[0:9]) cmt_suffix = "_60_120.win" flexwinfile = "/lustre/atlas/proj-shared/geo111/Wenjie/DATA_SI/window/cmt3d_input/" + eventname + cmt_suffix data_con.add_measurements_from_sac(flexwinfile) cmt_suffix = "_35_60.win" flexwinfile = "/lustre/atlas/proj-shared/geo111/Wenjie/DATA_SI/window/cmt3d_input/" + eventname + cmt_suffix data_con.add_measurements_from_sac(flexwinfile) testcmt = Cmt3D(cmtsource, data_con, config) testcmt.source_inversion()
def cmtsource(): return CMTSource.from_CMTSOLUTION_file(CMTFILE)
def invert(cmt_file_db, param_path): """Runs the actual inversion. :param cmt_file_db: :param param_path: :return: Nothing, inversion results are written to file. """ # Load Database Parameters databaseparam_path = os.path.join(param_path, "Database/DatabaseParameters.yml") DB_params = read_yaml_file(databaseparam_path) # Inversion Params inversionparam_path = os.path.join(param_path, "CMTInversion/InversionParams.yml") INV_params = read_yaml_file(inversionparam_path) # Weight Params weightparam_path = os.path.join(param_path, "CMTInversion/WeightParams.yml") weight_params = read_yaml_file(weightparam_path) # Get processing path from cmt_filename in database cmt_dir = os.path.dirname(os.path.abspath(cmt_file_db)) # Create cmt source: cmtsource = CMTSource.from_CMTSOLUTION_file(cmt_file_db) # Inversion dictionary directory inv_dict_dir = os.path.join(cmt_dir, "inversion", "inversion_dicts") # Inversion dictionaries inv_dict_files = glob.glob(os.path.join(inv_dict_dir, "inversion*")) # Inversion output directory inv_out_dir = os.path.join(cmt_dir, "inversion", "inversion_output", "cmt3d") # WRite start of inversion process logger.info(" ") logger.info("#######################################################") logger.info("# #") logger.info("# Starting CMT3D Inversion ... #") logger.info("# #") logger.info("#######################################################") logger.info(" ") # Creating Data container dcon = DataContainer(parlist=PARLIST[:DB_params["npar"]]) for _i, inv_dict_file in enumerate(inv_dict_files): # Get processing band bandstring1 = str(os.path.basename(inv_dict_file).split(".")[1]) if "surface" in bandstring1 or "body" in bandstring1: bandstring = bandstring1.split("#")[0] else: bandstring = bandstring1 band = [float(x) for x in bandstring.split("_")] logger.info(" ") logger.info(" " + 54 * "*") logger.info(" Getting data for inversion from period band:") logger.info(" Low: %d s || High: %d s" % tuple(band)) logger.info(" " + 54 * "*") logger.info(" ") # Load inversion file dictionary inv_dict = read_yaml_file(inv_dict_file) asdf_dict = inv_dict["asdf_dict"] window_file = inv_dict["window_file"] # Adding measurements # Print Inversion parameters: logger.info(" Adding measurements to data container:") logger.info(" _____________________________________________________") logger.info(" ") # Add measurements from ASDF file and windowfile logger.info(" Window file:") logger.info(" " + window_file) logger.info(" ") logger.info(" ASDF files:") for key, value in asdf_dict.items(): logger.info(" " + key + ": " + value) dcon.add_measurements_from_asdf(window_file, asdf_dict) logger.info(" _____________________________________________________") logger.info(" ... ") logger.info(" ") logger.info(" ... ") logger.info(" Setting up inversion classes .... ") logger.info(" " + 54 * "*") logger.info(" ... ") # Setting up weight config inv_weight_config = weight_params["weight_config"] weight_config = WeightConfig( normalize_by_energy=inv_weight_config["normalize_by_energy"], normalize_by_category=inv_weight_config["normalize_by_category"], azi_bins=inv_weight_config["azi_bins"], azi_exp_idx=inv_weight_config["azi_exp_idx"]) # Setting up general inversion config inv_params = INV_params["config"] cmt3d_config = Config(DB_params["npar"], dlocation=float(inv_params["dlocation"]), ddepth=float(inv_params["ddepth"]), dmoment=float(inv_params["dmoment"]), weight_data=bool(inv_params["weight_data"]), station_correction=bool( inv_params["station_correction"]), zero_trace=bool(inv_params["zero_trace"]), double_couple=bool(inv_params["double_couple"]), bootstrap=bool(inv_params["bootstrap"]), bootstrap_repeat=int(inv_params["bootstrap_repeat"]), weight_config=weight_config, taper_type=inv_params["taper_type"], damping=float(inv_params["damping"])) logger.info(" PyCMT3D is finding an improved CMTSOLUTION .... ") logger.info(" " + 54 * "*") logger.info(" ") logger.info(" ") # Invert for parameters cmt3d = Cmt3D(cmtsource, dcon, cmt3d_config) cmt3d.source_inversion() cmt3d.compute_new_syn() # Create inversion class # if bool(INV_params["gridsearch"]): # inv = Inversion(cmtsource, dcon, cmt3d_config, grad3d_config) # else: # inv = Inversion(cmtsource, dcon, cmt3d_config, mt_config=None) # Run inversion if bool(INV_params["statistics_plot"]): cmt3d.plot_stats_histogram(outputdir=inv_out_dir) # Plot results if bool(INV_params["summary_plot"]): cmt3d.plot_summary(inv_out_dir, figure_format="pdf") # # if bool(INV_params["statistics_plot"]): # # Plot Statistics for inversion # inv.G.plot_stats_histogram(outputdir=inv_out_dir) # if bool(INV_params["summary_json"]): cmt3d.write_summary_json(outputdir=inv_out_dir, mode="global") if bool(INV_params["write_new_cmt"]): cmt3d.write_new_cmtfile(outputdir=inv_out_dir) if bool(INV_params["write_new_synt"]): cmt3d.write_new_syn(outputdir=os.path.join(inv_out_dir, "new_synt"), file_format="asdf") if bool(INV_params["plot_new_synthetics"]): cmt3d.plot_new_synt_seismograms(outputdir=os.path.join( inv_out_dir, "waveform_plots"), figure_format="pdf")
def test_write_CMTSOLUTION_File(tmpdir, cmt): fn = os.path.join(str(tmpdir), "CMTSOLUTION.temp") cmt.write_CMTSOLUTION_file(fn) new_cmt = CMTSource.from_CMTSOLUTION_file(fn) assert new_cmt == cmt
import os import conda os.environ["PROJ_LIB"] = os.path.join( conda.__file__.split('lib')[0], 'Library', 'share') from pycmt3d.data_container import DataContainer # NOQA from pycmt3d.constant import PARLIST # NOQA from pycmt3d.cmt3d import Cmt3D # NOQA from pycmt3d.config import Config, DefaultWeightConfig # NOQA from pycmt3d.source import CMTSource # NOQA # load cmtsource cmtfile = os.path.join('..', 'cmt_solutions', 'CMTSOLUTION-syn.txt') cmtsource = CMTSource.from_CMTSOLUTION_file(cmtfile) # load data and window from flexwin output file npar = 9 # read 9 deriv synthetic data_con = DataContainer(PARLIST[:npar]) flexwin_output = 'windows.txt' asdf_file_dict = { 'obsd': 'observed.h5', 'synt': 'synthetic_perturbed.h5', 'Mrr': os.path.join('kernels', 'Mrr.h5'), 'Mtt': os.path.join('kernels', 'Mtt.h5'), 'Mpp': os.path.join('kernels', 'Mpp.h5'), 'Mrt': os.path.join('kernels', 'Mrt.h5'), 'Mrp': os.path.join('kernels', 'Mrp.h5'), 'Mtp': os.path.join('kernels', 'Mtp.h5'), 'dep': os.path.join('kernels', 'depth.h5'), 'lat': os.path.join('kernels', 'lat.h5'),