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
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()
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()
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,
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()
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])
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: