An open-source tool
for stellar model fitting
isochrones
Timothy Morton (Princeton)
#knowthystar
Your local spectroscopist hands you some parameters, but you want to know stellar mass/radius. What do you do next?
- Ask your adviser, who vaguely recommends that you "interpolate onto some model isochrones."
- Download some model isochrone grids.
- Wonder what you should do next…
Option A
~$ pip install isochrones
Option B
~$ ipython
In [1]: from isochrones.dartmouth import Dartmouth_Isochrone
In [2]: from isochrones import StarModel
In [3]: dar = Dartmouth_Isochrone()
In [4]: model = StarModel(dar, Teff=(5700, 100),
logg=(4.5, 0.1), feh=(0.0, 0.1))
In [5]: model.fit()
from python terminal/script:
Teff = 5700, 100
logg = 4.5, 0.1
feh = 0.0, 0.1
mystar/star.ini
$ starfit mystar
From command line:
mystar/star.ini
$ starfit mystar
Also:
Teff = 5700, 100
logg = 4.5, 0.1
feh = 0.0, 0.1
J = 8.71, 0.03
H = 8.39, 0.03
K = 8.34, 0.03
broadband
photometry --->
mass, age, feh, distance, A_V
spectroscopic properties, broadband photometry,
parallax (mas), stellar density, nu_max/delta_nu, ...
Fits for:
Observables:
In [1]: from isochrones.mist import MIST_Isochrone
In [2]: mist = MIST_Isochrone()
In [3]: mass, age, feh = (1.0, 9.6, 0.0)
In [4]: mist.radius(mass, age, feh)
Out[4]: 1.0021006303717472
In [5]: mist.density(mass, age, feh)
Out[5]: 1.4009789196927942
In [6]: mist.delta_nu(mass, age, feh)
Out[6]: 134.45611369338567
In [7]: distance, AV = (100, 0.1)
In [8]: mist.mag['J'](mass, age, feh, distance, AV)
Out[8]: 8.659777868892867
mystar/star.ini
$ starfit mystar --binary
Teff = 5700, 100
logg = 4.5, 0.1
feh = 0.0, 0.1
J = 8.71, 0.03
H = 8.39, 0.03
K = 8.34, 0.03
Multiple Star Systems
In [1]: from isochrones import StarModel, get_ichrone
In [2]: dar = get_ichrone('dartmouth')
In [3]: props = dict(Teff=(5700, 100),
logg=(4.5, 0.1),
feh=(0.0, 0.1),
J=(8.72, 0.03),
H=(8.39, 0.03),
K=(8.34, 0.03))
In [4]: binary_model = BinaryStarModel(dar, **props)
In [5]: binary_model.fit()
In[7]: binary_model.print_ascii()
root
╚═ J=(8.72, 0.03) @(0.00, 0 [99.00])
╚═ H=(8.39, 0.03) @(0.00, 0 [99.00])
╚═ K=(8.34, 0.03) @(0.00, 0 [99.00])
╠═ 0_0, Teff=(5700, 100), logg=(4.5, 0.1), feh=(0.0, 0.1)
╚═ 0_1
What if you take an AO image and
resolve a binary system?
maxAV = 1.216
RA = 299.268036
dec = 45.227428
Teff = 4135, 98.0
feh = -0.46, 0.16
logg = 4.711, 0.1
[twomass]
J = 13.513, 0.02
H = 12.845, 0.02
K = 12.693, 0.02
[NIRC2]
resolution = 0.1
separation_1 = 0.6
PA_1 = 100
K_1 = 3.66, 0.05
H_1 = 3.77, 0.03
J_1 = 3.74, 0.05
my_binary/star.ini
In[1]: from isochrones import StarModel, get_ichrone
In[2]: mist = get_ichrone('mist')
In[3]: mod = StarModel.from_ini(mist, 'my_binary')
In[4]: mod.print_ascii()
root
╚═ twomass H=(12.85, 0.02) @(0.00, 0 [4.00])
╚═ twomass J=(13.51, 0.02) @(0.00, 0 [4.00])
╚═ twomass K=(12.69, 0.02) @(0.00, 0 [4.00])
╠═ NIRC2 delta-H=(0.00, 0.01) @(0.00, 0 [0.10])
║ ╚═ NIRC2 delta-J=(0.00, 0.01) @(0.00, 0 [0.10])
║ ╚═ NIRC2 delta-K=(0.00, 0.01) @(0.00, 0 [0.10])
║ ╚═ 0_0, Teff=[4135.0, 98.0], feh=[-0.46, 0.16], logg=[4.711, 0.1]
╚═ NIRC2 delta-H=(3.77, 0.03) @(0.60, 100 [0.10])
╚═ NIRC2 delta-J=(3.74, 0.05) @(0.60, 100 [0.10])
╚═ NIRC2 delta-K=(3.66, 0.05) @(0.60, 100 [0.10])
╚═ 0_1
In[5]: mod.param_names
['mass_0_0', 'mass_0_1', 'age_0', 'feh_0', 'distance_0', 'AV_0']
Modeling resolved binaries
maxAV = 1.216
RA = 299.268036
dec = 45.227428
Teff = 4135, 98.0
feh = -0.46, 0.16
logg = 4.711, 0.1
[twomass]
J = 13.513, 0.02
H = 12.845, 0.02
K = 12.693, 0.02
[NIRC2]
resolution = 0.1
separation_1 = 0.6
PA_1 = 100
K_1 = 3.66, 0.05
H_1 = 3.77, 0.03
J_1 = 3.74, 0.05
my_binary/star.ini
In[6]: mod2 = StarModel.from_ini(mist, 'my_binary', index=[0,1])
In[7]: mod2.param_names
['mass_0_0','age_0','feh_0','distance_0','AV_0',
'mass_1_0','age_1','feh_1','distance_1','AV_1']
In[8]: mod2.print_ascii()
root
╚═ twomass H=(12.85, 0.02) @(0.00, 0 [4.00])
╚═ twomass J=(13.51, 0.02) @(0.00, 0 [4.00])
╚═ twomass K=(12.69, 0.02) @(0.00, 0 [4.00])
╠═ NIRC2 delta-H=(0.00, 0.01) @(0.00, 0 [0.10])
║ ╚═ NIRC2 delta-J=(0.00, 0.01) @(0.00, 0 [0.10])
║ ╚═ NIRC2 delta-K=(0.00, 0.01) @(0.00, 0 [0.10])
║ ╚═ 0_0, Teff=[4135.0, 98.0], feh=[-0.46, 0.16], logg=[4.711, 0.1]
╚═ NIRC2 delta-H=(3.77, 0.03) @(0.60, 100 [0.10])
╚═ NIRC2 delta-J=(3.74, 0.05) @(0.60, 100 [0.10])
╚═ NIRC2 delta-K=(3.66, 0.05) @(0.60, 100 [0.10])
╚═ 1_0
Modeling resolved binaries
Goal: widely-used, robust, community-supported tool
- Transparent and reproducible model-fitting methodology using principled probabilistic inference
- Minimize "re-inventing the wheel"
- Easily swap in/out model grids to test model dependence (Dartmouth & MIST currently available)
Caveats
-
Model dependent (duh.)
-
Built-in MCMC fitting currently not very robust. Use MultiNest fitting backend for now.
-
No goodness-of-fit metric—beware of poor fits! (check diagnostic plots)
-
Linear interpolation may give unreliable results for signficiantly evolved stars.
-
Treatment of extinction will not be correct for high levels of extinction or very broad bands (e.g. Gaia G)
Version 1.1 is released!
(quick-fix for some nagging issues; stay tuned for more)
~$ pip install --upgrade isochrones
Please contribute!
I have a transit signal.
What is the probability it's an astrophysical false positive?
~$ pip install vespa
name = myplanet
ra = 296.003693
dec = 44.277561
rprs = 0.012585031528
period = 384.845905
photfile = myphotometry.csv
[constraints]
maxrad = 1.26
secthresh = 0.000120176767205
g = 13.8735234, 0.05
r = 13.3370844, 0.05
i = 13.1663488, 0.05
z = 13.1029807, 0.05
J = 12.263, 0.02
H = 11.919, 0.02
K = 11.852, 0.02
Kepler = 13.426
myplanet/star.ini
myplanet/fpp.ini
~$ calcfpp myplanet
*
What happened here?
Isochrones for "Know thy Star" 2017
By Tim Morton
Isochrones for "Know thy Star" 2017
A quick overview of my packages to streamline fitting of stellar parameters and transit false positive calculations.
- 1,097