Tutorial

[2]:
from ReflectX import *

Loading a full model

The most basic model is for one planet type, star type, and C/O ratio. This function loads every spectrum for that system, stored as a dictionary of XArrays. Example: load every spectrum for a Saturn-like planet at sub-solar C/O around an M dwarf star:

[ ]:
path = '/Volumes/Oy/ReflectX/ReflectXGasGiantGrid-R10000/' # Path to the location of the Teff folders:
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
system_model = LoadModel(path, Teff, planet, CtoO)
[4]:
system_model.keys()
[4]:
dict_keys(['teq75/phase0/cloudfree', 'teq75/phase0/fsed01/kzz1e+09', 'teq75/phase0/fsed01/kzz1e+11', 'teq75/phase0/fsed05/kzz1e+09', 'teq75/phase0/fsed05/kzz1e+11', 'teq75/phase0/fsed1/kzz1e+09', 'teq75/phase0/fsed1/kzz1e+11', 'teq75/phase0/fsed3/kzz1e+09', 'teq75/phase0/fsed3/kzz1e+11', 'teq75/phase0/fsed6/kzz1e+09', 'teq75/phase0/fsed6/kzz1e+11', 'teq75/phase0/fsed10/kzz1e+09', 'teq75/phase0/fsed10/kzz1e+11', 'teq75/phase45/cloudfree', 'teq75/phase45/fsed01/kzz1e+09', 'teq75/phase45/fsed01/kzz1e+11', 'teq75/phase45/fsed05/kzz1e+09', 'teq75/phase45/fsed05/kzz1e+11', 'teq75/phase45/fsed1/kzz1e+09', 'teq75/phase45/fsed1/kzz1e+11', 'teq75/phase45/fsed3/kzz1e+09', 'teq75/phase45/fsed3/kzz1e+11', 'teq75/phase45/fsed6/kzz1e+09', 'teq75/phase45/fsed6/kzz1e+11', 'teq75/phase45/fsed10/kzz1e+09', 'teq75/phase45/fsed10/kzz1e+11', 'teq75/phase90/cloudfree', 'teq75/phase90/fsed01/kzz1e+09', 'teq75/phase90/fsed01/kzz1e+11', 'teq75/phase90/fsed05/kzz1e+09', 'teq75/phase90/fsed05/kzz1e+11', 'teq75/phase90/fsed1/kzz1e+09', 'teq75/phase90/fsed1/kzz1e+11', 'teq75/phase90/fsed3/kzz1e+09', 'teq75/phase90/fsed3/kzz1e+11', 'teq75/phase90/fsed6/kzz1e+09', 'teq75/phase90/fsed6/kzz1e+11', 'teq75/phase90/fsed10/kzz1e+09', 'teq75/phase90/fsed10/kzz1e+11', 'teq75/phase120/cloudfree', 'teq75/phase120/fsed01/kzz1e+09', 'teq75/phase120/fsed01/kzz1e+11', 'teq75/phase120/fsed05/kzz1e+09', 'teq75/phase120/fsed05/kzz1e+11', 'teq75/phase120/fsed1/kzz1e+09', 'teq75/phase120/fsed1/kzz1e+11', 'teq75/phase120/fsed3/kzz1e+09', 'teq75/phase120/fsed3/kzz1e+11', 'teq75/phase120/fsed6/kzz1e+09', 'teq75/phase120/fsed6/kzz1e+11', 'teq75/phase120/fsed10/kzz1e+09', 'teq75/phase120/fsed10/kzz1e+11', 'teq75/phase140/cloudfree', 'teq75/phase140/fsed01/kzz1e+09', 'teq75/phase140/fsed01/kzz1e+11', 'teq75/phase140/fsed05/kzz1e+09', 'teq75/phase140/fsed05/kzz1e+11', 'teq75/phase140/fsed1/kzz1e+09', 'teq75/phase140/fsed1/kzz1e+11', 'teq75/phase140/fsed3/kzz1e+09', 'teq75/phase140/fsed3/kzz1e+11', 'teq75/phase140/fsed6/kzz1e+09', 'teq75/phase140/fsed6/kzz1e+11', 'teq75/phase140/fsed10/kzz1e+09', 'teq75/phase140/fsed10/kzz1e+11', 'teq100/phase0/cloudfree', 'teq100/phase0/fsed01/kzz1e+09', 'teq100/phase0/fsed01/kzz1e+11', 'teq100/phase0/fsed05/kzz1e+09', 'teq100/phase0/fsed05/kzz1e+11', 'teq100/phase0/fsed1/kzz1e+09', 'teq100/phase0/fsed1/kzz1e+11', 'teq100/phase0/fsed3/kzz1e+09', 'teq100/phase0/fsed3/kzz1e+11', 'teq100/phase0/fsed6/kzz1e+09', 'teq100/phase0/fsed6/kzz1e+11', 'teq100/phase0/fsed10/kzz1e+09', 'teq100/phase0/fsed10/kzz1e+11', 'teq100/phase45/cloudfree', 'teq100/phase45/fsed01/kzz1e+09', 'teq100/phase45/fsed01/kzz1e+11', 'teq100/phase45/fsed05/kzz1e+09', 'teq100/phase45/fsed05/kzz1e+11', 'teq100/phase45/fsed1/kzz1e+09', 'teq100/phase45/fsed1/kzz1e+11', 'teq100/phase45/fsed3/kzz1e+09', 'teq100/phase45/fsed3/kzz1e+11', 'teq100/phase45/fsed6/kzz1e+09', 'teq100/phase45/fsed6/kzz1e+11', 'teq100/phase45/fsed10/kzz1e+09', 'teq100/phase45/fsed10/kzz1e+11', 'teq100/phase90/cloudfree', 'teq100/phase90/fsed01/kzz1e+09', 'teq100/phase90/fsed01/kzz1e+11', 'teq100/phase90/fsed05/kzz1e+09', 'teq100/phase90/fsed05/kzz1e+11', 'teq100/phase90/fsed1/kzz1e+09', 'teq100/phase90/fsed1/kzz1e+11', 'teq100/phase90/fsed3/kzz1e+09', 'teq100/phase90/fsed3/kzz1e+11', 'teq100/phase90/fsed6/kzz1e+09', 'teq100/phase90/fsed6/kzz1e+11', 'teq100/phase90/fsed10/kzz1e+09', 'teq100/phase90/fsed10/kzz1e+11', 'teq100/phase120/cloudfree', 'teq100/phase120/fsed01/kzz1e+09', 'teq100/phase120/fsed01/kzz1e+11', 'teq100/phase120/fsed05/kzz1e+09', 'teq100/phase120/fsed05/kzz1e+11', 'teq100/phase120/fsed1/kzz1e+09', 'teq100/phase120/fsed1/kzz1e+11', 'teq100/phase120/fsed3/kzz1e+09', 'teq100/phase120/fsed3/kzz1e+11', 'teq100/phase120/fsed6/kzz1e+09', 'teq100/phase120/fsed6/kzz1e+11', 'teq100/phase120/fsed10/kzz1e+09', 'teq100/phase120/fsed10/kzz1e+11', 'teq100/phase140/cloudfree', 'teq100/phase140/fsed01/kzz1e+09', 'teq100/phase140/fsed01/kzz1e+11', 'teq100/phase140/fsed05/kzz1e+09', 'teq100/phase140/fsed05/kzz1e+11', 'teq100/phase140/fsed1/kzz1e+09', 'teq100/phase140/fsed1/kzz1e+11', 'teq100/phase140/fsed3/kzz1e+09', 'teq100/phase140/fsed3/kzz1e+11', 'teq100/phase140/fsed6/kzz1e+09', 'teq100/phase140/fsed6/kzz1e+11', 'teq100/phase140/fsed10/kzz1e+09', 'teq100/phase140/fsed10/kzz1e+11', 'teq150/phase0/cloudfree', 'teq150/phase0/fsed01/kzz1e+09', 'teq150/phase0/fsed01/kzz1e+11', 'teq150/phase0/fsed05/kzz1e+09', 'teq150/phase0/fsed05/kzz1e+11', 'teq150/phase0/fsed1/kzz1e+09', 'teq150/phase0/fsed1/kzz1e+11', 'teq150/phase0/fsed3/kzz1e+09', 'teq150/phase0/fsed3/kzz1e+11', 'teq150/phase0/fsed6/kzz1e+09', 'teq150/phase0/fsed6/kzz1e+11', 'teq150/phase0/fsed10/kzz1e+09', 'teq150/phase0/fsed10/kzz1e+11', 'teq150/phase45/cloudfree', 'teq150/phase45/fsed01/kzz1e+09', 'teq150/phase45/fsed01/kzz1e+11', 'teq150/phase45/fsed05/kzz1e+09', 'teq150/phase45/fsed05/kzz1e+11', 'teq150/phase45/fsed1/kzz1e+09', 'teq150/phase45/fsed1/kzz1e+11', 'teq150/phase45/fsed3/kzz1e+09', 'teq150/phase45/fsed3/kzz1e+11', 'teq150/phase45/fsed6/kzz1e+09', 'teq150/phase45/fsed6/kzz1e+11', 'teq150/phase45/fsed10/kzz1e+09', 'teq150/phase45/fsed10/kzz1e+11', 'teq150/phase90/cloudfree', 'teq150/phase90/fsed01/kzz1e+09', 'teq150/phase90/fsed01/kzz1e+11', 'teq150/phase90/fsed05/kzz1e+09', 'teq150/phase90/fsed05/kzz1e+11', 'teq150/phase90/fsed1/kzz1e+09', 'teq150/phase90/fsed1/kzz1e+11', 'teq150/phase90/fsed3/kzz1e+09', 'teq150/phase90/fsed3/kzz1e+11', 'teq150/phase90/fsed6/kzz1e+09', 'teq150/phase90/fsed6/kzz1e+11', 'teq150/phase90/fsed10/kzz1e+09', 'teq150/phase90/fsed10/kzz1e+11', 'teq150/phase120/cloudfree', 'teq150/phase120/fsed01/kzz1e+09', 'teq150/phase120/fsed01/kzz1e+11', 'teq150/phase120/fsed05/kzz1e+09', 'teq150/phase120/fsed05/kzz1e+11', 'teq150/phase120/fsed1/kzz1e+09', 'teq150/phase120/fsed1/kzz1e+11', 'teq150/phase120/fsed3/kzz1e+09', 'teq150/phase120/fsed3/kzz1e+11', 'teq150/phase120/fsed6/kzz1e+09', 'teq150/phase120/fsed6/kzz1e+11', 'teq150/phase120/fsed10/kzz1e+09', 'teq150/phase120/fsed10/kzz1e+11', 'teq150/phase140/cloudfree', 'teq150/phase140/fsed01/kzz1e+09', 'teq150/phase140/fsed01/kzz1e+11', 'teq150/phase140/fsed05/kzz1e+09', 'teq150/phase140/fsed05/kzz1e+11', 'teq150/phase140/fsed1/kzz1e+09', 'teq150/phase140/fsed1/kzz1e+11', 'teq150/phase140/fsed3/kzz1e+09', 'teq150/phase140/fsed3/kzz1e+11', 'teq150/phase140/fsed6/kzz1e+09', 'teq150/phase140/fsed6/kzz1e+11', 'teq150/phase140/fsed10/kzz1e+09', 'teq150/phase140/fsed10/kzz1e+11', 'teq180/phase0/cloudfree', 'teq180/phase0/fsed01/kzz1e+09', 'teq180/phase0/fsed01/kzz1e+11', 'teq180/phase0/fsed05/kzz1e+09', 'teq180/phase0/fsed05/kzz1e+11', 'teq180/phase0/fsed1/kzz1e+09', 'teq180/phase0/fsed1/kzz1e+11', 'teq180/phase0/fsed3/kzz1e+09', 'teq180/phase0/fsed3/kzz1e+11', 'teq180/phase0/fsed6/kzz1e+09', 'teq180/phase0/fsed6/kzz1e+11', 'teq180/phase0/fsed10/kzz1e+09', 'teq180/phase0/fsed10/kzz1e+11', 'teq180/phase45/cloudfree', 'teq180/phase45/fsed01/kzz1e+09', 'teq180/phase45/fsed01/kzz1e+11', 'teq180/phase45/fsed05/kzz1e+09', 'teq180/phase45/fsed05/kzz1e+11', 'teq180/phase45/fsed1/kzz1e+09', 'teq180/phase45/fsed1/kzz1e+11', 'teq180/phase45/fsed3/kzz1e+09', 'teq180/phase45/fsed3/kzz1e+11', 'teq180/phase45/fsed6/kzz1e+09', 'teq180/phase45/fsed6/kzz1e+11', 'teq180/phase45/fsed10/kzz1e+09', 'teq180/phase45/fsed10/kzz1e+11', 'teq180/phase90/cloudfree', 'teq180/phase90/fsed01/kzz1e+09', 'teq180/phase90/fsed01/kzz1e+11', 'teq180/phase90/fsed05/kzz1e+09', 'teq180/phase90/fsed05/kzz1e+11', 'teq180/phase90/fsed1/kzz1e+09', 'teq180/phase90/fsed1/kzz1e+11', 'teq180/phase90/fsed3/kzz1e+09', 'teq180/phase90/fsed3/kzz1e+11', 'teq180/phase90/fsed6/kzz1e+09', 'teq180/phase90/fsed6/kzz1e+11', 'teq180/phase90/fsed10/kzz1e+09', 'teq180/phase90/fsed10/kzz1e+11', 'teq180/phase120/cloudfree', 'teq180/phase120/fsed01/kzz1e+09', 'teq180/phase120/fsed01/kzz1e+11', 'teq180/phase120/fsed05/kzz1e+09', 'teq180/phase120/fsed05/kzz1e+11', 'teq180/phase120/fsed1/kzz1e+09', 'teq180/phase120/fsed1/kzz1e+11', 'teq180/phase120/fsed3/kzz1e+09', 'teq180/phase120/fsed3/kzz1e+11', 'teq180/phase120/fsed6/kzz1e+09', 'teq180/phase120/fsed6/kzz1e+11', 'teq180/phase120/fsed10/kzz1e+09', 'teq180/phase120/fsed10/kzz1e+11', 'teq180/phase140/cloudfree', 'teq180/phase140/fsed01/kzz1e+09', 'teq180/phase140/fsed01/kzz1e+11', 'teq180/phase140/fsed05/kzz1e+09', 'teq180/phase140/fsed05/kzz1e+11', 'teq180/phase140/fsed1/kzz1e+09', 'teq180/phase140/fsed1/kzz1e+11', 'teq180/phase140/fsed3/kzz1e+09', 'teq180/phase140/fsed3/kzz1e+11', 'teq180/phase140/fsed6/kzz1e+09', 'teq180/phase140/fsed6/kzz1e+11', 'teq180/phase140/fsed10/kzz1e+09', 'teq180/phase140/fsed10/kzz1e+11', 'teq200/phase0/cloudfree', 'teq200/phase0/fsed01/kzz1e+09', 'teq200/phase0/fsed01/kzz1e+11', 'teq200/phase0/fsed05/kzz1e+09', 'teq200/phase0/fsed05/kzz1e+11', 'teq200/phase0/fsed1/kzz1e+09', 'teq200/phase0/fsed1/kzz1e+11', 'teq200/phase0/fsed3/kzz1e+09', 'teq200/phase0/fsed3/kzz1e+11', 'teq200/phase0/fsed6/kzz1e+09', 'teq200/phase0/fsed6/kzz1e+11', 'teq200/phase0/fsed10/kzz1e+09', 'teq200/phase0/fsed10/kzz1e+11', 'teq200/phase45/cloudfree', 'teq200/phase45/fsed01/kzz1e+09', 'teq200/phase45/fsed01/kzz1e+11', 'teq200/phase45/fsed05/kzz1e+09', 'teq200/phase45/fsed05/kzz1e+11', 'teq200/phase45/fsed1/kzz1e+09', 'teq200/phase45/fsed1/kzz1e+11', 'teq200/phase45/fsed3/kzz1e+09', 'teq200/phase45/fsed3/kzz1e+11', 'teq200/phase45/fsed6/kzz1e+09', 'teq200/phase45/fsed6/kzz1e+11', 'teq200/phase45/fsed10/kzz1e+09', 'teq200/phase45/fsed10/kzz1e+11', 'teq200/phase90/cloudfree', 'teq200/phase90/fsed01/kzz1e+09', 'teq200/phase90/fsed01/kzz1e+11', 'teq200/phase90/fsed05/kzz1e+09', 'teq200/phase90/fsed05/kzz1e+11', 'teq200/phase90/fsed1/kzz1e+09', 'teq200/phase90/fsed1/kzz1e+11', 'teq200/phase90/fsed3/kzz1e+09', 'teq200/phase90/fsed3/kzz1e+11', 'teq200/phase90/fsed6/kzz1e+09', 'teq200/phase90/fsed6/kzz1e+11', 'teq200/phase90/fsed10/kzz1e+09', 'teq200/phase90/fsed10/kzz1e+11', 'teq200/phase120/cloudfree', 'teq200/phase120/fsed01/kzz1e+09', 'teq200/phase120/fsed01/kzz1e+11', 'teq200/phase120/fsed05/kzz1e+09', 'teq200/phase120/fsed05/kzz1e+11', 'teq200/phase120/fsed1/kzz1e+09', 'teq200/phase120/fsed1/kzz1e+11', 'teq200/phase120/fsed3/kzz1e+09', 'teq200/phase120/fsed3/kzz1e+11', 'teq200/phase120/fsed6/kzz1e+09', 'teq200/phase120/fsed6/kzz1e+11', 'teq200/phase120/fsed10/kzz1e+09', 'teq200/phase120/fsed10/kzz1e+11', 'teq200/phase140/cloudfree', 'teq200/phase140/fsed01/kzz1e+09', 'teq200/phase140/fsed01/kzz1e+11', 'teq200/phase140/fsed05/kzz1e+09', 'teq200/phase140/fsed05/kzz1e+11', 'teq200/phase140/fsed1/kzz1e+09', 'teq200/phase140/fsed1/kzz1e+11', 'teq200/phase140/fsed3/kzz1e+09', 'teq200/phase140/fsed3/kzz1e+11', 'teq200/phase140/fsed6/kzz1e+09', 'teq200/phase140/fsed6/kzz1e+11', 'teq200/phase140/fsed10/kzz1e+09', 'teq200/phase140/fsed10/kzz1e+11', 'teq250/phase0/cloudfree', 'teq250/phase0/fsed01/kzz1e+09', 'teq250/phase0/fsed01/kzz1e+11', 'teq250/phase0/fsed05/kzz1e+09', 'teq250/phase0/fsed05/kzz1e+11', 'teq250/phase0/fsed1/kzz1e+09', 'teq250/phase0/fsed1/kzz1e+11', 'teq250/phase0/fsed3/kzz1e+09', 'teq250/phase0/fsed3/kzz1e+11', 'teq250/phase0/fsed6/kzz1e+09', 'teq250/phase0/fsed6/kzz1e+11', 'teq250/phase0/fsed10/kzz1e+09', 'teq250/phase0/fsed10/kzz1e+11', 'teq250/phase45/cloudfree', 'teq250/phase45/fsed01/kzz1e+09', 'teq250/phase45/fsed01/kzz1e+11', 'teq250/phase45/fsed05/kzz1e+09', 'teq250/phase45/fsed05/kzz1e+11', 'teq250/phase45/fsed1/kzz1e+09', 'teq250/phase45/fsed1/kzz1e+11', 'teq250/phase45/fsed3/kzz1e+09', 'teq250/phase45/fsed3/kzz1e+11', 'teq250/phase45/fsed6/kzz1e+09', 'teq250/phase45/fsed6/kzz1e+11', 'teq250/phase45/fsed10/kzz1e+09', 'teq250/phase45/fsed10/kzz1e+11', 'teq250/phase90/cloudfree', 'teq250/phase90/fsed01/kzz1e+09', 'teq250/phase90/fsed01/kzz1e+11', 'teq250/phase90/fsed05/kzz1e+09', 'teq250/phase90/fsed05/kzz1e+11', 'teq250/phase90/fsed1/kzz1e+09', 'teq250/phase90/fsed1/kzz1e+11', 'teq250/phase90/fsed3/kzz1e+09', 'teq250/phase90/fsed3/kzz1e+11', 'teq250/phase90/fsed6/kzz1e+09', 'teq250/phase90/fsed6/kzz1e+11', 'teq250/phase90/fsed10/kzz1e+09', 'teq250/phase90/fsed10/kzz1e+11', 'teq250/phase120/cloudfree', 'teq250/phase120/fsed01/kzz1e+09', 'teq250/phase120/fsed01/kzz1e+11', 'teq250/phase120/fsed05/kzz1e+09', 'teq250/phase120/fsed05/kzz1e+11', 'teq250/phase120/fsed1/kzz1e+09', 'teq250/phase120/fsed1/kzz1e+11', 'teq250/phase120/fsed3/kzz1e+09', 'teq250/phase120/fsed3/kzz1e+11', 'teq250/phase120/fsed6/kzz1e+09', 'teq250/phase120/fsed6/kzz1e+11', 'teq250/phase120/fsed10/kzz1e+09', 'teq250/phase120/fsed10/kzz1e+11', 'teq250/phase140/cloudfree', 'teq250/phase140/fsed01/kzz1e+09', 'teq250/phase140/fsed01/kzz1e+11', 'teq250/phase140/fsed05/kzz1e+09', 'teq250/phase140/fsed05/kzz1e+11', 'teq250/phase140/fsed1/kzz1e+09', 'teq250/phase140/fsed1/kzz1e+11', 'teq250/phase140/fsed3/kzz1e+09', 'teq250/phase140/fsed3/kzz1e+11', 'teq250/phase140/fsed6/kzz1e+09', 'teq250/phase140/fsed6/kzz1e+11', 'teq250/phase140/fsed10/kzz1e+09', 'teq250/phase140/fsed10/kzz1e+11', 'teq300/phase0/cloudfree', 'teq300/phase0/fsed01/kzz1e+09', 'teq300/phase0/fsed01/kzz1e+11', 'teq300/phase0/fsed05/kzz1e+09', 'teq300/phase0/fsed05/kzz1e+11', 'teq300/phase0/fsed1/kzz1e+09', 'teq300/phase0/fsed1/kzz1e+11', 'teq300/phase0/fsed3/kzz1e+09', 'teq300/phase0/fsed3/kzz1e+11', 'teq300/phase0/fsed6/kzz1e+09', 'teq300/phase0/fsed6/kzz1e+11', 'teq300/phase0/fsed10/kzz1e+09', 'teq300/phase0/fsed10/kzz1e+11', 'teq300/phase45/cloudfree', 'teq300/phase45/fsed01/kzz1e+09', 'teq300/phase45/fsed01/kzz1e+11', 'teq300/phase45/fsed05/kzz1e+09', 'teq300/phase45/fsed05/kzz1e+11', 'teq300/phase45/fsed1/kzz1e+09', 'teq300/phase45/fsed1/kzz1e+11', 'teq300/phase45/fsed3/kzz1e+09', 'teq300/phase45/fsed3/kzz1e+11', 'teq300/phase45/fsed6/kzz1e+09', 'teq300/phase45/fsed6/kzz1e+11', 'teq300/phase45/fsed10/kzz1e+09', 'teq300/phase45/fsed10/kzz1e+11', 'teq300/phase90/cloudfree', 'teq300/phase90/fsed01/kzz1e+09', 'teq300/phase90/fsed01/kzz1e+11', 'teq300/phase90/fsed05/kzz1e+09', 'teq300/phase90/fsed05/kzz1e+11', 'teq300/phase90/fsed1/kzz1e+09', 'teq300/phase90/fsed1/kzz1e+11', 'teq300/phase90/fsed3/kzz1e+09', 'teq300/phase90/fsed3/kzz1e+11', 'teq300/phase90/fsed6/kzz1e+09', 'teq300/phase90/fsed6/kzz1e+11', 'teq300/phase90/fsed10/kzz1e+09', 'teq300/phase90/fsed10/kzz1e+11', 'teq300/phase120/cloudfree', 'teq300/phase120/fsed01/kzz1e+09', 'teq300/phase120/fsed01/kzz1e+11', 'teq300/phase120/fsed05/kzz1e+09', 'teq300/phase120/fsed05/kzz1e+11', 'teq300/phase120/fsed1/kzz1e+09', 'teq300/phase120/fsed1/kzz1e+11', 'teq300/phase120/fsed3/kzz1e+09', 'teq300/phase120/fsed3/kzz1e+11', 'teq300/phase120/fsed6/kzz1e+09', 'teq300/phase120/fsed6/kzz1e+11', 'teq300/phase120/fsed10/kzz1e+09', 'teq300/phase120/fsed10/kzz1e+11', 'teq300/phase140/cloudfree', 'teq300/phase140/fsed01/kzz1e+09', 'teq300/phase140/fsed01/kzz1e+11', 'teq300/phase140/fsed05/kzz1e+09', 'teq300/phase140/fsed05/kzz1e+11', 'teq300/phase140/fsed1/kzz1e+09', 'teq300/phase140/fsed1/kzz1e+11', 'teq300/phase140/fsed3/kzz1e+09', 'teq300/phase140/fsed3/kzz1e+11', 'teq300/phase140/fsed6/kzz1e+09', 'teq300/phase140/fsed6/kzz1e+11', 'teq300/phase140/fsed10/kzz1e+09', 'teq300/phase140/fsed10/kzz1e+11', 'teq500/phase0/cloudfree', 'teq500/phase0/fsed01/kzz1e+09', 'teq500/phase0/fsed01/kzz1e+11', 'teq500/phase0/fsed05/kzz1e+09', 'teq500/phase0/fsed05/kzz1e+11', 'teq500/phase0/fsed1/kzz1e+09', 'teq500/phase0/fsed1/kzz1e+11', 'teq500/phase0/fsed3/kzz1e+09', 'teq500/phase0/fsed3/kzz1e+11', 'teq500/phase0/fsed6/kzz1e+09', 'teq500/phase0/fsed6/kzz1e+11', 'teq500/phase0/fsed10/kzz1e+09', 'teq500/phase0/fsed10/kzz1e+11', 'teq500/phase45/cloudfree', 'teq500/phase45/fsed01/kzz1e+09', 'teq500/phase45/fsed01/kzz1e+11', 'teq500/phase45/fsed05/kzz1e+09', 'teq500/phase45/fsed05/kzz1e+11', 'teq500/phase45/fsed1/kzz1e+09', 'teq500/phase45/fsed1/kzz1e+11', 'teq500/phase45/fsed3/kzz1e+09', 'teq500/phase45/fsed3/kzz1e+11', 'teq500/phase45/fsed6/kzz1e+09', 'teq500/phase45/fsed6/kzz1e+11', 'teq500/phase45/fsed10/kzz1e+09', 'teq500/phase45/fsed10/kzz1e+11', 'teq500/phase90/cloudfree', 'teq500/phase90/fsed01/kzz1e+09', 'teq500/phase90/fsed01/kzz1e+11', 'teq500/phase90/fsed05/kzz1e+09', 'teq500/phase90/fsed05/kzz1e+11', 'teq500/phase90/fsed1/kzz1e+09', 'teq500/phase90/fsed1/kzz1e+11', 'teq500/phase90/fsed3/kzz1e+09', 'teq500/phase90/fsed3/kzz1e+11', 'teq500/phase90/fsed6/kzz1e+09', 'teq500/phase90/fsed6/kzz1e+11', 'teq500/phase90/fsed10/kzz1e+09', 'teq500/phase90/fsed10/kzz1e+11', 'teq500/phase120/cloudfree', 'teq500/phase120/fsed01/kzz1e+09', 'teq500/phase120/fsed01/kzz1e+11', 'teq500/phase120/fsed05/kzz1e+09', 'teq500/phase120/fsed05/kzz1e+11', 'teq500/phase120/fsed1/kzz1e+09', 'teq500/phase120/fsed1/kzz1e+11', 'teq500/phase120/fsed3/kzz1e+09', 'teq500/phase120/fsed3/kzz1e+11', 'teq500/phase120/fsed6/kzz1e+09', 'teq500/phase120/fsed6/kzz1e+11', 'teq500/phase120/fsed10/kzz1e+09', 'teq500/phase120/fsed10/kzz1e+11', 'teq500/phase140/cloudfree', 'teq500/phase140/fsed01/kzz1e+09', 'teq500/phase140/fsed01/kzz1e+11', 'teq500/phase140/fsed05/kzz1e+09', 'teq500/phase140/fsed05/kzz1e+11', 'teq500/phase140/fsed1/kzz1e+09', 'teq500/phase140/fsed1/kzz1e+11', 'teq500/phase140/fsed3/kzz1e+09', 'teq500/phase140/fsed3/kzz1e+11', 'teq500/phase140/fsed6/kzz1e+09', 'teq500/phase140/fsed6/kzz1e+11', 'teq500/phase140/fsed10/kzz1e+09', 'teq500/phase140/fsed10/kzz1e+11'])

You can then access individual spectrum XArrays through the dictionary keyword.

Example: to see the spectra for this planet at equil temp of 100K at quadrature with no clouds:

[5]:
teq = 100
phase = 90
clouds = 'cloudfree'
system_model['teq{}/phase{}/{}'.format(teq,phase,clouds)]
[5]:
<xarray.Dataset> Size: 5MB
Dimensions:     (wavelength: 113827)
Coordinates:
  * wavelength  (wavelength) float64 911kB 2.0 2.0 2.0 2.0 ... 0.3 0.3 0.3 0.3
Data variables:
    starflux    (wavelength) float64 911kB ...
    albedo      (wavelength) float64 911kB ...
    fpfs        (wavelength) float64 911kB ...
    planetflux  (wavelength) float64 911kB ...
Attributes: (12/39)
    ReflectX.Model:                                  ReflectX Gas Giant Plane...
    modeltype:                                      GasGiant
    wavelength.range:                               [0.3, 2]
    star.teff:                                      3500
    star.radius:                                    0.45
    star.radius.unit:                               Rsun
    ...                                             ...
    phase:                                          45
    ntangle:                                        6
    ngangle:                                        6
    cloud species:                                  none
    fsed:                                           nan
    kzz:                                            nan

Or with thick fluffy clouds with weak vertical mixing:

[8]:
teq = 100
phase = 90
fsed = str(0.1).replace('.','') # <- fsed 0.1 and 0.5 are stored with keywords 01 and 05
kzz = 1e9 # <- kzz's use keyword 1e+09 and 1e+11
system_model['teq{}/phase{}/fsed{}/kzz{:.0e}'.format(teq,phase,fsed,kzz)]
[8]:
<xarray.Dataset> Size: 5MB
Dimensions:     (wavelength: 113827)
Coordinates:
  * wavelength  (wavelength) float64 911kB 2.0 2.0 2.0 2.0 ... 0.3 0.3 0.3 0.3
Data variables:
    starflux    (wavelength) float64 911kB ...
    albedo      (wavelength) float64 911kB ...
    fpfs        (wavelength) float64 911kB ...
    planetflux  (wavelength) float64 911kB ...
Attributes: (12/39)
    ReflectX.Model:                                  ReflectX Gas Giant Plane...
    modeltype:                                      GasGiant
    wavelength.range:                               [0.3, 2]
    star.teff:                                      3000
    star.radius:                                    0.2
    star.radius.unit:                               Rsun
    ...                                             ...
    phase:                                          90
    ntangle:                                        6
    ngangle:                                        6
    cloud species:                                  ['CaTiO3', 'Cr', 'H2O', '...
    fsed:                                           0.1
    kzz:                                            1e+09

Loading individual spectrum XArrays

Alternatively you can load one XArray directly by suppying keywords to LoadModel:

[30]:
path = '/Volumes/Oy/'
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
# Leaving the "clouds" keyword empyt automatically loads a cloudfree model
model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90)
model
[30]:
<xarray.Dataset> Size: 5MB
Dimensions:     (wavelength: 113827)
Coordinates:
  * wavelength  (wavelength) float64 911kB 2.0 2.0 2.0 2.0 ... 0.3 0.3 0.3 0.3
Data variables:
    starflux    (wavelength) float64 911kB ...
    albedo      (wavelength) float64 911kB ...
    fpfs        (wavelength) float64 911kB ...
    planetflux  (wavelength) float64 911kB ...
Attributes: (12/39)
    ReflectX.Model:                                  ReflectX Gas Giant Plane...
    modeltype:                                      GasGiant
    wavelength.range:                               [0.3, 2]
    star.teff:                                      3500
    star.radius:                                    0.45
    star.radius.unit:                               Rsun
    ...                                             ...
    phase:                                          45
    ntangle:                                        6
    ngangle:                                        6
    cloud species:                                  none
    fsed:                                           nan
    kzz:                                            nan

Or you can load cloudy models by supplying a dictionary with cloud parameters:

[31]:
path = '/Volumes/Oy/'
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':0.1, 'kzz':1e9})
model
[31]:
<xarray.Dataset> Size: 5MB
Dimensions:     (wavelength: 113827)
Coordinates:
  * wavelength  (wavelength) float64 911kB 2.0 2.0 2.0 2.0 ... 0.3 0.3 0.3 0.3
Data variables:
    starflux    (wavelength) float64 911kB ...
    albedo      (wavelength) float64 911kB ...
    fpfs        (wavelength) float64 911kB ...
    planetflux  (wavelength) float64 911kB ...
Attributes: (12/39)
    ReflectX.Model:                                  ReflectX Gas Giant Plane...
    modeltype:                                      GasGiant
    wavelength.range:                               [0.3, 2]
    star.teff:                                      3500
    star.radius:                                    0.45
    star.radius.unit:                               Rsun
    ...                                             ...
    phase:                                          90
    ntangle:                                        6
    ngangle:                                        6
    cloud species:                                  ['CaTiO3', 'Cr', 'H2O', '...
    fsed:                                           0.1
    kzz:                                            1e+09

Anatomy of the XArrays

Each spectrum is stored as an XArray. XArrays provide details and a reference dimension, in this case all spectra are referenced to the “wavelength” coordinate.

Each XArray contains a stellar spectrum, a planet albedo spectrum, a planet/star contrast ratio spectrum (called ‘fpfs’), and a planet flux spectrum (where planet flux = fpfs * star flux). Flux spectra are from the surface of the planet/star.

Each cooridnate and data variable is accessed through the relevant keyword.

The unit for each cooridinate and data variable is shown by toggling the paper icon next to the variable and accessed through dot or keyword notation

[38]:
path = '/Volumes/Oy/'
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':0.1, 'kzz':1e9})
[39]:
model.fpfs.units, model['fpfs'].units
[39]:
('erg/cm**2/s/cm/', 'erg/cm**2/s/cm/')
[40]:
plt.semilogy(model.wavelength, model.fpfs)
plt.xlabel('$\\lambda$ [{}]'.format(model.wavelength.units))
plt.ylabel('$F_p / F_*$ [{}]'.format(model.fpfs.units))
[40]:
Text(0, 0.5, '$F_p / F_*$ [erg/cm**2/s/cm/]')
../_images/notebooks_Tutorial_16_1.png

They also contain a set of attributes outlining every parameter used to generate the model, accessed via .attrs

[25]:
model.attrs
[25]:
{'ReflectX.Model': ' ReflectX Gas Giant Planet Reflected Light PICASO model spectra  for a world with r=0.8, m=0.3 with 3000K/0.2Rsun/logg5.0 star at 0.6 au  Spectra are R=60,000; to get a different gridding use picaso.justdoit.mean_regrid  Column [0] is wavelength in microns; columns labeled  "fpfs" are the planet/star flux ratio spectrum, columns labeled "PlanetFlux" are the planet spectrum only All flux in units of ergs cm$^{-2}$ s$^{-1}$ cm$^{-1}$  Created 2025-11-04 by Logan Pearce',
 'modeltype': 'GasGiant',
 'wavelength.range': '[0.3, 2]',
 'star.teff': '3000',
 'star.radius': '0.2',
 'star.radius.unit': 'Rsun',
 'star.logg': '5.0',
 'star.metallicity': '1',
 'star.star.model.database': 'phoenix',
 'star.mass': '0.16',
 'planet.custom.pt.profile.dataframe': 'none',
 'planet.gravity': 'none',
 'planet.gravity.unit': 'm/(s**2)',
 'planet.radius': 0.8,
 'planet.radius.unit': 'Rjup',
 'planet.mass': 0.3,
 'planet.mass.unit': 'Mjup',
 'planet.tint': '100',
 'planet.separation': 0.6044891940409404,
 'planet.separation.unit': 'au',
 'planet.log.metallicity': '1.0',
 'planet.ctoo': 0.5,
 'planet.tiovo': 'no',
 'planet.path.to.correlated.k-coefficient.files': 'picaso/reference/kcoeff_2020/',
 'planet.type': 'Neptune',
 'planet.teq': 150,
 'bottom.pressure': '2.5',
 'top.pressure': '-6',
 'nlevel': '91',
 'nstr_upper': '85',
 'nstr_deep': '89',
 'nofczns': '1',
 'rfacv': '0.5',
 'phase': 90,
 'ntangle': '6',
 'ngangle': '6',
 'cloud species': ['CaTiO3',
  'Cr',
  'H2O',
  'KCl',
  'Mg2SiO4',
  'MgSiO3',
  'MnS',
  'NH3',
  'Na2S',
  'ZnS'],
 'fsed': 0.1,
 'kzz': '1e+09'}
[49]:
plt.semilogy(model.wavelength, model.fpfs)
plt.xlabel('$\\lambda$ [{}]'.format(model.wavelength.units))
plt.ylabel('$F_p / F_*$ [{}]'.format(model.fpfs.units))
plt.title('Contrast Ratio at R = {} \n for {} Mjup planet with \n Teff={} K and C/O={}'.format(model.attrs['spectral.resolution'],
                                                                                          model.attrs['planet.mass'],
                                                                                         model.attrs['star.teff'],
                                                                                         model.attrs['planet.ctoo']))
plt.annotate('T_eq = {0} K \n Sep = {1:.1f} {2} \n Phase = {3} deg \n f_sed = {4} \n Kzz = {5}'.format(
    model.attrs['planet.teq'],
    model.attrs['planet.separation'],
    model.attrs['planet.separation.unit'],
    model.attrs['phase'],
    model.attrs['fsed'],
    model.attrs['kzz']
),
            xy = (0.1,0.1), xycoords='axes fraction', va='bottom', fontsize=15)
[49]:
Text(0.1, 0.1, 'T_eq = 150 K \n Sep = 0.6 au \n Phase = 90 deg \n f_sed = 0.1 \n Kzz = 1e+09')
../_images/notebooks_Tutorial_19_1.png

Loading the full model set allows easy comparison among properties

[3]:
path = '/Volumes/Oy/' # Path to the location of the "ReflectX" folder:
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
model = LoadModel(path, Teff, planet, CtoO)
[6]:
teqs = [75, 100, 150, 300]
phase = 90
fsed = 1
kzz = 1e9

fig,ax = plt.subplots()
for teq in teqs:
    key = 'teq{}/phase{}/fsed{}/kzz{:.0e}'.format(teq,phase,fsed,kzz)
    m = model[key]
    ax.plot(m.wavelength, m.albedo, label='{} K'.format(teq))
ax.set_xlabel('$\\lambda$ [{}]'.format(m.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[6]:
<matplotlib.legend.Legend at 0x3477156a0>
../_images/notebooks_Tutorial_22_1.png

Yuck that’s hard to look at. You can regrid the spectrum onto a lower resolution to make comparison easier.

[14]:

fig,ax = plt.subplots() for teq in teqs: key = 'teq{}/phase{}/fsed{}/kzz{:.0e}'.format(teq,phase,fsed,kzz) m = model[key] wav,alb = MeanRegrid(m.wavelength, m.albedo, R = 1000) ax.plot(wav, alb, label='{} K'.format(teq)) ax.set_xlabel('$\\lambda$ [{}]'.format(m.wavelength.units)) ax.set_ylabel('Albedo') plt.legend()
[14]:
<matplotlib.legend.Legend at 0x36568a390>
../_images/notebooks_Tutorial_24_1.png
[19]:
teq = 150
phase = 90
fseds = [0.1,1,3,10]
kzz = 1e9

fig,ax = plt.subplots()
for fsed in fseds:
    key = 'teq{}/phase{}/fsed{}/kzz{:.0e}'.format(teq,phase,str(fsed).replace('.',''),kzz)
    m = model[key]
    wav,alb = MeanRegrid(m.wavelength, m.albedo, R = 1000)
    ax.plot(wav, alb, label='f_sed = {}'.format(fsed))
ax.set_xlabel('$\\lambda$ [{}]'.format(m.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[19]:
<matplotlib.legend.Legend at 0x366fb6de0>
../_images/notebooks_Tutorial_25_1.png
[18]:
teq = 150
phase = 90
fseds = 1
kzzs = [1e9,1e11]

fig,ax = plt.subplots()
for kzz in kzzs:
    key = 'teq{}/phase{}/fsed{}/kzz{:.0e}'.format(teq,phase,fsed,kzz)
    m = model[key]
    wav,alb = MeanRegrid(m.wavelength, m.albedo, R = 1000)
    ax.plot(wav, alb, label='Kzz = {:.0e}'.format(kzz))
ax.set_xlabel('$\\lambda$ [{}]'.format(m.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[18]:
<matplotlib.legend.Legend at 0x1720b6de0>
../_images/notebooks_Tutorial_26_1.png
[22]:
teq = 150
phases = [0,45,90,120]
fseds = 1
kzz = 1e9

fig,ax = plt.subplots()
for phase in phases:
    key = 'teq{}/phase{}/fsed{}/kzz{:.0e}'.format(teq,phase,str(fsed).replace('.',''),kzz)
    m = model[key]
    wav,alb = MeanRegrid(m.wavelength, m.albedo, R = 1000)
    ax.plot(wav, alb, label='{}$^\\circ$'.format(phase))
ax.set_xlabel('$\\lambda$ [{}]'.format(m.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[22]:
<matplotlib.legend.Legend at 0x34086ad20>
../_images/notebooks_Tutorial_27_1.png

Loading single XArrays allows comparison across star/planet types

[4]:
path = '/Volumes/Oy/'
Teffs = [3000, 3500, 4000, 5000, 7000]
planet = 'Saturn'
CtoO = 0.5

fig,ax = plt.subplots()
for Teff in Teffs:
    model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':1, 'kzz':1e9})
    wav,alb = MeanRegrid(model.wavelength, model.albedo, R = 1000)
    ax.plot(wav, alb, label='{} K'.format(Teff))
ax.set_xlabel('$\\lambda$ [{}]'.format(model.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[4]:
<matplotlib.legend.Legend at 0x33891b6b0>
../_images/notebooks_Tutorial_29_1.png
[7]:
path = '/Volumes/Oy/'
Teff = 3500
planets = ['Neptune','SuperNeptune','Saturn','Jupiter','SuperJupiter']
CtoO = 0.5

fig,ax = plt.subplots()
for planet in planets:
    model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':1, 'kzz':1e9})
    wav,alb = MeanRegrid(model.wavelength, model.albedo, R = 1000)
    ax.plot(wav, alb, label='{}'.format(planet))
ax.set_xlabel('$\\lambda$ [{}]'.format(model.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[7]:
<matplotlib.legend.Legend at 0x35028ad20>
../_images/notebooks_Tutorial_30_1.png
[9]:
path = '/Volumes/Oy/'
Teff = 3500
planets = 'Saturn'
CtoOs = [0.5,1.0,1.5]

fig,ax = plt.subplots()
for CtoO in CtoOs:
    model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':1, 'kzz':1e9})
    wav,alb = MeanRegrid(model.wavelength, model.albedo, R = 1000)
    ax.plot(wav, alb, label='C/O = {}'.format(CtoO))
ax.set_xlabel('$\\lambda$ [{}]'.format(model.wavelength.units))
ax.set_ylabel('Albedo')
plt.legend()
[9]:
<matplotlib.legend.Legend at 0x317da5c40>
../_images/notebooks_Tutorial_31_1.png

Filters

We also supply a set of pre-loaded Sloan SDSS prime filters and MKO J and H, as they appear on NIRC2, also stored as an XArray.

[3]:
filters = LoadFilters()
filters
[3]:
<xarray.Dataset> Size: 6MB
Dimensions:     (wavelength: 113827)
Coordinates:
  * wavelength  (wavelength) float64 911kB 2.0 2.0 2.0 2.0 ... 0.3 0.3 0.3 0.3
Data variables:
    SDSSg       (wavelength) float64 911kB ...
    SDSSr       (wavelength) float64 911kB ...
    SDSSi       (wavelength) float64 911kB ...
    SDSSz       (wavelength) float64 911kB ...
    NIRC2J      (wavelength) float64 911kB ...
    NIRC2H      (wavelength) float64 911kB ...
[6]:
import matplotlib
cmap = matplotlib.colormaps.get_cmap('plasma')
colors = cmap(np.linspace(0,0.9,len(filters.data_vars.keys())))
for i,key in enumerate(filters.data_vars.keys()):
    color = colors[i]
    plt.plot(filters.wavelength, filters[key], color=color)
    plt.axvline(filters[key].effective_wavelength, color=color, ls=':')
    plt.axvspan(filters[key].effective_wavelength - filters[key].fwhm/2, filters[key].effective_wavelength + filters[key].fwhm/2,
               alpha = 0.1, color=color)
    plt.annotate(filters[key].label,
                 xy=(filters[key].effective_wavelength,1.03), xytext = (10,0), textcoords = 'offset points',
                 color=color, fontsize=20)
plt.ylim(top=1.1)
plt.xlabel(filters.wavelength.units)
plt.ylabel('Transmission')
[6]:
Text(0, 0.5, 'Transmission')
../_images/notebooks_Tutorial_34_1.png

They are already on the same wavelength grid as the models to enable easy interaction. Ex: planet flux in each filter:

[8]:
path = '/Volumes/Oy/'
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':1, 'kzz':1e9})
[17]:
for i,key in enumerate(filters.data_vars.keys()):
    color = colors[i]
    plt.plot(model.wavelength, model.planetflux*filters[key], color=color)
plt.xlabel(filters.wavelength.units)
plt.ylabel('Planet Flux [{}]'.format(model.planetflux.units))
[17]:
Text(0, 0.5, 'Planet Flux [erg/cm**2/s/cm/]')
../_images/notebooks_Tutorial_37_1.png

Models are based on Phoenix stellar models which are defined as the flux from the stellar surface. To mimic an observation the models need to be scaled to the distance of the star. Example: scale the above model to a star at 10 pc:

[2]:
path = '/Volumes/Oy/'
Teff = 3500
planet = 'Saturn'
CtoO = 0.5
model = LoadModel(path, Teff, planet, CtoO, teq = 150, phase = 90, clouds = {'fsed':1, 'kzz':1e9})
plt.plot(model.wavelength,model.planetflux)
plt.ylabel('Planet Flux [{}]'.format(model.planetflux.units))
plt.xlabel(model.wavelength.units)
plt.title('Planet flux leaving surface')
[2]:
Text(0.5, 1.0, 'Planet flux leaving surface')
../_images/notebooks_Tutorial_39_1.png
[3]:
scaled_model = ScaleModelToStar(model, 10)

plt.plot(scaled_model.wavelength,scaled_model.planetflux)
plt.ylabel('Planet Flux [{}]'.format(scaled_model.planetflux.units))
plt.xlabel(scaled_model.wavelength.units)
plt.title('Planet flux arriving at Earth at 10 pc')
[3]:
Text(0.5, 1.0, 'Planet flux arriving at Earth at 10 pc')
../_images/notebooks_Tutorial_40_1.png
[ ]:
GetMagInFilter(scaled_model.wavelength,scaled_model.planetflux,
                filtername = 'SDSSz')