Flux calibration¶
Photometric and spectroscopic measurements of directly imaged planets typically provide the flux contrast between the companion and star. To calibrate the contrast of the companion to a flux or apparent magnitude requires an absolute measurement of the stellar flux.
In this tutorial, we will we will fit the Gaia DR3 and 2MASS magnitudes of the F8V type star AF Lep with the BT-NextGen model spectra. From the posterior samples, we will then compute synthetic photometry for the VLT/ERIS M’ filter and a synthetic spectrum for a given instrument resolution and wavelength binning.
Getting started¶
We start by setting the library path of MultiNest (see installation instructions) and import the required modules.
[1]:
import os
os.environ['DYLD_LIBRARY_PATH'] = '/Users/tomasstolker/applications/MultiNest/lib'
[2]:
import calistar
import numpy as np
[3]:
from species import SpeciesInit
from species.data.database import Database
from species.fit.fit_model import FitModel
from species.read.read_model import ReadModel
from species.plot.plot_mcmc import plot_posterior, plot_mag_posterior
from species.plot.plot_spectrum import plot_spectrum
from species.util.box_util import update_objectbox
from species.util.fit_util import get_residuals, multi_photometry
Next, we initiate the workflow by calling the SpeciesInit class. This will create both the HDF5 database and the configuration file in the working folder.
[4]:
SpeciesInit()
=======
species
=======
Version: 0.9.1.dev64+g1d42feb.d20250418
Working folder: /Users/tomasstolker/applications/species/docs/tutorials
Creating species_config.ini... [DONE]
Creating species_database.hdf5... [DONE]
Creating data folder... [DONE]
Configuration settings:
- Database: species_database.hdf5
- Data folder: data
- Magnitude of Vega: 0.03
Multiprocessing: mpi4py not installed
[4]:
<species.core.species_init.SpeciesInit at 0x1042b48c0>
We then create an instance of Database, which provides read and write access to the HDF5 database.
[5]:
database = Database()
We will use the calistar tool to retrieve the Gaia DR3 parallax of AF Lep and the Gaia, 2MASS, and WISE magnitudes. Similar to species, the calistar tool uses also the filter names as defined by the SVO Filter Profile Service. We start by creating an instance of the
CaliStar class for which we provide the Gaia DR3 source ID of AF Lep as input (see Simbad).
[6]:
cal_star = calistar.CaliStar(gaia_source=3009908378049913216, gaia_release='DR3')
========
calistar
========
Version: 0.1.1.dev10+g968509f.d20250418
Next, we run the target_star to retrieve the astrometric and photometric properties of AF Lep, which are returned in a dictionary.
[7]:
target_dict = cal_star.target_star(write_json=False, get_gaiaxp=False, allwise_catalog=True, print_astroph=False)
-> Querying GAIA DR3...
INFO: Query finished. [astroquery.utils.tap.core]
G mag = 6.209527 +/- 0.002914
BP mag = 6.488499 +/- 0.004336
RP mag = 5.752336 +/- 0.004753
GRVS mag = 5.584628 +/- 0.006723
GAIA DR3 source ID = 3009908378049913216
Reference epoch = 2016.0
Parallax = 37.25 +/- 0.02 mas
RA = 81.769924 deg +/- 0.0117 mas
Dec = -11.901182 deg +/- 0.0095 mas
Coordinates = +05h27m04.78s -11d54m04.26s
Proper motion RA = 16.92 +/- 0.02 mas/yr
Proper motion Dec = -49.32 +/- 0.02 mas/yr
Radial velocity = 21.10 +/- 0.37 km/s
Astrometric excess noise = 0.13
RUWE = 0.92
Non single star = 0
Single star probability from DSC-Combmod = 1.00
XP continuous = True
XP sampled = True
RVS spectrum = False
Effective temperature = 5902 K
Surface gravity = 4.15
Metallicity = -0.48
G-band extinction = 0.00
A0 (541.4 nm) extinction = 0.00
-> Querying Simbad...
Simbad ID = V* AF Lep
Object type = RS*
Spectral type = F8V(n)k:
Reference = 2006AJ....132..161G
-> Querying VizieR...
TYCHO source ID = 5340-1141-1
Separation between Gaia and TYCHO source = 7.1 mas
TYCHO BT mag = 6.944 +/- 0.015
TYCHO VT mag = 6.358 +/- 0.010
2MASS source ID = 05270477-1154033
Separation between Gaia and 2MASS source = 2.9 mas
2MASS J mag = 5.268 +/- 0.027
2MASS H mag = 5.087 +/- 0.026
2MASS Ks mag = 4.926 +/- 0.021
ALLWISE source ID = J052704.76-115403.8
Separation between Gaia and WISE source = 6.8 mas
WISE W1 mag = 4.915 +/- 0.179
WISE W2 mag = 4.783 +/- 0.060
WISE W3 mag = 4.904 +/- 0.015
WISE W4 mag = 4.803 +/- 0.029
-> Querying Washington Double Star catalog...
Target not found in WDS catalog
We will then assign the parralax to a separate variable and write the magnitudes to a new dictionary.
[8]:
parallax = target_dict['Gaia parallax']
[9]:
magnitudes = {'TYCHO/TYCHO.B': target_dict['TYCHO/TYCHO.B'],
'TYCHO/TYCHO.V': target_dict['TYCHO/TYCHO.V'],
'GAIA/GAIA3.G': target_dict['GAIA/GAIA3.G'],
'GAIA/GAIA3.Gbp': target_dict['GAIA/GAIA3.Gbp'],
'GAIA/GAIA3.Grp': target_dict['GAIA/GAIA3.Grp'],
'GAIA/GAIA3.Grvs': target_dict['GAIA/GAIA3.Grvs'],
'2MASS/2MASS.J': target_dict['2MASS/2MASS.J'],
'2MASS/2MASS.H': target_dict['2MASS/2MASS.H'],
'2MASS/2MASS.Ks': target_dict['2MASS/2MASS.Ks']}
We also create a list of the filter names for use later on.
[10]:
filters = list(magnitudes.keys())
Adding stellar photometry¶
We can now store the parallax and magnitudes of AF Lep in the database by using the add_object method. This will also download a flux-calibrated spectrum of Vega and convert the magnitudes into fluxes.
[11]:
database.add_object(object_name='AF Lep',
parallax=parallax,
app_mag=magnitudes,
spectrum=None)
----------
Add object
----------
Object name: AF Lep
Units: None
Deredden: None
Downloading data from 'https://archive.stsci.edu/hlsps/reference-atlases/cdbs/current_calspec/alpha_lyr_stis_011.fits' to file '/Users/tomasstolker/applications/species/docs/tutorials/data/alpha_lyr_stis_011.fits'.
100%|████████████████████████████████████████| 288k/288k [00:00<00:00, 204MB/s]
Adding spectrum: Vega
Reference: Bohlin et al. 2014, PASP, 126
URL: https://ui.adsabs.harvard.edu/abs/2014PASP..126..711B/abstract
Parallax (mas) = 37.25 +/- 0.02
Magnitudes:
- TYCHO/TYCHO.B:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 6.94 +/- 0.01
- Flux (W m-2 um-1) = 1.14e-10 +/- 1.58e-12
- TYCHO/TYCHO.V:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 6.36 +/- 0.01
- Flux (W m-2 um-1) = 1.17e-10 +/- 1.08e-12
- GAIA/GAIA3.G:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 6.21 +/- 0.00
- Flux (W m-2 um-1) = 8.45e-11 +/- 2.27e-13
- GAIA/GAIA3.Gbp:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 6.49 +/- 0.00
- Flux (W m-2 um-1) = 1.07e-10 +/- 4.25e-13
- GAIA/GAIA3.Grp:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 5.75 +/- 0.00
- Flux (W m-2 um-1) = 6.53e-11 +/- 2.86e-13
- GAIA/GAIA3.Grvs:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 5.58 +/- 0.01
- Flux (W m-2 um-1) = 5.42e-11 +/- 3.36e-13
- 2MASS/2MASS.J:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 5.27 +/- 0.03
- Flux (W m-2 um-1) = 2.48e-11 +/- 6.17e-13
- 2MASS/2MASS.H:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 5.09 +/- 0.03
- Flux (W m-2 um-1) = 1.06e-11 +/- 2.54e-13
- 2MASS/2MASS.Ks:
- Mean wavelength (um) = 2.1656e+00
- Apparent magnitude = 4.93 +/- 0.02
- Flux (W m-2 um-1) = 4.63e-12 +/- 8.95e-14
Adding a grid of model spectra¶
Next, we will download the BT-NextGen grid and add the spectra of a specified \(T_\mathrm{eff}\) range to the database.
[12]:
database.add_model('bt-nextgen')
Downloading data from 'https://home.strw.leidenuniv.nl/~stolker/species/bt-nextgen.tgz' to file '/Users/tomasstolker/applications/species/docs/tutorials/data/bt-nextgen.tgz'.
-------------------------
Add grid of model spectra
-------------------------
Database tag: bt-nextgen
Model name: BT-NextGen
100%|████████████████████████████████████████| 237M/237M [00:00<00:00, 490GB/s]
Unpacking 801/801 model spectra from BT-NextGen (226 MB)... [DONE]
Wavelength range (um) = 0.1 - 5000
Sampling (lambda/d_lambda) = 2000
Teff range (K) = 2600 - 30000
Adding BT-NextGen model spectra... data/bt-nextgen/bt-nextgen_teff_9800_logg_5.0_feh_0.5_spec.npy
Grid points stored in the database:
- Teff = [ 2600. 2700. 2800. 2900. 3000. 3100. 3200. 3300. 3400. 3500.
3600. 3700. 3800. 3900. 4000. 4100. 4200. 4300. 4400. 4500.
4600. 4700. 4800. 4900. 5000. 5100. 5200. 5300. 5400. 5500.
5600. 5700. 5800. 5900. 6000. 6100. 6200. 6300. 6400. 6500.
6600. 6700. 6800. 6900. 7000. 7200. 7400. 7600. 7800. 8000.
8200. 8400. 8600. 8800. 9000. 9200. 9400. 9600. 9800. 10000.
10200. 10400. 10600. 10800. 11000. 11200. 11400. 11600. 11800. 12000.
12500. 13000. 13500. 14000. 14500. 15000. 15500. 16000. 16500. 17000.
17500. 18000. 18500. 19000. 19500. 20000. 21000. 22000. 23000. 24000.
25000. 26000. 27000. 28000. 29000. 30000.]
- log(g) = [3. 4. 5. 6.]
- [Fe/H] = [0. 0.3 0.5]
Number of grid points per parameter:
- teff: 96
- logg: 4
- feh: 3
Fix missing grid points with a linear interpolation:
- teff = 4100.0, logg = 6.0, feh = 0.0
- teff = 4100.0, logg = 6.0, feh = 0.3
- teff = 4100.0, logg = 6.0, feh = 0.5
- teff = 4200.0, logg = 6.0, feh = 0.0
- teff = 4200.0, logg = 6.0, feh = 0.3
- teff = 4200.0, logg = 6.0, feh = 0.5
- teff = 4300.0, logg = 6.0, feh = 0.0
- teff = 4300.0, logg = 6.0, feh = 0.3
- teff = 4300.0, logg = 6.0, feh = 0.5
- teff = 4400.0, logg = 6.0, feh = 0.0
- teff = 4400.0, logg = 6.0, feh = 0.3
- teff = 4400.0, logg = 6.0, feh = 0.5
- teff = 4500.0, logg = 6.0, feh = 0.0
- teff = 4500.0, logg = 6.0, feh = 0.3
- teff = 4500.0, logg = 6.0, feh = 0.5
- teff = 4600.0, logg = 6.0, feh = 0.0
- teff = 4600.0, logg = 6.0, feh = 0.3
- teff = 4600.0, logg = 6.0, feh = 0.5
- teff = 4700.0, logg = 6.0, feh = 0.0
- teff = 4700.0, logg = 6.0, feh = 0.3
- teff = 4700.0, logg = 6.0, feh = 0.5
- teff = 4800.0, logg = 6.0, feh = 0.0
- teff = 4800.0, logg = 6.0, feh = 0.3
- teff = 4800.0, logg = 6.0, feh = 0.5
- teff = 4900.0, logg = 6.0, feh = 0.0
- teff = 4900.0, logg = 6.0, feh = 0.3
- teff = 4900.0, logg = 6.0, feh = 0.5
- teff = 5000.0, logg = 6.0, feh = 0.0
- teff = 5000.0, logg = 6.0, feh = 0.3
- teff = 5000.0, logg = 6.0, feh = 0.5
- teff = 5100.0, logg = 6.0, feh = 0.0
- teff = 5100.0, logg = 6.0, feh = 0.3
- teff = 5100.0, logg = 6.0, feh = 0.5
- teff = 5200.0, logg = 6.0, feh = 0.0
- teff = 5200.0, logg = 6.0, feh = 0.3
- teff = 5200.0, logg = 6.0, feh = 0.5
- teff = 5300.0, logg = 6.0, feh = 0.0
- teff = 5300.0, logg = 6.0, feh = 0.3
- teff = 5300.0, logg = 6.0, feh = 0.5
- teff = 5400.0, logg = 6.0, feh = 0.0
- teff = 5400.0, logg = 6.0, feh = 0.3
- teff = 5400.0, logg = 6.0, feh = 0.5
- teff = 5500.0, logg = 6.0, feh = 0.0
- teff = 5500.0, logg = 6.0, feh = 0.3
- teff = 5500.0, logg = 6.0, feh = 0.5
- teff = 5600.0, logg = 6.0, feh = 0.0
- teff = 5600.0, logg = 6.0, feh = 0.3
- teff = 5600.0, logg = 6.0, feh = 0.5
- teff = 5700.0, logg = 6.0, feh = 0.0
- teff = 5700.0, logg = 6.0, feh = 0.3
- teff = 5700.0, logg = 6.0, feh = 0.5
- teff = 5800.0, logg = 6.0, feh = 0.0
- teff = 5800.0, logg = 6.0, feh = 0.3
- teff = 5800.0, logg = 6.0, feh = 0.5
- teff = 5900.0, logg = 6.0, feh = 0.0
- teff = 5900.0, logg = 6.0, feh = 0.3
- teff = 5900.0, logg = 6.0, feh = 0.5
- teff = 6000.0, logg = 6.0, feh = 0.0
- teff = 6000.0, logg = 6.0, feh = 0.3
- teff = 6000.0, logg = 6.0, feh = 0.5
- teff = 6100.0, logg = 6.0, feh = 0.0
- teff = 6100.0, logg = 6.0, feh = 0.3
- teff = 6100.0, logg = 6.0, feh = 0.5
- teff = 6200.0, logg = 6.0, feh = 0.0
- teff = 6200.0, logg = 6.0, feh = 0.3
- teff = 6200.0, logg = 6.0, feh = 0.5
- teff = 6300.0, logg = 6.0, feh = 0.0
- teff = 6300.0, logg = 6.0, feh = 0.3
- teff = 6300.0, logg = 6.0, feh = 0.5
- teff = 6400.0, logg = 6.0, feh = 0.0
- teff = 6400.0, logg = 6.0, feh = 0.3
- teff = 6400.0, logg = 6.0, feh = 0.5
- teff = 6500.0, logg = 6.0, feh = 0.0
- teff = 6500.0, logg = 6.0, feh = 0.3
- teff = 6500.0, logg = 6.0, feh = 0.5
- teff = 6600.0, logg = 6.0, feh = 0.0
- teff = 6600.0, logg = 6.0, feh = 0.3
- teff = 6600.0, logg = 6.0, feh = 0.5
- teff = 6700.0, logg = 6.0, feh = 0.0
- teff = 6700.0, logg = 6.0, feh = 0.3
- teff = 6700.0, logg = 6.0, feh = 0.5
- teff = 6800.0, logg = 6.0, feh = 0.0
- teff = 6800.0, logg = 6.0, feh = 0.3
- teff = 6800.0, logg = 6.0, feh = 0.5
- teff = 6900.0, logg = 6.0, feh = 0.0
- teff = 6900.0, logg = 6.0, feh = 0.3
- teff = 6900.0, logg = 6.0, feh = 0.5
- teff = 7000.0, logg = 6.0, feh = 0.0
- teff = 7000.0, logg = 6.0, feh = 0.3
- teff = 7000.0, logg = 6.0, feh = 0.5
- teff = 7200.0, logg = 6.0, feh = 0.0
- teff = 7200.0, logg = 6.0, feh = 0.3
- teff = 7200.0, logg = 6.0, feh = 0.5
- teff = 7400.0, logg = 6.0, feh = 0.0
- teff = 7400.0, logg = 6.0, feh = 0.3
- teff = 7400.0, logg = 6.0, feh = 0.5
- teff = 7600.0, logg = 6.0, feh = 0.0
- teff = 7600.0, logg = 6.0, feh = 0.3
- teff = 7600.0, logg = 6.0, feh = 0.5
- teff = 7800.0, logg = 6.0, feh = 0.0
- teff = 7800.0, logg = 6.0, feh = 0.3
- teff = 7800.0, logg = 6.0, feh = 0.5
- teff = 8000.0, logg = 6.0, feh = 0.0
- teff = 8000.0, logg = 6.0, feh = 0.3
- teff = 8000.0, logg = 6.0, feh = 0.5
- teff = 8200.0, logg = 6.0, feh = 0.0
- teff = 8200.0, logg = 6.0, feh = 0.3
- teff = 8200.0, logg = 6.0, feh = 0.5
- teff = 8400.0, logg = 6.0, feh = 0.0
- teff = 8400.0, logg = 6.0, feh = 0.3
- teff = 8400.0, logg = 6.0, feh = 0.5
- teff = 8600.0, logg = 6.0, feh = 0.0
- teff = 8600.0, logg = 6.0, feh = 0.3
- teff = 8600.0, logg = 6.0, feh = 0.5
- teff = 8800.0, logg = 6.0, feh = 0.0
- teff = 8800.0, logg = 6.0, feh = 0.3
- teff = 8800.0, logg = 6.0, feh = 0.5
- teff = 9000.0, logg = 6.0, feh = 0.0
- teff = 9000.0, logg = 6.0, feh = 0.3
- teff = 9000.0, logg = 6.0, feh = 0.5
- teff = 9200.0, logg = 6.0, feh = 0.0
- teff = 9200.0, logg = 6.0, feh = 0.3
- teff = 9200.0, logg = 6.0, feh = 0.5
- teff = 9400.0, logg = 6.0, feh = 0.0
- teff = 9400.0, logg = 6.0, feh = 0.3
- teff = 9400.0, logg = 6.0, feh = 0.5
- teff = 9600.0, logg = 6.0, feh = 0.0
- teff = 9600.0, logg = 6.0, feh = 0.3
- teff = 9600.0, logg = 6.0, feh = 0.5
- teff = 9800.0, logg = 6.0, feh = 0.0
- teff = 9800.0, logg = 6.0, feh = 0.3
- teff = 9800.0, logg = 6.0, feh = 0.5
- teff = 10000.0, logg = 6.0, feh = 0.0
- teff = 10000.0, logg = 6.0, feh = 0.3
- teff = 10000.0, logg = 6.0, feh = 0.5
- teff = 10200.0, logg = 5.0, feh = 0.0
- teff = 10200.0, logg = 5.0, feh = 0.3
- teff = 10200.0, logg = 5.0, feh = 0.5
- teff = 10200.0, logg = 6.0, feh = 0.0
- teff = 10200.0, logg = 6.0, feh = 0.3
- teff = 10200.0, logg = 6.0, feh = 0.5
- teff = 10400.0, logg = 5.0, feh = 0.0
- teff = 10400.0, logg = 5.0, feh = 0.3
- teff = 10400.0, logg = 5.0, feh = 0.5
- teff = 10400.0, logg = 6.0, feh = 0.0
- teff = 10400.0, logg = 6.0, feh = 0.3
- teff = 10400.0, logg = 6.0, feh = 0.5
- teff = 10600.0, logg = 5.0, feh = 0.0
- teff = 10600.0, logg = 5.0, feh = 0.3
- teff = 10600.0, logg = 5.0, feh = 0.5
- teff = 10600.0, logg = 6.0, feh = 0.0
- teff = 10600.0, logg = 6.0, feh = 0.3
- teff = 10600.0, logg = 6.0, feh = 0.5
- teff = 10800.0, logg = 5.0, feh = 0.0
- teff = 10800.0, logg = 5.0, feh = 0.3
- teff = 10800.0, logg = 5.0, feh = 0.5
- teff = 10800.0, logg = 6.0, feh = 0.0
- teff = 10800.0, logg = 6.0, feh = 0.3
- teff = 10800.0, logg = 6.0, feh = 0.5
- teff = 11000.0, logg = 5.0, feh = 0.0
- teff = 11000.0, logg = 5.0, feh = 0.3
- teff = 11000.0, logg = 5.0, feh = 0.5
- teff = 11000.0, logg = 6.0, feh = 0.0
- teff = 11000.0, logg = 6.0, feh = 0.3
- teff = 11000.0, logg = 6.0, feh = 0.5
- teff = 11200.0, logg = 5.0, feh = 0.0
- teff = 11200.0, logg = 5.0, feh = 0.3
- teff = 11200.0, logg = 5.0, feh = 0.5
- teff = 11200.0, logg = 6.0, feh = 0.0
- teff = 11200.0, logg = 6.0, feh = 0.3
- teff = 11200.0, logg = 6.0, feh = 0.5
- teff = 11400.0, logg = 5.0, feh = 0.0
- teff = 11400.0, logg = 5.0, feh = 0.3
- teff = 11400.0, logg = 5.0, feh = 0.5
- teff = 11400.0, logg = 6.0, feh = 0.0
- teff = 11400.0, logg = 6.0, feh = 0.3
- teff = 11400.0, logg = 6.0, feh = 0.5
- teff = 11600.0, logg = 5.0, feh = 0.0
- teff = 11600.0, logg = 5.0, feh = 0.3
- teff = 11600.0, logg = 5.0, feh = 0.5
- teff = 11600.0, logg = 6.0, feh = 0.0
- teff = 11600.0, logg = 6.0, feh = 0.3
- teff = 11600.0, logg = 6.0, feh = 0.5
- teff = 11800.0, logg = 5.0, feh = 0.0
- teff = 11800.0, logg = 5.0, feh = 0.3
- teff = 11800.0, logg = 5.0, feh = 0.5
- teff = 11800.0, logg = 6.0, feh = 0.0
- teff = 11800.0, logg = 6.0, feh = 0.3
- teff = 11800.0, logg = 6.0, feh = 0.5
- teff = 12000.0, logg = 5.0, feh = 0.0
- teff = 12000.0, logg = 5.0, feh = 0.3
- teff = 12000.0, logg = 5.0, feh = 0.5
- teff = 12000.0, logg = 6.0, feh = 0.0
- teff = 12000.0, logg = 6.0, feh = 0.3
- teff = 12000.0, logg = 6.0, feh = 0.5
- teff = 12500.0, logg = 5.0, feh = 0.0
- teff = 12500.0, logg = 5.0, feh = 0.3
- teff = 12500.0, logg = 5.0, feh = 0.5
- teff = 12500.0, logg = 6.0, feh = 0.0
- teff = 12500.0, logg = 6.0, feh = 0.3
- teff = 12500.0, logg = 6.0, feh = 0.5
- teff = 13000.0, logg = 5.0, feh = 0.0
- teff = 13000.0, logg = 5.0, feh = 0.3
- teff = 13000.0, logg = 5.0, feh = 0.5
- teff = 13000.0, logg = 6.0, feh = 0.0
- teff = 13000.0, logg = 6.0, feh = 0.3
- teff = 13000.0, logg = 6.0, feh = 0.5
- teff = 13500.0, logg = 5.0, feh = 0.0
- teff = 13500.0, logg = 5.0, feh = 0.3
- teff = 13500.0, logg = 5.0, feh = 0.5
- teff = 13500.0, logg = 6.0, feh = 0.0
- teff = 13500.0, logg = 6.0, feh = 0.3
- teff = 13500.0, logg = 6.0, feh = 0.5
- teff = 14000.0, logg = 5.0, feh = 0.0
- teff = 14000.0, logg = 5.0, feh = 0.3
- teff = 14000.0, logg = 5.0, feh = 0.5
- teff = 14000.0, logg = 6.0, feh = 0.0
- teff = 14000.0, logg = 6.0, feh = 0.3
- teff = 14000.0, logg = 6.0, feh = 0.5
- teff = 14500.0, logg = 5.0, feh = 0.0
- teff = 14500.0, logg = 5.0, feh = 0.3
- teff = 14500.0, logg = 5.0, feh = 0.5
- teff = 14500.0, logg = 6.0, feh = 0.0
- teff = 14500.0, logg = 6.0, feh = 0.3
- teff = 14500.0, logg = 6.0, feh = 0.5
- teff = 15000.0, logg = 5.0, feh = 0.0
- teff = 15000.0, logg = 5.0, feh = 0.3
- teff = 15000.0, logg = 5.0, feh = 0.5
- teff = 15000.0, logg = 6.0, feh = 0.0
- teff = 15000.0, logg = 6.0, feh = 0.3
- teff = 15000.0, logg = 6.0, feh = 0.5
- teff = 15500.0, logg = 5.0, feh = 0.0
- teff = 15500.0, logg = 5.0, feh = 0.3
- teff = 15500.0, logg = 5.0, feh = 0.5
- teff = 15500.0, logg = 6.0, feh = 0.0
- teff = 15500.0, logg = 6.0, feh = 0.3
- teff = 15500.0, logg = 6.0, feh = 0.5
- teff = 16000.0, logg = 5.0, feh = 0.0
- teff = 16000.0, logg = 5.0, feh = 0.3
- teff = 16000.0, logg = 5.0, feh = 0.5
- teff = 16000.0, logg = 6.0, feh = 0.0
- teff = 16000.0, logg = 6.0, feh = 0.3
- teff = 16000.0, logg = 6.0, feh = 0.5
- teff = 16500.0, logg = 5.0, feh = 0.0
- teff = 16500.0, logg = 5.0, feh = 0.3
- teff = 16500.0, logg = 5.0, feh = 0.5
- teff = 16500.0, logg = 6.0, feh = 0.0
- teff = 16500.0, logg = 6.0, feh = 0.3
- teff = 16500.0, logg = 6.0, feh = 0.5
- teff = 17000.0, logg = 5.0, feh = 0.0
- teff = 17000.0, logg = 5.0, feh = 0.3
- teff = 17000.0, logg = 5.0, feh = 0.5
- teff = 17000.0, logg = 6.0, feh = 0.0
- teff = 17000.0, logg = 6.0, feh = 0.3
- teff = 17000.0, logg = 6.0, feh = 0.5
- teff = 17500.0, logg = 5.0, feh = 0.0
- teff = 17500.0, logg = 5.0, feh = 0.3
- teff = 17500.0, logg = 5.0, feh = 0.5
- teff = 17500.0, logg = 6.0, feh = 0.0
- teff = 17500.0, logg = 6.0, feh = 0.3
- teff = 17500.0, logg = 6.0, feh = 0.5
- teff = 18000.0, logg = 5.0, feh = 0.0
- teff = 18000.0, logg = 5.0, feh = 0.3
- teff = 18000.0, logg = 5.0, feh = 0.5
- teff = 18000.0, logg = 6.0, feh = 0.0
- teff = 18000.0, logg = 6.0, feh = 0.3
- teff = 18000.0, logg = 6.0, feh = 0.5
- teff = 18500.0, logg = 5.0, feh = 0.0
- teff = 18500.0, logg = 5.0, feh = 0.3
- teff = 18500.0, logg = 5.0, feh = 0.5
- teff = 18500.0, logg = 6.0, feh = 0.0
- teff = 18500.0, logg = 6.0, feh = 0.3
- teff = 18500.0, logg = 6.0, feh = 0.5
- teff = 19000.0, logg = 5.0, feh = 0.0
- teff = 19000.0, logg = 5.0, feh = 0.3
- teff = 19000.0, logg = 5.0, feh = 0.5
- teff = 19000.0, logg = 6.0, feh = 0.0
- teff = 19000.0, logg = 6.0, feh = 0.3
- teff = 19000.0, logg = 6.0, feh = 0.5
- teff = 19500.0, logg = 5.0, feh = 0.0
- teff = 19500.0, logg = 5.0, feh = 0.3
- teff = 19500.0, logg = 5.0, feh = 0.5
- teff = 19500.0, logg = 6.0, feh = 0.0
- teff = 19500.0, logg = 6.0, feh = 0.3
- teff = 19500.0, logg = 6.0, feh = 0.5
- teff = 20000.0, logg = 5.0, feh = 0.0
- teff = 20000.0, logg = 5.0, feh = 0.3
- teff = 20000.0, logg = 5.0, feh = 0.5
- teff = 20000.0, logg = 6.0, feh = 0.0
- teff = 20000.0, logg = 6.0, feh = 0.3
- teff = 20000.0, logg = 6.0, feh = 0.5
- teff = 21000.0, logg = 5.0, feh = 0.0
- teff = 21000.0, logg = 5.0, feh = 0.3
- teff = 21000.0, logg = 5.0, feh = 0.5
- teff = 21000.0, logg = 6.0, feh = 0.0
- teff = 21000.0, logg = 6.0, feh = 0.3
- teff = 21000.0, logg = 6.0, feh = 0.5
- teff = 22000.0, logg = 5.0, feh = 0.0
- teff = 22000.0, logg = 5.0, feh = 0.3
- teff = 22000.0, logg = 5.0, feh = 0.5
- teff = 22000.0, logg = 6.0, feh = 0.0
- teff = 22000.0, logg = 6.0, feh = 0.3
- teff = 22000.0, logg = 6.0, feh = 0.5
- teff = 23000.0, logg = 5.0, feh = 0.0
- teff = 23000.0, logg = 5.0, feh = 0.3
- teff = 23000.0, logg = 5.0, feh = 0.5
- teff = 23000.0, logg = 6.0, feh = 0.0
- teff = 23000.0, logg = 6.0, feh = 0.3
- teff = 23000.0, logg = 6.0, feh = 0.5
- teff = 24000.0, logg = 5.0, feh = 0.0
- teff = 24000.0, logg = 5.0, feh = 0.3
- teff = 24000.0, logg = 5.0, feh = 0.5
- teff = 24000.0, logg = 6.0, feh = 0.0
- teff = 24000.0, logg = 6.0, feh = 0.3
- teff = 24000.0, logg = 6.0, feh = 0.5
- teff = 25000.0, logg = 5.0, feh = 0.0
- teff = 25000.0, logg = 5.0, feh = 0.3
- teff = 25000.0, logg = 5.0, feh = 0.5
- teff = 25000.0, logg = 6.0, feh = 0.0
- teff = 25000.0, logg = 6.0, feh = 0.3
- teff = 25000.0, logg = 6.0, feh = 0.5
- teff = 26000.0, logg = 5.0, feh = 0.0
- teff = 26000.0, logg = 5.0, feh = 0.3
- teff = 26000.0, logg = 5.0, feh = 0.5
- teff = 26000.0, logg = 6.0, feh = 0.0
- teff = 26000.0, logg = 6.0, feh = 0.3
- teff = 26000.0, logg = 6.0, feh = 0.5
- teff = 27000.0, logg = 5.0, feh = 0.0
- teff = 27000.0, logg = 5.0, feh = 0.3
- teff = 27000.0, logg = 5.0, feh = 0.5
- teff = 27000.0, logg = 6.0, feh = 0.0
- teff = 27000.0, logg = 6.0, feh = 0.3
- teff = 27000.0, logg = 6.0, feh = 0.5
- teff = 28000.0, logg = 5.0, feh = 0.0
- teff = 28000.0, logg = 5.0, feh = 0.3
- teff = 28000.0, logg = 5.0, feh = 0.5
- teff = 28000.0, logg = 6.0, feh = 0.0
- teff = 28000.0, logg = 6.0, feh = 0.3
- teff = 28000.0, logg = 6.0, feh = 0.5
- teff = 29000.0, logg = 5.0, feh = 0.0
- teff = 29000.0, logg = 5.0, feh = 0.3
- teff = 29000.0, logg = 5.0, feh = 0.5
- teff = 29000.0, logg = 6.0, feh = 0.0
- teff = 29000.0, logg = 6.0, feh = 0.3
- teff = 29000.0, logg = 6.0, feh = 0.5
- teff = 30000.0, logg = 5.0, feh = 0.0
- teff = 30000.0, logg = 5.0, feh = 0.3
- teff = 30000.0, logg = 5.0, feh = 0.5
- teff = 30000.0, logg = 6.0, feh = 0.0
- teff = 30000.0, logg = 6.0, feh = 0.3
- teff = 30000.0, logg = 6.0, feh = 0.5
The following grid points are missing:
- teff = 4100.0, logg = 6.0, feh = 0.0
- teff = 4100.0, logg = 6.0, feh = 0.3
- teff = 4100.0, logg = 6.0, feh = 0.5
- teff = 4200.0, logg = 6.0, feh = 0.0
- teff = 4200.0, logg = 6.0, feh = 0.3
- teff = 4200.0, logg = 6.0, feh = 0.5
- teff = 4300.0, logg = 6.0, feh = 0.0
- teff = 4300.0, logg = 6.0, feh = 0.3
- teff = 4300.0, logg = 6.0, feh = 0.5
- teff = 4400.0, logg = 6.0, feh = 0.0
- teff = 4400.0, logg = 6.0, feh = 0.3
- teff = 4400.0, logg = 6.0, feh = 0.5
- teff = 4500.0, logg = 6.0, feh = 0.0
- teff = 4500.0, logg = 6.0, feh = 0.3
- teff = 4500.0, logg = 6.0, feh = 0.5
- teff = 4600.0, logg = 6.0, feh = 0.0
- teff = 4600.0, logg = 6.0, feh = 0.3
- teff = 4600.0, logg = 6.0, feh = 0.5
- teff = 4700.0, logg = 6.0, feh = 0.0
- teff = 4700.0, logg = 6.0, feh = 0.3
- teff = 4700.0, logg = 6.0, feh = 0.5
- teff = 4800.0, logg = 6.0, feh = 0.0
- teff = 4800.0, logg = 6.0, feh = 0.3
- teff = 4800.0, logg = 6.0, feh = 0.5
- teff = 4900.0, logg = 6.0, feh = 0.0
- teff = 4900.0, logg = 6.0, feh = 0.3
- teff = 4900.0, logg = 6.0, feh = 0.5
- teff = 5000.0, logg = 6.0, feh = 0.0
- teff = 5000.0, logg = 6.0, feh = 0.3
- teff = 5000.0, logg = 6.0, feh = 0.5
- teff = 5100.0, logg = 6.0, feh = 0.0
- teff = 5100.0, logg = 6.0, feh = 0.3
- teff = 5100.0, logg = 6.0, feh = 0.5
- teff = 5200.0, logg = 6.0, feh = 0.0
- teff = 5200.0, logg = 6.0, feh = 0.3
- teff = 5200.0, logg = 6.0, feh = 0.5
- teff = 5300.0, logg = 6.0, feh = 0.0
- teff = 5300.0, logg = 6.0, feh = 0.3
- teff = 5300.0, logg = 6.0, feh = 0.5
- teff = 5400.0, logg = 6.0, feh = 0.0
- teff = 5400.0, logg = 6.0, feh = 0.3
- teff = 5400.0, logg = 6.0, feh = 0.5
- teff = 5500.0, logg = 6.0, feh = 0.0
- teff = 5500.0, logg = 6.0, feh = 0.3
- teff = 5500.0, logg = 6.0, feh = 0.5
- teff = 5600.0, logg = 6.0, feh = 0.0
- teff = 5600.0, logg = 6.0, feh = 0.3
- teff = 5600.0, logg = 6.0, feh = 0.5
- teff = 5700.0, logg = 6.0, feh = 0.0
- teff = 5700.0, logg = 6.0, feh = 0.3
- teff = 5700.0, logg = 6.0, feh = 0.5
- teff = 5800.0, logg = 6.0, feh = 0.0
- teff = 5800.0, logg = 6.0, feh = 0.3
- teff = 5800.0, logg = 6.0, feh = 0.5
- teff = 5900.0, logg = 6.0, feh = 0.0
- teff = 5900.0, logg = 6.0, feh = 0.3
- teff = 5900.0, logg = 6.0, feh = 0.5
- teff = 6000.0, logg = 6.0, feh = 0.0
- teff = 6000.0, logg = 6.0, feh = 0.3
- teff = 6000.0, logg = 6.0, feh = 0.5
- teff = 6100.0, logg = 6.0, feh = 0.0
- teff = 6100.0, logg = 6.0, feh = 0.3
- teff = 6100.0, logg = 6.0, feh = 0.5
- teff = 6200.0, logg = 6.0, feh = 0.0
- teff = 6200.0, logg = 6.0, feh = 0.3
- teff = 6200.0, logg = 6.0, feh = 0.5
- teff = 6300.0, logg = 6.0, feh = 0.0
- teff = 6300.0, logg = 6.0, feh = 0.3
- teff = 6300.0, logg = 6.0, feh = 0.5
- teff = 6400.0, logg = 6.0, feh = 0.0
- teff = 6400.0, logg = 6.0, feh = 0.3
- teff = 6400.0, logg = 6.0, feh = 0.5
- teff = 6500.0, logg = 6.0, feh = 0.0
- teff = 6500.0, logg = 6.0, feh = 0.3
- teff = 6500.0, logg = 6.0, feh = 0.5
- teff = 6600.0, logg = 6.0, feh = 0.0
- teff = 6600.0, logg = 6.0, feh = 0.3
- teff = 6600.0, logg = 6.0, feh = 0.5
- teff = 6700.0, logg = 6.0, feh = 0.0
- teff = 6700.0, logg = 6.0, feh = 0.3
- teff = 6700.0, logg = 6.0, feh = 0.5
- teff = 6800.0, logg = 6.0, feh = 0.0
- teff = 6800.0, logg = 6.0, feh = 0.3
- teff = 6800.0, logg = 6.0, feh = 0.5
- teff = 6900.0, logg = 6.0, feh = 0.0
- teff = 6900.0, logg = 6.0, feh = 0.3
- teff = 6900.0, logg = 6.0, feh = 0.5
- teff = 7000.0, logg = 6.0, feh = 0.0
- teff = 7000.0, logg = 6.0, feh = 0.3
- teff = 7000.0, logg = 6.0, feh = 0.5
- teff = 7200.0, logg = 6.0, feh = 0.0
- teff = 7200.0, logg = 6.0, feh = 0.3
- teff = 7200.0, logg = 6.0, feh = 0.5
- teff = 7400.0, logg = 6.0, feh = 0.0
- teff = 7400.0, logg = 6.0, feh = 0.3
- teff = 7400.0, logg = 6.0, feh = 0.5
- teff = 7600.0, logg = 6.0, feh = 0.0
- teff = 7600.0, logg = 6.0, feh = 0.3
- teff = 7600.0, logg = 6.0, feh = 0.5
- teff = 7800.0, logg = 6.0, feh = 0.0
- teff = 7800.0, logg = 6.0, feh = 0.3
- teff = 7800.0, logg = 6.0, feh = 0.5
- teff = 8000.0, logg = 6.0, feh = 0.0
- teff = 8000.0, logg = 6.0, feh = 0.3
- teff = 8000.0, logg = 6.0, feh = 0.5
- teff = 8200.0, logg = 6.0, feh = 0.0
- teff = 8200.0, logg = 6.0, feh = 0.3
- teff = 8200.0, logg = 6.0, feh = 0.5
- teff = 8400.0, logg = 6.0, feh = 0.0
- teff = 8400.0, logg = 6.0, feh = 0.3
- teff = 8400.0, logg = 6.0, feh = 0.5
- teff = 8600.0, logg = 6.0, feh = 0.0
- teff = 8600.0, logg = 6.0, feh = 0.3
- teff = 8600.0, logg = 6.0, feh = 0.5
- teff = 8800.0, logg = 6.0, feh = 0.0
- teff = 8800.0, logg = 6.0, feh = 0.3
- teff = 8800.0, logg = 6.0, feh = 0.5
- teff = 9000.0, logg = 6.0, feh = 0.0
- teff = 9000.0, logg = 6.0, feh = 0.3
- teff = 9000.0, logg = 6.0, feh = 0.5
- teff = 9200.0, logg = 6.0, feh = 0.0
- teff = 9200.0, logg = 6.0, feh = 0.3
- teff = 9200.0, logg = 6.0, feh = 0.5
- teff = 9400.0, logg = 6.0, feh = 0.0
- teff = 9400.0, logg = 6.0, feh = 0.3
- teff = 9400.0, logg = 6.0, feh = 0.5
- teff = 9600.0, logg = 6.0, feh = 0.0
- teff = 9600.0, logg = 6.0, feh = 0.3
- teff = 9600.0, logg = 6.0, feh = 0.5
- teff = 9800.0, logg = 6.0, feh = 0.0
- teff = 9800.0, logg = 6.0, feh = 0.3
- teff = 9800.0, logg = 6.0, feh = 0.5
- teff = 10000.0, logg = 6.0, feh = 0.0
- teff = 10000.0, logg = 6.0, feh = 0.3
- teff = 10000.0, logg = 6.0, feh = 0.5
- teff = 10200.0, logg = 6.0, feh = 0.0
- teff = 10200.0, logg = 6.0, feh = 0.3
- teff = 10200.0, logg = 6.0, feh = 0.5
- teff = 10400.0, logg = 6.0, feh = 0.0
- teff = 10400.0, logg = 6.0, feh = 0.3
- teff = 10400.0, logg = 6.0, feh = 0.5
- teff = 10600.0, logg = 6.0, feh = 0.0
- teff = 10600.0, logg = 6.0, feh = 0.3
- teff = 10600.0, logg = 6.0, feh = 0.5
- teff = 10800.0, logg = 6.0, feh = 0.0
- teff = 10800.0, logg = 6.0, feh = 0.3
- teff = 10800.0, logg = 6.0, feh = 0.5
- teff = 11000.0, logg = 6.0, feh = 0.0
- teff = 11000.0, logg = 6.0, feh = 0.3
- teff = 11000.0, logg = 6.0, feh = 0.5
- teff = 11200.0, logg = 6.0, feh = 0.0
- teff = 11200.0, logg = 6.0, feh = 0.3
- teff = 11200.0, logg = 6.0, feh = 0.5
- teff = 11400.0, logg = 6.0, feh = 0.0
- teff = 11400.0, logg = 6.0, feh = 0.3
- teff = 11400.0, logg = 6.0, feh = 0.5
- teff = 11600.0, logg = 6.0, feh = 0.0
- teff = 11600.0, logg = 6.0, feh = 0.3
- teff = 11600.0, logg = 6.0, feh = 0.5
- teff = 11800.0, logg = 6.0, feh = 0.0
- teff = 11800.0, logg = 6.0, feh = 0.3
- teff = 11800.0, logg = 6.0, feh = 0.5
- teff = 12000.0, logg = 6.0, feh = 0.0
- teff = 12000.0, logg = 6.0, feh = 0.3
- teff = 12000.0, logg = 6.0, feh = 0.5
- teff = 12500.0, logg = 6.0, feh = 0.0
- teff = 12500.0, logg = 6.0, feh = 0.3
- teff = 12500.0, logg = 6.0, feh = 0.5
- teff = 13000.0, logg = 6.0, feh = 0.0
- teff = 13000.0, logg = 6.0, feh = 0.3
- teff = 13000.0, logg = 6.0, feh = 0.5
- teff = 13500.0, logg = 6.0, feh = 0.0
- teff = 13500.0, logg = 6.0, feh = 0.3
- teff = 13500.0, logg = 6.0, feh = 0.5
- teff = 14000.0, logg = 6.0, feh = 0.0
- teff = 14000.0, logg = 6.0, feh = 0.3
- teff = 14000.0, logg = 6.0, feh = 0.5
- teff = 14500.0, logg = 6.0, feh = 0.0
- teff = 14500.0, logg = 6.0, feh = 0.3
- teff = 14500.0, logg = 6.0, feh = 0.5
- teff = 15000.0, logg = 6.0, feh = 0.0
- teff = 15000.0, logg = 6.0, feh = 0.3
- teff = 15000.0, logg = 6.0, feh = 0.5
- teff = 15500.0, logg = 6.0, feh = 0.0
- teff = 15500.0, logg = 6.0, feh = 0.3
- teff = 15500.0, logg = 6.0, feh = 0.5
- teff = 16000.0, logg = 6.0, feh = 0.0
- teff = 16000.0, logg = 6.0, feh = 0.3
- teff = 16000.0, logg = 6.0, feh = 0.5
- teff = 16500.0, logg = 6.0, feh = 0.0
- teff = 16500.0, logg = 6.0, feh = 0.3
- teff = 16500.0, logg = 6.0, feh = 0.5
- teff = 17000.0, logg = 6.0, feh = 0.0
- teff = 17000.0, logg = 6.0, feh = 0.3
- teff = 17000.0, logg = 6.0, feh = 0.5
- teff = 17500.0, logg = 5.0, feh = 0.0
- teff = 17500.0, logg = 5.0, feh = 0.3
- teff = 17500.0, logg = 5.0, feh = 0.5
- teff = 17500.0, logg = 6.0, feh = 0.0
- teff = 17500.0, logg = 6.0, feh = 0.3
- teff = 17500.0, logg = 6.0, feh = 0.5
- teff = 18000.0, logg = 5.0, feh = 0.0
- teff = 18000.0, logg = 5.0, feh = 0.3
- teff = 18000.0, logg = 5.0, feh = 0.5
- teff = 18000.0, logg = 6.0, feh = 0.0
- teff = 18000.0, logg = 6.0, feh = 0.3
- teff = 18000.0, logg = 6.0, feh = 0.5
- teff = 18500.0, logg = 5.0, feh = 0.0
- teff = 18500.0, logg = 5.0, feh = 0.3
- teff = 18500.0, logg = 5.0, feh = 0.5
- teff = 18500.0, logg = 6.0, feh = 0.0
- teff = 18500.0, logg = 6.0, feh = 0.3
- teff = 18500.0, logg = 6.0, feh = 0.5
- teff = 19000.0, logg = 5.0, feh = 0.0
- teff = 19000.0, logg = 5.0, feh = 0.3
- teff = 19000.0, logg = 5.0, feh = 0.5
- teff = 19000.0, logg = 6.0, feh = 0.0
- teff = 19000.0, logg = 6.0, feh = 0.3
- teff = 19000.0, logg = 6.0, feh = 0.5
- teff = 19500.0, logg = 5.0, feh = 0.0
- teff = 19500.0, logg = 5.0, feh = 0.3
- teff = 19500.0, logg = 5.0, feh = 0.5
- teff = 19500.0, logg = 6.0, feh = 0.0
- teff = 19500.0, logg = 6.0, feh = 0.3
- teff = 19500.0, logg = 6.0, feh = 0.5
- teff = 20000.0, logg = 5.0, feh = 0.0
- teff = 20000.0, logg = 5.0, feh = 0.3
- teff = 20000.0, logg = 5.0, feh = 0.5
- teff = 20000.0, logg = 6.0, feh = 0.0
- teff = 20000.0, logg = 6.0, feh = 0.3
- teff = 20000.0, logg = 6.0, feh = 0.5
- teff = 21000.0, logg = 5.0, feh = 0.0
- teff = 21000.0, logg = 5.0, feh = 0.3
- teff = 21000.0, logg = 5.0, feh = 0.5
- teff = 21000.0, logg = 6.0, feh = 0.0
- teff = 21000.0, logg = 6.0, feh = 0.3
- teff = 21000.0, logg = 6.0, feh = 0.5
- teff = 22000.0, logg = 5.0, feh = 0.0
- teff = 22000.0, logg = 5.0, feh = 0.3
- teff = 22000.0, logg = 5.0, feh = 0.5
- teff = 22000.0, logg = 6.0, feh = 0.0
- teff = 22000.0, logg = 6.0, feh = 0.3
- teff = 22000.0, logg = 6.0, feh = 0.5
- teff = 23000.0, logg = 5.0, feh = 0.0
- teff = 23000.0, logg = 5.0, feh = 0.3
- teff = 23000.0, logg = 5.0, feh = 0.5
- teff = 23000.0, logg = 6.0, feh = 0.0
- teff = 23000.0, logg = 6.0, feh = 0.3
- teff = 23000.0, logg = 6.0, feh = 0.5
- teff = 24000.0, logg = 5.0, feh = 0.0
- teff = 24000.0, logg = 5.0, feh = 0.3
- teff = 24000.0, logg = 5.0, feh = 0.5
- teff = 24000.0, logg = 6.0, feh = 0.0
- teff = 24000.0, logg = 6.0, feh = 0.3
- teff = 24000.0, logg = 6.0, feh = 0.5
- teff = 25000.0, logg = 5.0, feh = 0.0
- teff = 25000.0, logg = 5.0, feh = 0.3
- teff = 25000.0, logg = 5.0, feh = 0.5
- teff = 25000.0, logg = 6.0, feh = 0.0
- teff = 25000.0, logg = 6.0, feh = 0.3
- teff = 25000.0, logg = 6.0, feh = 0.5
- teff = 26000.0, logg = 5.0, feh = 0.0
- teff = 26000.0, logg = 5.0, feh = 0.3
- teff = 26000.0, logg = 5.0, feh = 0.5
- teff = 26000.0, logg = 6.0, feh = 0.0
- teff = 26000.0, logg = 6.0, feh = 0.3
- teff = 26000.0, logg = 6.0, feh = 0.5
- teff = 27000.0, logg = 5.0, feh = 0.0
- teff = 27000.0, logg = 5.0, feh = 0.3
- teff = 27000.0, logg = 5.0, feh = 0.5
- teff = 27000.0, logg = 6.0, feh = 0.0
- teff = 27000.0, logg = 6.0, feh = 0.3
- teff = 27000.0, logg = 6.0, feh = 0.5
- teff = 28000.0, logg = 5.0, feh = 0.0
- teff = 28000.0, logg = 5.0, feh = 0.3
- teff = 28000.0, logg = 5.0, feh = 0.5
- teff = 28000.0, logg = 6.0, feh = 0.0
- teff = 28000.0, logg = 6.0, feh = 0.3
- teff = 28000.0, logg = 6.0, feh = 0.5
- teff = 29000.0, logg = 5.0, feh = 0.0
- teff = 29000.0, logg = 5.0, feh = 0.3
- teff = 29000.0, logg = 5.0, feh = 0.5
- teff = 29000.0, logg = 6.0, feh = 0.0
- teff = 29000.0, logg = 6.0, feh = 0.3
- teff = 29000.0, logg = 6.0, feh = 0.5
- teff = 30000.0, logg = 5.0, feh = 0.0
- teff = 30000.0, logg = 5.0, feh = 0.3
- teff = 30000.0, logg = 5.0, feh = 0.5
- teff = 30000.0, logg = 6.0, feh = 0.0
- teff = 30000.0, logg = 6.0, feh = 0.3
- teff = 30000.0, logg = 6.0, feh = 0.5
Number of stored grid points: 1152
Number of interpolated grid points: 60
Number of missing grid points: 291
/Users/tomasstolker/applications/species/species/util/data_util.py:586: UserWarning: Could not interpolate 291 grid points so storing zeros instead.
warnings.warn(
Fitting the 2MASS fluxes with the calibration spectrum¶
Now that we have prepared the database, we can fit the photometric fluxes with the model grid. To do so, we use the FitModel class, which provides a Bayesian framework for parameter estimation. The argument of bounds contains a dictionary with the uniform priors that are used. In this example, we fix \(T_\mathrm{eff}\), \(\log(g)\), and \([\mathrm{Fe}/\mathrm{H}]\), so we effectively
scale the model spectrum to the data by adjusting the distance and radius. We will also account for a instrument-specific error inflation, relative to the actual uncertainties on the 2MASS fluxes (so allowing them to increase up to a factor of 10). Finally, the parallax is automatically included with a normal prior.
[13]:
fit = FitModel(object_name='AF Lep',
model='bt-nextgen',
bounds={'teff': (6000., 9000.),
'logg': None,
'feh': (0., 0.),
'radius': (1., 20.),
'ext_av': (0., 2.),
'log_error_TYCHO/TYCHO': (-3., 1.),
'log_error_GAIA/GAIA3': (-3., 1.),
'log_error_2MASS/2MASS': (-3., 1.)},
inc_phot=True,
inc_spec=False,
ext_model='G23',
fit_corr=None,
apply_weights=False,
normal_prior=None)
-----------------
Fit model spectra
-----------------
Object name: AF Lep
Model tag: bt-nextgen
Binary star: False
Blackbody components: 0
Teff interpolation range: (6000.0, 9000.0)
Interpolating 2MASS/2MASS.H... [DONE]
Interpolating 2MASS/2MASS.J... [DONE]
Interpolating 2MASS/2MASS.Ks... [DONE]
Interpolating GAIA/GAIA3.G... [DONE]
Interpolating GAIA/GAIA3.Gbp... [DONE]
Interpolating GAIA/GAIA3.Grp... [DONE]
Interpolating GAIA/GAIA3.Grvs... [DONE]
Interpolating TYCHO/TYCHO.B... [DONE]
Interpolating TYCHO/TYCHO.V... [DONE]
Fixing 1 parameters:
- feh = 0.0
Fitting 8 parameters:
- teff
- logg
- radius
- parallax
- log_error_2MASS/2MASS
- log_error_GAIA/GAIA3
- log_error_TYCHO/TYCHO
- ext_av
Uniform priors (min, max):
- teff = (6000.0, 9000.0)
- logg = (np.float64(3.0), np.float64(6.0))
- radius = (1.0, 20.0)
- ext_av = (0.0, 2.0)
- log_error_TYCHO/TYCHO = (-3.0, 1.0)
- log_error_GAIA/GAIA3 = (-3.0, 1.0)
- log_error_2MASS/2MASS = (-3.0, 1.0)
Normal priors (mean, sigma):
- parallax = 37.25 +/- 0.02
Weights for the log-likelihood function:
- 2MASS/2MASS.H = 1.00
- 2MASS/2MASS.J = 1.00
- 2MASS/2MASS.Ks = 1.00
- GAIA/GAIA3.G = 1.00
- GAIA/GAIA3.Gbp = 1.00
- GAIA/GAIA3.Grp = 1.00
- GAIA/GAIA3.Grvs = 1.00
- TYCHO/TYCHO.B = 1.00
- TYCHO/TYCHO.V = 1.00
We will sample the posterior distribution with the run_multinest, which uses the nested sampling implementation of MultiNest. The samples will be stored in the database by the tag name. Let’s run the sampler with 200 live points!
[14]:
fit.run_multinest(tag='aflep',
n_live_points=200,
output='multinest/',
resume=False)
------------------------------
Nested sampling with MultiNest
------------------------------
Database tag: aflep
Number of live points: 200
Resume previous fit: False
Output folder: multinest/
*****************************************************
MultiNest v3.10
Copyright Farhan Feroz & Mike Hobson
Release Jul 2015
no. of live points = 200
dimensionality = 8
*****************************************************
ln(ev)= 222.22120707053287 +/- 0.24258168118124457
Total Likelihood Evaluations: 12790
Sampling finished. Exiting MultiNest
log-evidence = 222.22 +/- 0.24
log-evidence (importance sampling) = 220.97 +/- 0.04
Sample with the maximum likelihood:
- Log-likelihood = 237.64
- teff = 7517.85
- logg = 3.03
- radius = 11.34
- parallax = 37.25
- log_error_2MASS/2MASS = -1.32
- log_error_GAIA/GAIA3 = -2.19
- log_error_TYCHO/TYCHO = -1.34
- ext_av = 0.96
---------------------
Add posterior samples
---------------------
Database tag: aflep
Sampler: multinest
Samples shape: (1457, 9)
ln(Z) = 222.22 +/- 0.24
Plotting the posterior distribution¶
After running the sampler, we can plot the posterior distribution of the 3 free parameters with the plot_posterior by simply pointing to the database tag that was specified with run_multinest.
[15]:
fig = plot_posterior(tag='aflep',
offset=(-0.3, -0.3),
title_fmt=['.0f', '.1f', '.2f', '.2f', '.1f', '.1f', '.1f', '.1f'],
object_type='star',
output=None)
---------------------
Get posterior samples
---------------------
Database tag: aflep
Random samples: None
Samples shape: (1457, 9)
Parameters:
- teff
- logg
- radius
- parallax
- log_error_2MASS/2MASS
- log_error_GAIA/GAIA3
- log_error_TYCHO/TYCHO
- ext_av
- feh
Uniform priors (min, max):
- ext_av = (0.0, 2.0)
- log_error_2MASS/2MASS = (-3.0, 1.0)
- log_error_GAIA/GAIA3 = (-3.0, 1.0)
- log_error_TYCHO/TYCHO = (-3.0, 1.0)
- logg = (3.0, 6.0)
- radius = (1.0, 20.0)
- teff = (6000.0, 9000.0)
Normal priors (mean, sigma):
- parallax = (37.25, 0.02)
----------------------------
Plot posterior distributions
----------------------------
Database tag: aflep
Object type: star
Manual parameters: None
Model type: atmosphere
Model name: bt-nextgen
Sampler: multinest
Median parameters:
- teff = 7218.30
- logg = 3.93
- radius = 11.10
- parallax = 37.25
- log_error_2MASS/2MASS = -1.45
- log_error_GAIA/GAIA3 = -1.87
- log_error_TYCHO/TYCHO = -1.35
- ext_av = 0.69
- feh = 0.00e+00
Sample with the maximum likelihood:
- teff = 7517.85
- logg = 3.03
- radius = 11.34
- parallax = 37.25
- log_error_2MASS/2MASS = -1.32
- log_error_GAIA/GAIA3 = -2.19
- log_error_TYCHO/TYCHO = -1.34
- ext_av = 0.96
- feh = 0.00e+00
Parameters included in corner plot:
- teff
- logg
- radius
- parallax
- log_error_2MASS/2MASS
- log_error_GAIA/GAIA3
- log_error_TYCHO/TYCHO
- ext_av
- feh
The corner plot shows that the surface gravity, \(\log{(g)}\), is unconstrained. That is to be expected when fitting only photometric fluxes. The plot_posterior function returned the Figure object of the plot. The functionalities of Matplotlib can be used for
further customization of the plot. For example, the axes of the plot are stored at the axes attribute of Figure.
Extracting spectral samples¶
Later on, we will create a plot of the data, best-fit spectrum, and random spectral samples of the posterior distribution. We start by drawing 30 random samples the posterior distribution and calculate spectra at \(R = 100\). The get_mcmc_spectra method of Database returns a list with ModelBox objects.
[16]:
samples = database.get_mcmc_spectra(tag='aflep',
random=30,
wavel_range=(0.2, 10.),
spec_res=100.)
---------------------
Get posterior spectra
---------------------
Database tag: aflep
Wavelength range (um): (0.2, 10.0)
Resolution: 100.0
Number of samples: 30
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_2MASS/2MASS' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_GAIA/GAIA3' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_TYCHO/TYCHO' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8000.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8000.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8200.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8200.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
Let’s have a look at the content of the first ModelBox by using the open_box method.
[17]:
samples[0].open_box()
Opening ModelBox...
model = bt-nextgen
type = None
wavelength = [ 0.19813159 0.19822979 0.19832803 ... 10.08270227 10.08769928
10.09269876]
flux = [4.40750095e-12 4.41747897e-12 4.42946630e-12 ... 1.16541838e-14
1.16414779e-14 1.16300164e-14]
parameters = {'teff': np.float64(6653.93458378914), 'logg': np.float64(3.760439381270614), 'radius': np.float64(11.33590820196617), 'parallax': np.float64(37.25791066432891), 'log_error_2MASS/2MASS': np.float64(-1.3318553052682374), 'log_error_GAIA/GAIA3': np.float64(-1.7446844054180772), 'log_error_TYCHO/TYCHO': np.float64(-1.59363034939532), 'ext_av': np.float64(0.3716795348310623), 'feh': np.float64(0.0), 'ext_model': 'G23', 'log_lum_atm': np.float64(0.3795913132854787), 'log_lum': np.float64(0.3795913132854787), 'mass': np.float64(298.63209057137215)}
quantity = flux
contribution = None
bol_flux = None
spec_res = 100.0
extra_out = None
Next, we extract the best-fit parameters from the posterior distribution, for which we adopt the sample with the highest likelihood value. The get_probable_sample function returns a dictionary with the parameters, including the ones that were fixed with FitModel.
[18]:
best_sample = database.get_probable_sample(tag='aflep')
print(best_sample)
--------------------------------------
Get sample with the maximum likelihood
--------------------------------------
Database tag: aflep
Parameters:
- teff = 7517.85
- logg = 3.03
- radius = 11.34
- parallax = 37.25
- log_error_2MASS/2MASS = -1.32
- log_error_GAIA/GAIA3 = -2.19
- log_error_TYCHO/TYCHO = -1.34
- ext_av = 0.96
- feh = 0.00e+00
{'teff': np.float64(7517.853029280628), 'logg': np.float64(3.029992283861892), 'radius': np.float64(11.344711576806324), 'parallax': np.float64(37.254467565224225), 'log_error_2MASS/2MASS': np.float64(-1.3240589638682154), 'log_error_GAIA/GAIA3': np.float64(-2.1865908538512913), 'log_error_TYCHO/TYCHO': np.float64(-1.3422588365537464), 'ext_av': np.float64(0.9603423867276895), 'feh': np.float64(0.0), 'ext_model': 'G23'}
Next, we interpolate the the BT-NextGen grid at the best-fit parameters. To do so, we first create an instance of ReadModel and then use the get_model method to interpolate the grid with the best-fit parameters that are provided as argument of model_par. Similar to
get_mcmc_spectra, we also smooth this spectrum to \(R = 100\). The model spectrum is again returned in a ModelBox.
[19]:
read_model = ReadModel(model='bt-nextgen', wavel_range=(0.2, 10.))
model_box = read_model.get_model(model_param=best_sample, spec_res=100.)
Each Box is a Python object so the content is easily accessed as attributes.
[20]:
print(model_box.parameters)
{'teff': np.float64(7517.853029280628), 'logg': np.float64(3.029992283861892), 'radius': np.float64(11.344711576806324), 'parallax': np.float64(37.254467565224225), 'log_error_2MASS/2MASS': np.float64(-1.3240589638682154), 'log_error_GAIA/GAIA3': np.float64(-2.1865908538512913), 'log_error_TYCHO/TYCHO': np.float64(-1.3422588365537464), 'ext_av': np.float64(0.9603423867276895), 'feh': np.float64(0.0), 'ext_model': 'G23', 'log_lum_atm': np.float64(0.5923268078010101), 'log_lum': np.float64(0.5923268078010101), 'mass': np.float64(55.63699361492282)}
Extracting the object data¶
For the plot, we also require the data of AF Lep. These can be extracted with the get_object, which returns the data (e.g. photometry, spectra, and parallax) for a given object_name.
[21]:
object_box = database.get_object(object_name='AF Lep')
----------
Get object
----------
Object name: AF Lep
Include photometry: True
Include spectra: True
The data are stored in an ObjectBox. Let’s have a look at the content by using open_box.
[22]:
object_box.open_box()
Opening ObjectBox...
name = AF Lep
filters = ['2MASS/2MASS.H', '2MASS/2MASS.J', '2MASS/2MASS.Ks', 'GAIA/GAIA3.G', 'GAIA/GAIA3.Gbp', 'GAIA/GAIA3.Grp', 'GAIA/GAIA3.Grvs', 'TYCHO/TYCHO.B', 'TYCHO/TYCHO.V']
mean_wavel = {'2MASS/2MASS.H': np.float64(1.6513664598414621), '2MASS/2MASS.J': np.float64(1.24105170694321), '2MASS/2MASS.Ks': np.float64(2.1656311232670684), 'GAIA/GAIA3.G': np.float64(0.6390220344836051), 'GAIA/GAIA3.Gbp': np.float64(0.5182576434561539), 'GAIA/GAIA3.Grp': np.float64(0.7825078823058362), 'GAIA/GAIA3.Grvs': np.float64(0.8579038886678563), 'TYCHO/TYCHO.B': np.float64(0.4204402338522224), 'TYCHO/TYCHO.V': np.float64(0.5321858932760944)}
filter_width = {'2MASS/2MASS.H': np.float64(0.26015811914758125), '2MASS/2MASS.J': np.float64(0.17153194664785976), '2MASS/2MASS.Ks': np.float64(0.2756978551366518), 'GAIA/GAIA3.G': np.float64(0.4548329156080867), 'GAIA/GAIA3.Gbp': np.float64(0.265906323279631), 'GAIA/GAIA3.Grp': np.float64(0.2927564057435905), 'GAIA/GAIA3.Grvs': np.float64(0.024033393738493447), 'TYCHO/TYCHO.B': np.float64(0.07097413295903066), 'TYCHO/TYCHO.V': np.float64(0.09782694043670259)}
magnitude = {'2MASS/2MASS.H': array([5.08699989, 0.026 ]), '2MASS/2MASS.J': array([5.26800013, 0.027 ]), '2MASS/2MASS.Ks': array([4.92600012, 0.021 ]), 'GAIA/GAIA3.G': array([6.20952702e+00, 2.91377850e-03]), 'GAIA/GAIA3.Gbp': array([6.48849869e+00, 4.33574151e-03]), 'GAIA/GAIA3.Grp': array([5.75233603e+00, 4.75317523e-03]), 'GAIA/GAIA3.Grvs': array([5.58462763, 0.00672318]), 'TYCHO/TYCHO.B': array([6.94399977, 0.015 ]), 'TYCHO/TYCHO.V': array([6.3579998, 0.01 ])}
flux = {'2MASS/2MASS.H': array([1.06225069e-11, 2.54400268e-13]), '2MASS/2MASS.J': array([2.47903129e-11, 6.16547051e-13]), '2MASS/2MASS.Ks': array([4.62676149e-12, 8.94950798e-14]), 'GAIA/GAIA3.G': array([8.45277628e-11, 2.26846515e-13]), 'GAIA/GAIA3.Gbp': array([1.06501941e-10, 4.25302309e-13]), 'GAIA/GAIA3.Grp': array([6.52521791e-11, 2.85664262e-13]), 'GAIA/GAIA3.Grvs': array([5.41933538e-11, 3.35582201e-13]), 'TYCHO/TYCHO.B': array([1.14064558e-10, 1.57591020e-12]), 'TYCHO/TYCHO.V': array([1.17364571e-10, 1.08098290e-12])}
spectrum = None
parallax = [3.72538531e+01 1.94716435e-02]
distance = None
With FitModel it is possible to account for systematic uncertainties, either in the data or the model, for example to scale individual spectra or inflate the uncertainties. Since we inflated the 2MASS uncertainties during the fit, we will use the update_objectbox function to adjust the photometric precision with the best-fit error inflation as extracted with get_probable_sample.
[23]:
object_box = update_objectbox(object_box, best_sample, model='bt-nextgen')
----------------
Update ObjectBox
----------------
Inflating the uncertainty of 2MASS/2MASS.H by a factor 0.05... [DONE]
Inflating the uncertainty of 2MASS/2MASS.J by a factor 0.05... [DONE]
Inflating the uncertainty of 2MASS/2MASS.Ks by a factor 0.05... [DONE]
Inflating the uncertainty of GAIA/GAIA3.G by a factor 6.51e-03... [DONE]
Inflating the uncertainty of GAIA/GAIA3.Gbp by a factor 6.51e-03... [DONE]
Inflating the uncertainty of GAIA/GAIA3.Grp by a factor 6.51e-03... [DONE]
Inflating the uncertainty of GAIA/GAIA3.Grvs by a factor 6.51e-03... [DONE]
Inflating the uncertainty of TYCHO/TYCHO.B by a factor 0.05... [DONE]
Inflating the uncertainty of TYCHO/TYCHO.V by a factor 0.05... [DONE]
Residuals and synthetic photometry¶
Before creating the plot, there are two more boxes that we will create. First, we use the get_residuals function to calculate the residuals (i.e. data minus model, relative to the data uncertainties), together with the reduced \(\chi^2\). The residuals and mean wavelengths are stored in a ResidualsBox for each of the 2MASS filters.
[24]:
residuals = get_residuals(tag='aflep',
parameters=best_sample,
objectbox=object_box,
inc_phot=True,
inc_spec=False)
-------------------
Calculate residuals
-------------------
Database tag: aflep
Results type: FitModel
Model: bt-nextgen
Binary: False
Model parameters:
- teff
- logg
- radius
- parallax
- log_error_2MASS/2MASS
- log_error_GAIA/GAIA3
- log_error_TYCHO/TYCHO
- ext_av
- feh
Fixed parameters:
- feh
Include photometry: True
Include spectra: False
Residuals (sigma):
- 2MASS/2MASS.H = -0.90
- 2MASS/2MASS.J = -0.88
- 2MASS/2MASS.Ks = 0.38
- GAIA/GAIA3.G = -0.93
- GAIA/GAIA3.Gbp = 0.17
- GAIA/GAIA3.Grp = -0.78
- GAIA/GAIA3.Grvs = 1.47
- TYCHO/TYCHO.B = -0.21
- TYCHO/TYCHO.V = 0.99
Number of data points = 9
Number of model parameters = 9
Number of fixed parameters = 1
Number of degrees of freedom = 1
chi2 = 6.40
reduced chi2 = 6.40
[25]:
residuals.open_box()
Opening ResidualsBox...
name = AF Lep
photometry = {'2MASS/2MASS.H': array([ 1.65136646, -0.89644342]), '2MASS/2MASS.J': array([ 1.24105171, -0.87795982]), '2MASS/2MASS.Ks': array([2.16563112, 0.38187019]), 'GAIA/GAIA3.G': array([ 0.63902203, -0.93327223]), 'GAIA/GAIA3.Gbp': array([0.51825764, 0.16684394]), 'GAIA/GAIA3.Grp': array([ 0.78250788, -0.77508044]), 'GAIA/GAIA3.Grvs': array([0.85790389, 1.46893272]), 'TYCHO/TYCHO.B': array([ 0.42044023, -0.21411926]), 'TYCHO/TYCHO.V': array([0.53218589, 0.98848302])}
spectrum = None
chi2_red = 6.400541810688866
Secondly, we will also use the dictionary with best-fit parameters to calculate synthetic photometry for the three filters that were used in the fit. The multi_photometry returns a SynphotBox, which includes a dictionary with the photometric fluxes.
[26]:
syn_phot = multi_photometry(datatype='model',
spectrum='bt-nextgen',
filters=filters,
parameters=best_sample)
--------------------------
Calculate multi-photometry
--------------------------
Data type: model
Spectrum name: bt-nextgen
Parameters:
- teff = 7517.85
- logg = 3.03
- radius = 11.34
- parallax = 37.25
- log_error_2MASS/2MASS = -1.32
- log_error_GAIA/GAIA3 = -2.19
- log_error_TYCHO/TYCHO = -1.34
- ext_av = 0.96
- feh = 0.00e+00
- log_lum_atm = 0.59
- log_lum = 0.59
- mass = 55.64
Magnitudes:
- TYCHO/TYCHO.B = 6.93
- TYCHO/TYCHO.V = 6.41
- GAIA/GAIA3.G = 6.20
- GAIA/GAIA3.Gbp = 6.49
- GAIA/GAIA3.Grp = 5.75
- GAIA/GAIA3.Grvs = 5.60
- 2MASS/2MASS.J = 5.22
- 2MASS/2MASS.H = 5.03
- 2MASS/2MASS.Ks = 4.95
Fluxes (W m-2 um-1):
- TYCHO/TYCHO.B = 1.15e-10
- TYCHO/TYCHO.V = 1.12e-10
- GAIA/GAIA3.G = 8.51e-11
- GAIA/GAIA3.Gbp = 1.06e-10
- GAIA/GAIA3.Grp = 6.57e-11
- GAIA/GAIA3.Grvs = 5.35e-11
- 2MASS/2MASS.J = 2.60e-11
- 2MASS/2MASS.H = 1.11e-11
- 2MASS/2MASS.Ks = 4.54e-12
[27]:
syn_phot.open_box()
Opening SynphotBox...
name = synphot
wavelength = {'TYCHO/TYCHO.B': np.float64(0.4204402338522224), 'TYCHO/TYCHO.V': np.float64(0.5321858932760944), 'GAIA/GAIA3.G': np.float64(0.6390220344836051), 'GAIA/GAIA3.Gbp': np.float64(0.5182576434561539), 'GAIA/GAIA3.Grp': np.float64(0.7825078823058362), 'GAIA/GAIA3.Grvs': np.float64(0.8579038886678563), '2MASS/2MASS.J': np.float64(1.24105170694321), '2MASS/2MASS.H': np.float64(1.6513664598414621), '2MASS/2MASS.Ks': np.float64(2.1656311232670684)}
flux = {'TYCHO/TYCHO.B': np.float64(1.1523618208904695e-10), 'TYCHO/TYCHO.V': np.float64(1.1220905084857075e-10), 'GAIA/GAIA3.G': np.float64(8.508619518440099e-11), 'GAIA/GAIA3.Gbp': np.float64(1.063663984172461e-10), 'GAIA/GAIA3.Grp': np.float64(6.56505111769456e-11), 'GAIA/GAIA3.Grvs': np.float64(5.34831652510155e-11), '2MASS/2MASS.J': np.float64(2.600054212664338e-11), '2MASS/2MASS.H': np.float64(1.114841611840194e-11), '2MASS/2MASS.Ks': np.float64(4.537770263853272e-12)}
app_mag = {'TYCHO/TYCHO.B': (np.float64(6.93290441632761), None), 'TYCHO/TYCHO.V': (np.float64(6.406772617600119), None), 'GAIA/GAIA3.G': (np.float64(6.202377693331766), None), 'GAIA/GAIA3.Gbp': (np.float64(6.489881362956711), None), 'GAIA/GAIA3.Grp': (np.float64(5.745728294436186), None), 'GAIA/GAIA3.Grvs': (np.float64(5.598949944650379), None), '2MASS/2MASS.J': (np.float64(5.2162491373064155), None), '2MASS/2MASS.H': (np.float64(5.034534517455762), None), '2MASS/2MASS.Ks': (np.float64(4.947086637624245), None)}
abs_mag = {'TYCHO/TYCHO.B': (np.float64(4.788796220887799), None), 'TYCHO/TYCHO.V': (np.float64(4.262664422160308), None), 'GAIA/GAIA3.G': (np.float64(4.0582694978919545), None), 'GAIA/GAIA3.Gbp': (np.float64(4.3457731675169), None), 'GAIA/GAIA3.Grp': (np.float64(3.601620098996375), None), 'GAIA/GAIA3.Grvs': (np.float64(3.4548417492105683), None), '2MASS/2MASS.J': (np.float64(3.0721409418666044), None), '2MASS/2MASS.H': (np.float64(2.8904263220159505), None), '2MASS/2MASS.Ks': (np.float64(2.8029784421844335), None)}
Plotting the data and model spectra¶
We have now prepared all the boxes with data so we are ready to combine them in a plot of the spectral energy distribution (SED) of AF Lep! The plot_spectrum function requires a list of Box objects as argument of boxes. For each box we can set the plot style, by providing a list with dictionaries as
argument of plot_kwargs, in the same order as the list of boxes. Items in the list can be set to None, in which case some default values are used. The ResidualsBox is passed as argument of residuals and will also plot the filter profiles by providing the list with names as argument to filters. Finally, there is a handful of parameters that can be adjusted for the appearance of the plot
(see the API documentation of plot_spectrum for details). Let’s have a look at the plot!
[28]:
fig = plot_spectrum(boxes=[samples, model_box, object_box],
filters=filters,
residuals=residuals,
plot_kwargs=[{'ls': '-', 'lw': 0.2, 'color': 'gray'},
{'ls': '-', 'lw': 0.7, 'color': 'black'},
{'TYCHO/TYCHO.B': {'marker': 's', 'ms': 5., 'color': 'tab:cyan', 'ls': 'none', 'label': 'TYCHO'},
'TYCHO/TYCHO.V': {'marker': 's', 'ms': 5., 'color': 'tab:cyan', 'ls': 'none'},
'GAIA/GAIA3.G': {'marker': 's', 'ms': 5., 'color': 'tab:orange', 'ls': 'none', 'label': 'Gaia DR3'},
'GAIA/GAIA3.Gbp': {'marker': 's', 'ms': 5., 'color': 'tab:orange', 'ls': 'none'},
'GAIA/GAIA3.Grp': {'marker': 's', 'ms': 5., 'color': 'tab:orange', 'ls': 'none'},
'GAIA/GAIA3.Grvs': {'marker': 's', 'ms': 5., 'color': 'tab:orange', 'ls': 'none'},
'2MASS/2MASS.J': {'marker': 's', 'ms': 5., 'color': 'tab:pink', 'ls': 'none', 'label': '2MASS'},
'2MASS/2MASS.H': {'marker': 's', 'ms': 5., 'color': 'tab:pink', 'ls': 'none'},
'2MASS/2MASS.Ks': {'marker': 's', 'ms': 5., 'color': 'tab:pink', 'ls': 'none'}}],
xlim=(0.3, 2.5),
ylim=(-1.5e-11, 1.5e-10),
ylim_res=(-5., 5.),
scale=('linear', 'linear'),
offset=(-0.5, -0.08),
figsize=(6., 4.),
object_type='star',
legend=[{'loc': 'upper right', 'frameon': False, 'fontsize': 9.},
{'loc': 'lower left', 'frameon': False, 'fontsize': 10.}],
output=None)
-------------
Plot spectrum
-------------
Boxes:
- List with 30 x ModelBox
- ModelBox
- ObjectBox
Object type: star
Quantity: flux density
Units: ('um', 'W m-2 um-1')
Filter profiles: ['TYCHO/TYCHO.B', 'TYCHO/TYCHO.V', 'GAIA/GAIA3.G', 'GAIA/GAIA3.Gbp', 'GAIA/GAIA3.Grp', 'GAIA/GAIA3.Grvs', '2MASS/2MASS.J', '2MASS/2MASS.H', '2MASS/2MASS.Ks']
Figure size: (6.0, 4.0)
Legend parameters: None
Include model name: False
Font sizes: {'xlabel': 11.0, 'ylabel': 11.0, 'title': 13.0, 'legend': 9.0}
Note that the photometric uncertainties are inflated in the plot by the best-fit parameters that were fitted. These parameters had been applied to the data when running the update_objectbox on the ObjectBox.
The plot_spectrum function returned the Figure object of the plot. The functionalities of Matplotlib can be used for further customization of the plot. For example, the axes of the plot are stored at the axes attribute of Figure.
[29]:
fig.axes
[29]:
[<Axes: ylabel='$F_\\lambda$ (10$^{-10}$ W m$^{-2}$ µm$^{-1}$)'>,
<Axes: ylabel='$T_\\lambda$'>,
<Axes: xlabel='Wavelength (µm)', ylabel='$\\Delta$$F_\\lambda$ ($\\sigma$)'>]
Photometric calibration¶
Now that we have the posterior samples of the atmospheric parameters, we can calculated synthetic photometry (including uncertainties) for any other filter. As an example, we will calculate the magnitude and flux for the VLT/ERIS \(M'\) filter. The plot_mag_posterior function plots the distribution of the magnitudes, by propagating the posterior of the atmospheric parameters, and
returns an array with the samples. We simply need to specify the database tag and provide the filter_name name as listed on the SVO Filter Profile Service). The function returns an ndarray with the samples and the Figure of the plot that can be used for further customization.
[30]:
phot_mag, fig = plot_mag_posterior(tag='aflep',
filter_name='Paranal/ERIS.Mp',
n_samples=200,
xlim=(4.75, 5.05),
output=None)
Plotting photometry samples...
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_2MASS/2MASS' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_GAIA/GAIA3' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_TYCHO/TYCHO' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7000.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7000.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7200.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7200.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7600.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7600.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7400.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7400.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
[DONE]
There is also the get_mcmc_photometry method of Database, which works in a similar way as plot_mag_posterior, but can also return the posterior of the flux density instead of the magnitude.
[31]:
phot_flux = database.get_mcmc_photometry(tag='aflep',
filter_name='Paranal/ERIS.Mp',
random=200,
phot_type='flux')
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_2MASS/2MASS' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_GAIA/GAIA3' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/read/read_model.py:705: UserWarning: The 'log_error_TYCHO/TYCHO' parameter is not required by 'bt-nextgen' so the parameter will be ignored. The mandatory parameters are ['teff', 'logg', 'feh'].
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7000.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7000.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7200.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(7200.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8600.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8600.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8400.0), 'logg': np.float64(6.0), 'feh': np.float64(0.0)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
/Users/tomasstolker/applications/species/species/util/model_util.py:647: UserWarning: The selected parameters have a nearest grid point for which a spectrum is not available: {'teff': np.float64(8400.0), 'logg': np.float64(6.0), 'feh': np.float64(0.3)}. Therefore, zeros had been stored for the spectrum at this grid point. Interpolating from this grid point will therefore be inaccurate. When using FitModel, it is best to adjust the prior range in the 'bounds' parameter accordingly to exclude the parameter space for which model spectrum is missing. See also details printed when the model spectra are added to the database with add_model().
warnings.warn(
To calculate the flux density in the \(M'\)-band, we simply adopt the mean and the standard deviation of the distribution.
[32]:
print(f'Flux density (W m-2 um-1) = {np.mean(phot_flux):.2e} +/- {np.std(phot_flux):.2e}')
Flux density (W m-2 um-1) = 2.31e-13 +/- 8.20e-15
Spectral calibration¶
We can also compute a stellar, synthetic spectrum with uncertainties for a specific instrument. To do so, we use again the get_mcmc_spectra method from earlier, but this time we draw a larger number of spectra. Furthermore, for our hypothetical instrument, we assume a resolving power of \(R = 100\) and set the wavelength points (20 linearly-spaced points between 1 and 2.5
\(\mu\)m) as argument of wavel_resample.
[33]:
samples = database.get_mcmc_spectra(tag='aflep',
random=100,
wavel_range=(0.2, 10.),
spec_res=100.,
wavel_resample=np.linspace(1., 2.5, 20))
---------------------
Get posterior spectra
---------------------
Database tag: aflep
Wavelength range (um): (0.2, 10.0)
Resolution: 100.0
Number of samples: 100
Next, we calculate the mean and standard deviation of the 100 samples, which we adopt as the synthetic spectrum of AF Lep.
[34]:
spec_flux = np.mean([box.flux for box in samples], axis=0)
spec_sigma = np.std([box.flux for box in samples], axis=0)
Let’s write the synthetic spectrum to a text file.
[35]:
calib_spec = np.column_stack([samples[0].wavelength, spec_flux, spec_sigma])
np.savetxt('calib_spec.dat', calib_spec)
Now we can use the add_object method to append the spectrum to the data of AF Lep in the database. The parallax and magnitudes were already provided previously so we can set the arguments of parallax and app_mag to None.
[36]:
database.add_object(object_name='AF Lep',
parallax=None,
app_mag=None,
spectrum={'calibration': ('calib_spec.dat', None, 100.)})
----------
Add object
----------
Object name: AF Lep
Units: None
Deredden: None
Spectra:
- Spectrum:
- Database tag: calibration
- Filename: calib_spec.dat
- Data shape: (20, 3)
- Wavelength range (um): 1.00 - 2.50
- Mean flux (W m-2 um-1): 1.36e-11
- Mean error (W m-2 um-1): 3.92e-13
- Instrument resolution:
- calibration: 100.0
Next, we use the get_object method for extracting all the data of AF Lep from the database and storing these in an ObjectBox. We need to apply again the update_objectbox function to account for the inflated errors of the 2MASS fluxes.
[37]:
object_box = database.get_object(object_name='AF Lep')
object_box = update_objectbox(object_box, best_sample)
----------
Get object
----------
Object name: AF Lep
Include photometry: True
Include spectra: True
----------------
Update ObjectBox
----------------
/Users/tomasstolker/applications/species/species/util/box_util.py:87: UserWarning: The dictionary with model parameters contains the error inflation for '2MASS/2MASS' but the argument of 'model' is set to 'None'. Inflation of the errors is therefore not possible.
warnings.warn(
/Users/tomasstolker/applications/species/species/util/box_util.py:87: UserWarning: The dictionary with model parameters contains the error inflation for 'GAIA/GAIA3' but the argument of 'model' is set to 'None'. Inflation of the errors is therefore not possible.
warnings.warn(
/Users/tomasstolker/applications/species/species/util/box_util.py:87: UserWarning: The dictionary with model parameters contains the error inflation for 'TYCHO/TYCHO' but the argument of 'model' is set to 'None'. Inflation of the errors is therefore not possible.
warnings.warn(
If we now open the ObjectBox with open_box then we see that the synthetic spectrum is indeed included together with the previously added data.
[38]:
object_box.open_box()
Opening ObjectBox...
name = AF Lep
filters = ['2MASS/2MASS.H', '2MASS/2MASS.J', '2MASS/2MASS.Ks', 'GAIA/GAIA3.G', 'GAIA/GAIA3.Gbp', 'GAIA/GAIA3.Grp', 'GAIA/GAIA3.Grvs', 'TYCHO/TYCHO.B', 'TYCHO/TYCHO.V']
mean_wavel = {'2MASS/2MASS.H': np.float64(1.6513664598414621), '2MASS/2MASS.J': np.float64(1.24105170694321), '2MASS/2MASS.Ks': np.float64(2.1656311232670684), 'GAIA/GAIA3.G': np.float64(0.6390220344836051), 'GAIA/GAIA3.Gbp': np.float64(0.5182576434561539), 'GAIA/GAIA3.Grp': np.float64(0.7825078823058362), 'GAIA/GAIA3.Grvs': np.float64(0.8579038886678563), 'TYCHO/TYCHO.B': np.float64(0.4204402338522224), 'TYCHO/TYCHO.V': np.float64(0.5321858932760944)}
filter_width = {'2MASS/2MASS.H': np.float64(0.26015811914758125), '2MASS/2MASS.J': np.float64(0.17153194664785976), '2MASS/2MASS.Ks': np.float64(0.2756978551366518), 'GAIA/GAIA3.G': np.float64(0.4548329156080867), 'GAIA/GAIA3.Gbp': np.float64(0.265906323279631), 'GAIA/GAIA3.Grp': np.float64(0.2927564057435905), 'GAIA/GAIA3.Grvs': np.float64(0.024033393738493447), 'TYCHO/TYCHO.B': np.float64(0.07097413295903066), 'TYCHO/TYCHO.V': np.float64(0.09782694043670259)}
magnitude = {'2MASS/2MASS.H': array([5.08699989, 0.026 ]), '2MASS/2MASS.J': array([5.26800013, 0.027 ]), '2MASS/2MASS.Ks': array([4.92600012, 0.021 ]), 'GAIA/GAIA3.G': array([6.20952702e+00, 2.91377850e-03]), 'GAIA/GAIA3.Gbp': array([6.48849869e+00, 4.33574151e-03]), 'GAIA/GAIA3.Grp': array([5.75233603e+00, 4.75317523e-03]), 'GAIA/GAIA3.Grvs': array([5.58462763, 0.00672318]), 'TYCHO/TYCHO.B': array([6.94399977, 0.015 ]), 'TYCHO/TYCHO.V': array([6.3579998, 0.01 ])}
flux = {'2MASS/2MASS.H': array([1.06225069e-11, 2.54400268e-13]), '2MASS/2MASS.J': array([2.47903129e-11, 6.16547051e-13]), '2MASS/2MASS.Ks': array([4.62676149e-12, 8.94950798e-14]), 'GAIA/GAIA3.G': array([8.45277628e-11, 2.26846515e-13]), 'GAIA/GAIA3.Gbp': array([1.06501941e-10, 4.25302309e-13]), 'GAIA/GAIA3.Grp': array([6.52521791e-11, 2.85664262e-13]), 'GAIA/GAIA3.Grvs': array([5.41933538e-11, 3.35582201e-13]), 'TYCHO/TYCHO.B': array([1.14064558e-10, 1.57591020e-12]), 'TYCHO/TYCHO.V': array([1.17364571e-10, 1.08098290e-12])}
spectrum = {'calibration': (array([[1.00000000e+00, 4.26356747e-11, 1.64182772e-12],
[1.07894737e+00, 3.54905484e-11, 1.30185808e-12],
[1.15789474e+00, 3.01494606e-11, 1.02171137e-12],
[1.23684211e+00, 2.54151770e-11, 7.05943530e-13],
[1.31578947e+00, 2.13667222e-11, 4.60635651e-13],
[1.39473684e+00, 1.83937170e-11, 3.66586794e-13],
[1.47368421e+00, 1.55204725e-11, 3.10660907e-13],
[1.55263158e+00, 1.31586343e-11, 3.11136170e-13],
[1.63157895e+00, 1.14422996e-11, 2.63732141e-13],
[1.71052632e+00, 9.78604136e-12, 2.28051041e-13],
[1.78947368e+00, 8.50020736e-12, 1.95661400e-13],
[1.86842105e+00, 7.28426872e-12, 1.75249445e-13],
[1.94736842e+00, 6.32260523e-12, 1.53000107e-13],
[2.02631579e+00, 5.61011637e-12, 1.37181202e-13],
[2.10526316e+00, 4.88064516e-12, 1.23282955e-13],
[2.18421053e+00, 4.20025425e-12, 1.08805343e-13],
[2.26315789e+00, 3.77291682e-12, 9.96731323e-14],
[2.34210526e+00, 3.32805077e-12, 8.55776780e-14],
[2.42105263e+00, 2.93264364e-12, 7.65043019e-14],
[2.50000000e+00, 2.60348724e-12, 7.22897148e-14]]), None, None, np.float64(100.0))}
parallax = [3.72538531e+01 1.94716435e-02]
distance = None
Let’s have a look at the content of the returned ObjectBox by simply passing it to the plot_spectrum function!
[39]:
fig = plot_spectrum(boxes=[object_box],
plot_kwargs=[{'calibration': {'marker': 'o', 'ms': 5., 'color': 'black', 'ls': 'none', 'label': 'Synthetic spectrum'},
'2MASS/2MASS.J': {'marker': 'o', 'ms': 5., 'color': 'tab:blue', 'ls': 'none', 'label': '2MASS'},
'2MASS/2MASS.H': {'marker': 'o', 'ms': 5., 'color': 'tab:blue', 'ls': 'none'},
'2MASS/2MASS.Ks': {'marker': 'o', 'ms': 5., 'color': 'tab:blue', 'ls': 'none'}}],
xlim=(0.9, 2.6),
ylim=(-0.5e-11, 5e-11),
scale=('linear', 'linear'),
offset=(-0.1, -0.07),
figsize=(6., 3.),
legend={'loc': 'upper right', 'fontsize': 12.},
output=None)
-------------
Plot spectrum
-------------
Boxes:
- ObjectBox
Object type: planet
Quantity: flux density
Units: ('um', 'W m-2 um-1')
Filter profiles: None
Figure size: (6.0, 3.0)
Legend parameters: None
Include model name: False
Font sizes: {'xlabel': 11.0, 'ylabel': 11.0, 'title': 13.0, 'legend': 9.0}
The plot_spectrum function returned the Figure object of the plot. The functionalities of Matplotlib can be used for further customization of the plot. For example, the axes of the plot are stored at the axes attribute of Figure.
[40]:
fig.axes
[40]:
[<Axes: xlabel='Wavelength (µm)', ylabel='$F_\\lambda$ (10$^{-11}$ W m$^{-2}$ µm$^{-1}$)'>]