def plot_Sn_timesamples(PSP): """ Plots Fig. 5 from Sanders & Binney (2014) """ TT = pot.stackel_triax() f, a = plt.subplots(2, 1, figsize=[3.32, 3.6]) plt.subplots_adjust(hspace=0.0, top=0.8) LowestPeriod = 2.0 * np.pi / 38.86564386 Times = np.array([2.0, 4.0, 8.0, 12.0]) Sr = np.arange(2, 14, 2) # Loop over length of integration window for i, P, C in zip(Times, [".", "s", "D", "^"], ["k", "r", "b", "g"]): diffact = np.zeros((len(Sr), 3)) difffreq = np.zeros((len(Sr), 3)) MAXGAPS = np.array([]) # Loop over N_max for k, j in enumerate(Sr): NT = choose_NT(j) timeseries = np.linspace(0.0, i * LowestPeriod, NT) results = odeint(pot.orbit_derivs2, PSP, timeseries, args=(TT,), rtol=1e-13, atol=1e-13) act, ang, n_vec, toy_aa, pars = find_actions(results, timeseries, N_matrix=j, ifprint=False, use_box=True) # Check all modes checks, maxgap = ced(n_vec, ua(toy_aa.T[3:].T, np.ones(3))) if len(maxgap) > 0: maxgap = np.max(maxgap) else: maxgap = 0 diffact[k] = act[:3] / TT.action(results[0]) print i, j, print_max_average(n_vec, toy_aa.T[3:].T, act[3:]), str(ang[3:6] - TT.freq(results[0])).replace( "[", "" ).replace("]", ""), str(np.abs(act[:3] - TT.action(results[0]))).replace("[", "").replace("]", ""), len( checks ), maxgap MAXGAPS = np.append(MAXGAPS, maxgap) difffreq[k] = ang[3:6] / TT.freq(results[0]) size = 15 if P == ".": size = 30 LW = np.array(map(lambda i: 0.5 + i * 0.5, MAXGAPS)) a[0].scatter( Sr, np.log10(np.abs(diffact.T[2] - 1)), marker=P, s=size, color=C, facecolors="none", lw=LW, label=r"$T =\,$" + str(i) + r"$\,T_F$", ) a[1].scatter(Sr, np.log10(np.abs(difffreq.T[2] - 1)), marker=P, s=size, color=C, facecolors="none", lw=LW) a[1].get_yticklabels()[-1].set_visible(False) a[0].set_xticklabels([]) a[0].set_xlim(1, 13) a[0].set_ylabel(r"$\log_{10}|J_3^\prime/J_{3, \rm true}-1|$") leg = a[0].legend(loc="upper center", bbox_to_anchor=(0.5, 1.4), ncol=2, scatterpoints=1) leg.draw_frame(False) a[1].set_xlim(1, 13) a[1].set_xlabel(r"$N_{\rm max}$") a[1].set_ylabel(r"$\log_{10}|\Omega_3^\prime/\Omega_{3,\rm true}-1|$") plt.savefig("Sn_T_box.pdf", bbox_inches="tight")
def plot3D_stacktriax(initial,final_t,N_MAT,file_output): """ For producing plots from paper """ # Setup Stackel potential TT = pot.stackel_triax() times = choose_NT(N_MAT) timeseries=np.linspace(0.,final_t,times) # Integrate orbit results = odeint(pot.orbit_derivs2,initial,timeseries,args=(TT,),rtol=1e-13,atol=1e-13) # Find actions, angles and frequencies (act,ang,n_vec,toy_aa, pars),loop = find_actions(results, timeseries,N_matrix=N_MAT,ifloop=True) toy_pot = 0 if(loop[2]>0.5 or loop[0]>0.5): toy_pot = pot.isochrone(par=np.append(pars,0.)) else: toy_pot = pot.harmonic_oscillator(omega=pars[:3]) # Integrate initial condition in toy potential timeseries_2=np.linspace(0.,2.*final_t,3500) results_toy = odeint(pot.orbit_derivs2,initial,timeseries_2,args=(toy_pot,)) print "True actions: ", TT.action(results[0]) print "Found actions: ", act[:3] print "True frequencies: ",TT.freq(results[0]) print "Found frequencies: ",ang[3:6] # and plot f,a = plt.subplots(2,3,figsize=[3.32,5.5]) a[0,0] = plt.subplot2grid((3,2), (0, 0)) a[1,0] = plt.subplot2grid((3,2), (0, 1)) a[0,1] = plt.subplot2grid((3,2), (1, 0)) a[1,1] = plt.subplot2grid((3,2), (1, 1)) a[0,2] = plt.subplot2grid((3,2), (2, 0),colspan=2) plt.subplots_adjust(wspace=0.5,hspace=0.45) # xy orbit a[0,0].plot(results.T[0],results.T[1],'k') a[0,0].set_xlabel(r'$x/{\rm kpc}$') a[0,0].set_ylabel(r'$y/{\rm kpc}$') a[0,0].xaxis.set_major_locator(MaxNLocator(5)) # xz orbit a[1,0].plot(results.T[0],results.T[2],'k') a[1,0].set_xlabel(r'$x/{\rm kpc}$') a[1,0].set_ylabel(r'$z/{\rm kpc}$') a[1,0].xaxis.set_major_locator(MaxNLocator(5)) # toy orbits a[0,0].plot(results_toy.T[0],results_toy.T[1],'r',alpha=0.2,linewidth=0.3) a[1,0].plot(results_toy.T[0],results_toy.T[2],'r',alpha=0.2,linewidth=0.3) # Toy actions a[0,2].plot(Conv*timeseries,toy_aa.T[0],'k:',label='Toy action') a[0,2].plot(Conv*timeseries,toy_aa.T[1],'r:') a[0,2].plot(Conv*timeseries,toy_aa.T[2],'b:') # Arrows to show approx. actions arrow_end = a[0,2].get_xlim()[1] arrowd = 0.08*(arrow_end-a[0,2].get_xlim()[0]) a[0,2].annotate('',(arrow_end+arrowd,act[0]),(arrow_end,act[0]),arrowprops=dict(arrowstyle='<-',color='k'),annotation_clip=False) a[0,2].annotate('',(arrow_end+arrowd,act[1]),(arrow_end,act[1]),arrowprops=dict(arrowstyle='<-',color='r'),annotation_clip=False) a[0,2].annotate('',(arrow_end+arrowd,act[2]),(arrow_end,act[2]),arrowprops=dict(arrowstyle='<-',color='b'),annotation_clip=False) # True actions a[0,2].plot(Conv*timeseries,TT.action(results[0])[0]*np.ones(len(timeseries)),'k',label='True action') a[0,2].plot(Conv*timeseries,TT.action(results[0])[1]*np.ones(len(timeseries)),'k') a[0,2].plot(Conv*timeseries,TT.action(results[0])[2]*np.ones(len(timeseries)),'k') a[0,2].set_xlabel(r'$t/{\rm Gyr}$') a[0,2].set_ylabel(r'$J/{\rm kpc\,km\,s}^{-1}$') leg = a[0,2].legend(loc='upper center',bbox_to_anchor=(0.5,1.2),ncol=3, numpoints = 1) leg.draw_frame(False) # Toy angle coverage a[0,1].plot(toy_aa.T[3]/(np.pi),toy_aa.T[4]/(np.pi),'k.',markersize=0.4) a[0,1].set_xlabel(r'$\theta_1/\pi$') a[0,1].set_ylabel(r'$\theta_2/\pi$') a[1,1].plot(toy_aa.T[3]/(np.pi),toy_aa.T[5]/(np.pi),'k.',markersize=0.4) a[1,1].set_xlabel(r'$\theta_1/\pi$') a[1,1].set_ylabel(r'$\theta_3/\pi$') plt.savefig(file_output,bbox_inches='tight') return act
def plot3D_stacktriax(initial, final_t, N_MAT, file_output): """ For producing plots from paper """ # Setup Stackel potential TT = pot.stackel_triax() times = choose_NT(N_MAT) timeseries = np.linspace(0., final_t, times) # Integrate orbit results = odeint(pot.orbit_derivs2, initial, timeseries, args=(TT, ), rtol=1e-13, atol=1e-13) # Find actions, angles and frequencies (act, ang, n_vec, toy_aa, pars), loop = find_actions(results, timeseries, N_matrix=N_MAT, ifloop=True) toy_pot = 0 if (loop[2] > 0.5 or loop[0] > 0.5): toy_pot = pot.isochrone(par=np.append(pars, 0.)) else: toy_pot = pot.harmonic_oscillator(omega=pars[:3]) # Integrate initial condition in toy potential timeseries_2 = np.linspace(0., 2. * final_t, 3500) results_toy = odeint(pot.orbit_derivs2, initial, timeseries_2, args=(toy_pot, )) print "True actions: ", TT.action(results[0]) print "Found actions: ", act[:3] print "True frequencies: ", TT.freq(results[0]) / Conv print "Found frequencies: ", ang[3:6] / Conv # and plot f, a = plt.subplots(2, 3, figsize=[3.32, 5.5]) a[0, 0] = plt.subplot2grid((3, 2), (0, 0)) a[1, 0] = plt.subplot2grid((3, 2), (0, 1)) a[0, 1] = plt.subplot2grid((3, 2), (1, 0)) a[1, 1] = plt.subplot2grid((3, 2), (1, 1)) a[0, 2] = plt.subplot2grid((3, 2), (2, 0), colspan=2) plt.subplots_adjust(wspace=0.5, hspace=0.45) # xy orbit a[0, 0].plot(results.T[0], results.T[1], 'k') a[0, 0].set_xlabel(r'$x/{\rm kpc}$') a[0, 0].set_ylabel(r'$y/{\rm kpc}$') a[0, 0].xaxis.set_major_locator(MaxNLocator(5)) # xz orbit a[1, 0].plot(results.T[0], results.T[2], 'k') a[1, 0].set_xlabel(r'$x/{\rm kpc}$') a[1, 0].set_ylabel(r'$z/{\rm kpc}$') a[1, 0].xaxis.set_major_locator(MaxNLocator(5)) # toy orbits a[0, 0].plot(results_toy.T[0], results_toy.T[1], 'r', alpha=0.2, linewidth=0.3) a[1, 0].plot(results_toy.T[0], results_toy.T[2], 'r', alpha=0.2, linewidth=0.3) # Toy actions a[0, 2].plot(Conv * timeseries, toy_aa.T[0], 'k:', label='Toy action') a[0, 2].plot(Conv * timeseries, toy_aa.T[1], 'r:') a[0, 2].plot(Conv * timeseries, toy_aa.T[2], 'b:') # Arrows to show approx. actions arrow_end = a[0, 2].get_xlim()[1] arrowd = 0.08 * (arrow_end - a[0, 2].get_xlim()[0]) a[0, 2].annotate('', (arrow_end + arrowd, act[0]), (arrow_end, act[0]), arrowprops=dict(arrowstyle='<-', color='k'), annotation_clip=False) a[0, 2].annotate('', (arrow_end + arrowd, act[1]), (arrow_end, act[1]), arrowprops=dict(arrowstyle='<-', color='b'), annotation_clip=False) a[0, 2].annotate('', (arrow_end + arrowd, act[2]), (arrow_end, act[2]), arrowprops=dict(arrowstyle='<-', color='r'), annotation_clip=False) # True actions a[0, 2].plot(Conv * timeseries, TT.action(results[0])[0] * np.ones(len(timeseries)), 'k', label='True action') a[0, 2].plot(Conv * timeseries, TT.action(results[0])[1] * np.ones(len(timeseries)), 'k') a[0, 2].plot(Conv * timeseries, TT.action(results[0])[2] * np.ones(len(timeseries)), 'k') a[0, 2].set_xlabel(r'$t/{\rm Gyr}$') a[0, 2].set_ylabel(r'$J/{\rm kpc\,km\,s}^{-1}$') leg = a[0, 2].legend(loc='upper center', bbox_to_anchor=(0.5, 1.2), ncol=3, numpoints=1) leg.draw_frame(False) # Toy angle coverage a[0, 1].plot(toy_aa.T[3] / (np.pi), toy_aa.T[4] / (np.pi), 'k.', markersize=0.4) a[0, 1].set_xlabel(r'$\theta_1/\pi$') a[0, 1].set_ylabel(r'$\theta_2/\pi$') a[1, 1].plot(toy_aa.T[3] / (np.pi), toy_aa.T[5] / (np.pi), 'k.', markersize=0.4) a[1, 1].set_xlabel(r'$\theta_1/\pi$') a[1, 1].set_ylabel(r'$\theta_3/\pi$') plt.savefig(file_output, bbox_inches='tight') return act
def plot_Sn_timesamples(PSP): """ Plots Fig. 5 from Sanders & Binney (2014) """ TT = pot.stackel_triax() f, a = plt.subplots(2, 1, figsize=[3.32, 3.6]) plt.subplots_adjust(hspace=0., top=0.8) LowestPeriod = 2. * np.pi / 38.86564386 Times = np.array([2., 4., 8., 12.]) Sr = np.arange(2, 14, 2) # Loop over length of integration window for i, P, C in zip(Times, ['.', 's', 'D', '^'], ['k', 'r', 'b', 'g']): diffact = np.zeros((len(Sr), 3)) difffreq = np.zeros((len(Sr), 3)) MAXGAPS = np.array([]) # Loop over N_max for k, j in enumerate(Sr): NT = choose_NT(j) timeseries = np.linspace(0., i * LowestPeriod, NT) results = odeint(pot.orbit_derivs2, PSP, timeseries, args=(TT, ), rtol=1e-13, atol=1e-13) act, ang, n_vec, toy_aa, pars = find_actions(results, timeseries, N_matrix=j, ifprint=False, use_box=True) # Check all modes checks, maxgap = ced(n_vec, ua(toy_aa.T[3:].T, np.ones(3))) if len(maxgap) > 0: maxgap = np.max(maxgap) else: maxgap = 0 diffact[k] = act[:3] / TT.action(results[0]) print i, j, print_max_average( n_vec, toy_aa.T[3:].T, act[3:]), str(ang[3:6] - TT.freq(results[0])).replace( '[', '').replace(']', ''), str( np.abs(act[:3] - TT.action(results[0]))).replace( '[', '').replace(']', ''), len(checks), maxgap MAXGAPS = np.append(MAXGAPS, maxgap) difffreq[k] = ang[3:6] / TT.freq(results[0]) size = 15 if (P == '.'): size = 30 LW = np.array(map(lambda i: 0.5 + i * 0.5, MAXGAPS)) a[0].scatter(Sr, np.log10(np.abs(diffact.T[2] - 1)), marker=P, s=size, color=C, facecolors="none", lw=LW, label=r'$T =\,$' + str(i) + r'$\,T_F$') a[1].scatter(Sr, np.log10(np.abs(difffreq.T[2] - 1)), marker=P, s=size, color=C, facecolors="none", lw=LW) a[1].get_yticklabels()[-1].set_visible(False) a[0].set_xticklabels([]) a[0].set_xlim(1, 13) a[0].set_ylabel(r"$\log_{10}|J_3^\prime/J_{3, \rm true}-1|$") leg = a[0].legend(loc='upper center', bbox_to_anchor=(0.5, 1.4), ncol=2, scatterpoints=1) leg.draw_frame(False) a[1].set_xlim(1, 13) a[1].set_xlabel(r'$N_{\rm max}$') a[1].set_ylabel(r"$\log_{10}|\Omega_3^\prime/\Omega_{3,\rm true}-1|$") plt.savefig('Sn_T_box.pdf', bbox_inches='tight')