Пример #1
0
def pole_position(start, euler_1, rate_1, euler_2, rate_2, switchpoint, time):
    euler_pole_1 = mcplates.EulerPole(euler_1[0], euler_1[1], rate_1)
    euler_pole_2 = mcplates.EulerPole(euler_2[0], euler_2[1], rate_2)
    start_pole = mcplates.PaleomagneticPole(start[0], start[1], age=time)

    if time <= switchpoint:
        start_pole.rotate(euler_pole_1, euler_pole_1.rate * time)
    else:
        start_pole.rotate(euler_pole_1, euler_pole_1.rate * switchpoint)
        start_pole.rotate(euler_pole_2,
                          euler_pole_2.rate * (time - switchpoint))

    lon_lat = np.array([start_pole.longitude, start_pole.latitude])
    return lon_lat
Пример #2
0
def plot_trace(trace):
    euler_1_directions = trace('euler_1')[:]
    rates_1 = trace('rate_1')[:]

    euler_2_directions = trace('euler_2')[:]
    rates_2 = trace('rate_2')[:]

    start_directions = trace('start')[:]
    switchpoints = trace('switchpoint')[:]

    interval = max([1, int(len(rates_1) / 1000)])

    #ax = plt.axes(projection = ccrs.Orthographic(0.,30.))
    ax = plt.axes(projection=ccrs.Mollweide(0.))
    ax.gridlines()
    ax.set_global()
    mcplates.plot.plot_distribution(ax, euler_1_directions[:, 0],
                                    euler_1_directions[:, 1])
    mcplates.plot.plot_distribution(ax, euler_2_directions[:, 0],
                                    euler_2_directions[:, 1])

    age_list = np.linspace(ages[0], ages[-1], 100)
    pathlons = np.empty_like(age_list)
    pathlats = np.empty_like(age_list)
    for start, e1, r1, e2, r2, switch \
                 in zip(start_directions[::interval],
                        euler_1_directions[::interval], rates_1[::interval],
                        euler_2_directions[::interval], rates_2[::interval],
                        switchpoints[::interval]):
        for i, a in enumerate(age_list):
            lon_lat = pole_position(start, e1, r1, e2, r2, switch, a)
            pathlons[i] = lon_lat[0]
            pathlats[i] = lon_lat[1]

        ax.plot(pathlons,
                pathlats,
                color='b',
                transform=ccrs.PlateCarree(),
                alpha=0.05)
    for p in lon_lats:
        pole = mcplates.PaleomagneticPole(p[0], p[1], angular_error=10.)
        pole.plot(ax)

    plt.show()
Пример #3
0
def plot_result():

    ax = plt.axes(projection = ccrs.Orthographic(0.,-30.))
    #ax = plt.axes(projection = ccrs.Mollweide(0.))
    ax.gridlines()
    ax.set_global()

    direction_samples = path.euler_directions()
    for directions in direction_samples:
        mcplates.plot.plot_distribution( ax, directions[:,0], directions[:,1])

    pathlons, pathlats = path.compute_synthetic_paths(n=100)
    for pathlon,pathlat in zip(pathlons,pathlats):
        ax.plot(pathlon,pathlat, transform=ccrs.PlateCarree(), color='b', alpha=0.05 )

    for p in lon_lats:
        pole = mcplates.PaleomagneticPole( p[0], p[1], angular_error=10. )
        pole.plot(ax)


    plt.show()
Пример #4
0
def create_model(n_euler_rotations, use_tpw):
    if n_euler_rotations < 0:
        raise Exception(
            "Number of plate Euler rotations must be greater than or equal to zero"
        )
    if use_tpw != False and use_tpw != True:
        raise Exception("Must enter 'true' or 'false' for whether to use TPW")
    if n_euler_rotations == 0 and use_tpw == False:
        raise Exception(
            "Must use either TPW or plate Euler rotations, or both")

    print("Fitting Keweenawan APW track with"\
            +("out TPW and " if use_tpw == False else " TPW and ")\
            +str(n_euler_rotations)+" Euler rotation"\
            + ("" if n_euler_rotations == 1 else "s") )

    data = pd.read_csv("pole_means.csv")
    # Give unnamed column an appropriate name
    data.rename(columns={'Unnamed: 0': 'Name',\
                         'Unnamed: 14': 'GaussianOrUniform'},\
                inplace=True)
    data = data[data.Name !=
                'Osler_N']  #Huge error, does not contribute much to the model
    data = data[data.PoleName !=
                'Abitibi']  # Standstill at the beginning, not realistic to fit
    data = data[data.PoleName !=
                'Haliburton']  #Much younger, far away pole, difficutlt to fit
    data.sort_values('AgeNominal', ascending=False, inplace=True)

    poles = []
    pole_names = []
    pole_colors = []
    for i, row in data.iterrows():
        pole_lat = row['PLat']
        pole_lon = row['PLon'] - lon_shift
        a95 = row['A95']
        age = row['AgeNominal']

        if row['GaussianOrUniform'] == 'gaussian':
            sigma_age = row['Gaussian_2sigma'] / 2.
        elif row['GaussianOrUniform'] == 'uniform':
            sigma_age = (row['AgeLower'], row['AgeUpper'])
        else:
            raise Exception("Unrecognized age error type")

        pole = mcplates.PaleomagneticPole(pole_lon,
                                          pole_lat,
                                          angular_error=a95,
                                          age=age,
                                          sigma_age=sigma_age)
        poles.append(pole)
        pole_names.append(row['PoleName'])
        pole_colors.append(row['color'])

    tpw_str = 'true' if use_tpw else 'false'
    prefix = 'keweenawan_' + str(n_euler_rotations) + '_' + tpw_str
    path = mcplates.APWPath(prefix, poles, n_euler_rotations)
    tpw_rate_scale = 2.5 if use_tpw else None
    path.create_model(site_lon_lat=(slon, slat), watson_concentration=0.0,\
            rate_scale=2.5, tpw_rate_scale=tpw_rate_scale)
    return path, poles, pole_names, pole_colors
data.sort_values('HIGHAGE', ascending=False, inplace=True)

# Add poles from Australia pole list
poles = []
pole_names = []
for i, row in data.iterrows():
    pole_lat = row['PLAT']
    pole_lon = row['PLONG'] - lon_shift
    a95 = np.sqrt(row['DP'] * row['DM'])
    age = (row['HIGHAGE'] + row['LOWAGE']) / 2.

    sigma_age = (row['LOWAGE'], row['HIGHAGE'])

    pole = mcplates.PaleomagneticPole(pole_lon,
                                      pole_lat,
                                      angular_error=a95,
                                      age=age,
                                      sigma_age=sigma_age)
    poles.append(pole)
    pole_names.append(row['ROCKNAME'])

# Add pole with low error for present day pole
poles.append(
    mcplates.PaleomagneticPole(0.,
                               90.,
                               angular_error=1.,
                               age=0.,
                               sigma_age=0.01))

# Reference position on the Australian continent
slat = -25.3  # Uluru lat
start_age = 50.
hidden_start_pole = [0., 90.]
hidden_euler_pole = [40., -20.]
hidden_euler_rate = 1.5

#Make a dummy APW path to create the synthetic data
dummy_pole_position_fn = mcplates.APWPath.generate_pole_position_fn(
    n_euler_poles, start_age)
pole_list = []
for a in ages:
    lon_lat = dummy_pole_position_fn(hidden_start_pole, a, 0.0, 0.0,
                                     hidden_euler_pole, hidden_euler_rate)
    pole_list.append(
        mcplates.PaleomagneticPole(lon_lat[0],
                                   lon_lat[1],
                                   angular_error=5.,
                                   age=a,
                                   sigma_age=0.01))
for p in pole_list[1:-1]:
    p.plot(ax, color='b')

#Make a plate
times = np.linspace(min(ages), max(ages), 100.)
pb1_lon = np.empty_like(times)
pb1_lat = np.empty_like(times)
pb2_lon = np.empty_like(times)
pb2_lat = np.empty_like(times)
for i, t in enumerate(times):
    start1 = (30., 60.)
    start2 = (40., 15.)
    lon_lat = dummy_pole_position_fn(start1, t, 0.0, 0.0, hidden_euler_pole,
Пример #7
0
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

import mcplates

pole1 = mcplates.PaleomagneticPole(10., 30., angular_error=30.)
pole2 = mcplates.PaleomagneticPole(20., 60., angular_error=20.)
pole3 = mcplates.PaleomagneticPole(30., 80., angular_error=10.)

ax = plt.axes(projection=ccrs.Orthographic(30., 30.))
ax.set_global()
ax.gridlines()

pole1.plot(ax, color='r')
pole2.plot(ax, color='g')
pole3.plot(ax, color='b')

plt.show()
Пример #8
0
import cartopy.crs as ccrs

import pymc
import mcplates

dbname = 'pickles/apw.pickle'

# Generate a synthetic data set
ages =[0.,10.,20.,30.,40]
sigma_ages = [2., 2., 2., 2., [38.,43.]]

lon_lats = [ [300., -20.], [340.,0.], [0.,30.], [20., 0.], [60.,-20.]]

poles = []
for a, s, ll in zip(ages, sigma_ages, lon_lats):
    pole = mcplates.PaleomagneticPole( ll[0], ll[1], angular_error=10., age=a, sigma_age=s)
    poles.append(pole)

path = mcplates.APWPath( 'apw', poles, 2 )
path.create_model()

def plot_result():

    ax = plt.axes(projection = ccrs.Orthographic(0.,-30.))
    #ax = plt.axes(projection = ccrs.Mollweide(0.))
    ax.gridlines()
    ax.set_global()

    direction_samples = path.euler_directions()
    for directions in direction_samples:
        mcplates.plot.plot_distribution( ax, directions[:,0], directions[:,1])
Пример #9
0
dbname = 'one_euler_pole_b'
n_euler_poles=1

# Generate a synthetic data set
ages = [60., 80., 100., 120.]
start_age = 120.
hidden_start_pole = [30., 90.]
hidden_euler_pole = [0., 0.]
hidden_euler_rate = 1.

#Make a dummy APW path to create the synthetic data
dummy_pole_position_fn = mcplates.APWPath.generate_pole_position_fn( n_euler_poles, start_age)
pole_list = []
for a in ages:
    lon_lat = dummy_pole_position_fn(hidden_start_pole, a, 0.0, 0.0, hidden_euler_pole, hidden_euler_rate)
    pole_list.append( mcplates.PaleomagneticPole( lon_lat[0], lon_lat[1], angular_error = 10., age=a, sigma_age = 0.01))

path = mcplates.APWPath( dbname, pole_list, n_euler_poles)
path.create_model(watson_concentration=0.0, rate_scale = 2.5)


def plot_result():

    fig = plt.figure( figsize=(8,4) )
    ax = fig.add_subplot(1,2,1, projection = ccrs.Orthographic(-30.,15.))
    ax.gridlines()
    ax.set_global()

    colors = itertools.cycle([cmap_red, cmap_green])
    direction_samples = path.euler_directions()
    for directions in direction_samples: