Can formation scenarios and mass be determined with age and thermal spectroscopy¶
What you will learn
If we only know the age of a young exoplanet, can we infer both the mass and the birth mechanism (hot vs. cold) just from its spectrum?
What you should already know:
What do formation models predict for the effective temperatures of young planets across different masses?
Given identical mass and age, what might two different formation scenarios lead the spectra to look like?
How do we dissect spectroscopy of planet atmospheres in order to infer atmospheric physical properties such as abundance and climate profiles?
Questions? Submit an Issue to PICASO Github with any issues you are experiencing. Don’t be shy! Others are likely experiencing similar problems
[1]:
import warnings
warnings.filterwarnings(action='ignore')
import os
import pandas as pd
import numpy as np
import picaso.justdoit as jdi
import picaso.justplotit as jpi
jpi.output_notebook()
#point to your sonora profile grid that you untared (see above cell #2)
sonora_profile_db = '/data/sonora_profile/'
Planet Evolution Tracks in the Context of Planet Discoveries¶
How do these stack up against real data. Bolometric luminosities and ages of nearly all young planets and brown dwarfs were compiled from Zhang et al. 2020 (Tables 3-4) and Zhang et al. 2021 (Tables 4-5). The remaining 2 objects, beta Pic c & YSES-1c, are from Nowak et al. 2020 & Bohn et al. 2020, respectively. Lastly, there is one brand new object, COCONUTS-2b from Zhang et al. 2021.
[2]:
#load curves again
evo = jdi.evolution_track(mass='all',age='all')
#load table from ZJ Zhang
data = jdi.young_planets()
data.head()
[2]:
name | log_lbol | log_lbol_upp_err | log_lbol_low_err | age_Gyr | age_Gyr_upp_err | age_Gyr_low_err | |
---|---|---|---|---|---|---|---|
0 | HIP 65426 b | -4.136 | 0.177 | 0.177 | 0.0140 | 0.0040 | 0.0040 |
1 | YSES-1 c | -4.650 | 0.050 | 0.080 | 0.0167 | 0.0014 | 0.0014 |
2 | PSO J318.5338-22.8603 | -4.420 | 0.060 | 0.060 | 0.0240 | 0.0030 | 0.0030 |
3 | 51 Eri b | -5.870 | 0.150 | 0.150 | 0.0240 | 0.0030 | 0.0030 |
4 | beta Pic c | -4.500 | 0.100 | 0.100 | 0.0240 | 0.0030 | 0.0030 |
The data are in luminosity. So we need to change our evolution tracks.
[3]:
data.keys()
[3]:
Index(['name', 'log_lbol', 'log_lbol_upp_err', 'log_lbol_low_err', 'age_Gyr',
'age_Gyr_upp_err', 'age_Gyr_low_err'],
dtype='object')
[4]:
fig = jpi.plot_evolution(evo, y = 'logL',
y_range=[26.5,30],x_range=[1e6,1e9],
plot_height=400, plot_width=500,
title='Thermal Evolution Against Data')
jpi.plot_multierror(data['age_Gyr']*1e9, data['log_lbol'] + np.log10(3.839e33),
fig,
dx_low = 1e9*data['age_Gyr_low_err'],
dx_up = 1e9*data['age_Gyr_upp_err'],
dy_low = data['log_lbol_low_err'],
dy_up = data['log_lbol_upp_err'],
error_kwargs={'line_width':1.5,'color':'black'},
point_kwargs={'line_color':'red','color':'white','size':6})
fig.legend.location='bottom_left'
jpi.show(fig)
Which of these planets/brown dwarfs would have to be hot start?
Which of these planets/brown dwarfs would have to be cold start?
Which could be either?
Analyze the spectra of two planets with same age and luminosity¶
Let’s pick an ambiguous location along these cold/hot start cases. For example, the 10 Mj cold start curve crosses the 4 Mj hot start curve at an age of ~3.2e7 years. Let’s take a look to see if we can differentiate these scenarios.
[5]:
cold = jdi.evolution_track(mass=10,age=3.2e7)['cold'] #cold start, higher mass
hot = jdi.evolution_track(mass=4,age=3.2e7)['hot'] #hot start, lower mass
[6]:
hot,cold
[6]:
({'age_years': 32623000.0,
'Teff': 718.8,
'grav_cgs': 6193.3,
'logL': 28.192,
'R_cm': 9047620000.0},
{'age_years': 32623000.0,
'Teff': 757.1,
'grav_cgs': 18855.6,
'logL': 28.197,
'R_cm': 8198670000.0})
[7]:
wave_range = [0.8,14]
opa = jdi.opannection(wave_range=wave_range)
The only difference in the code blocks below is the gravity and the effective temperature, which we can pull from the planet evolution tracks. For now, we will focus on absolute flux from the planet (as opposed to contrast, the ratio of planet to stellar flux). Therefore, we are relatively agnostic to the stellar spectrum.
A quick refresher in running the jdi.inputs
function:
First define an empty class by running
jdi.inputs
Set the stellar parameters :
star(opacityclass, Teff, M/H, logg, radius, radius_unit)
Set the
gravity
of the planet. In this case we have this information from evolution models.Set the chemistry and pressure-temperature using the
sonora
grid 1D models that you downloaded.Finally, compute the spectrum with calculation set to
thermal
for thermal emission (other options includereflected
andtransmission
).
[8]:
#HOT START
yph = jdi.inputs()
yph.star(opa, 5000,0,4.0,radius=1, radius_unit=jdi.u.Unit('R_sun'))
yph.gravity(gravity=hot['grav_cgs'] , gravity_unit=jdi.u.Unit('cm/s**2'))
yph.sonora(sonora_profile_db, hot['Teff'])
hot_case = yph.spectrum(opa,calculation='thermal', full_output=True)
#COLD START
ypc = jdi.inputs()
ypc.star(opa, 5000,0,4.0,radius=1, radius_unit=jdi.u.Unit('R_sun'))
ypc.gravity(gravity=cold['grav_cgs'] , gravity_unit=jdi.u.Unit('cm/s**2'))
ypc.sonora(sonora_profile_db, cold['Teff'])
cold_case = ypc.spectrum(opa,calculation='thermal', full_output=True)
Now we can use our first PICASO
plotting function: jpi.spectrum
. More plotting functions will follow
[9]:
wno,spec=[],[]
for i in [cold_case, hot_case]:
x,y = jdi.mean_regrid(i['wavenumber'],i['thermal'], R=100)
wno+=[x]
spec+=[y]
jpi.show(jpi.spectrum(wno,spec,legend=['Cold','Hot'], y_axis_type='log',
plot_width=500))
As you can immediately see, it is a lot more complicated to differentiate these!! Let’s see if we can pick apart any differences
Application of Spectroscopy Analysis Skills¶
In the previous exercise we went through these steps to analyze a spectrum:
Assess chemistry, pressure-temperature input
Assess contribution function of opacity
Assess “flux at top” in comparison with black body functions or brightness temperature
We will focus on #2 in this demo.
[10]:
cold_cont = jdi.get_contribution(ypc, opa, at_tau=1)
hot_cont = jdi.get_contribution(yph, opa, at_tau=1)
As a reminder, this output consists of three important items: taus_per_layer
- Each dictionary entry is a nlayer x nwave that represents the per layer optical depth for that molecule.
cumsum_taus
- Each dictionary entry is a nlevel x nwave that represents the cumulative summed opacity for that molecule.
tau_p_surface
- Each dictionary entry is a nwave array that represents the pressure level where the cumulative opacity reaches the value specified by the user through at_tau
.
[11]:
#explore the output
hot_cont['tau_p_surface'].keys()
[11]:
dict_keys(['H2H2', 'H2He', 'H2N2', 'H2H', 'H2CH4', 'H-bf', 'H2', 'H3+', 'H2O', 'CH4', 'CO', 'NH3', 'N2', 'PH3', 'H2S', 'TiO', 'VO', 'Fe', 'FeH', 'CrH', 'Na', 'K', 'Rb', 'Cs', 'CO2', 'HCN', 'C2H2', 'C2H4', 'C2H6', 'SiO', 'MgH', 'OCS', 'Li', 'LiH', 'LiCl', 'CaH', 'rayleigh', 'cloud'])
Let’s take a look at the last one, optical depth ~ 1 surface, as it will give us the best global view of what is going on
[12]:
figs=[]
for i,it in zip([cold_cont['tau_p_surface'], hot_cont['tau_p_surface']],['Cold Start','Hot Start']):
wno=[]
spec=[]
labels=[]
for j in i.keys():
x,y = jdi.mean_regrid(opa.wno, i[j],R=100)
if np.min(y)<5:
wno+=[x]
spec+=[y]
labels +=[j]
fig = jpi.spectrum(wno,spec,plot_width=600,plot_height=350,y_axis_label='Tau~1 Pressure (bars)',
y_axis_type='log',x_range=[1,6],
y_range=[1e2,1e-4],legend=labels)
fig.title.text=it
figs+=[fig]
jpi.show(jpi.column(figs))
Though these two cases look nearly identical, what is the main difference that is ultimately visible in the spectra?
Any other insight we can glean form the the flux plot?
[13]:
figs =[]
for title,data in zip(['Cold Start','Hot Start'],[cold_case, hot_case]):
fig = jpi.flux_at_top(data, pressures=[10,1,0.1],R=100,title=title)
fig.legend.location='bottom_right'
figs+=[fig]
jpi.show(jpi.row(figs))
Revisit questions concerning observables. Would any of your answers change?
What do each of the spectroscopic bands provide you? J, H and K? What do the JWST modes get you? You can use the PandExo graphic for guidance
If you were limited to differential photometry (e.g. J-H, J-K, H-K) what two bands might you pick to maximize information from this system? Does photometry help at all?
In addition to the two photometric bands you’ve chosen, what third 1 micron in width spectroscopic band might you choose in this wavelength region? Assume there are no observational constraints across this 1-14 micron region.
Then move to discuss:
If photometry is not suitable for this problem, what spectroscopic bands are most suitable for differentiating formation scenarios?
Final discussion:
If we only know the age of a young exoplanet, can we infer both the mass and the birth mechanism (hot vs. cold) just from its spectrum? What aspects have we not considered? What could help? What could complicate things further?
References¶
[ ]: