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
Esempio n. 2
0
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)
Esempio n. 3
0
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()
Esempio n. 4
0
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")
Esempio n. 5
0
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()
Esempio n. 6
0
def cmtsource():
    return CMTSource.from_CMTSOLUTION_file(CMTFILE)
Esempio n. 7
0
def cmtsource():
    return CMTSource.from_CMTSOLUTION_file(CMTFILE)
Esempio n. 8
0
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")
Esempio n. 9
0
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
Esempio n. 10
0
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'),
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