Stellar Emission Models¶
Below we describe a number of different emission models describing the emission from stars and their natal birth clouds. We provide details on each stellar model, as well as information on the keys from the underlying grid that are extracted where necessary.
First, we need a grid
to pass to each model; here we load our test grid:
[1]:
from unyt import Myr, dimensionless, kelvin
from synthesizer.emission_models.attenuation import PowerLaw
from synthesizer.emission_models.dust.emission import Blackbody
from synthesizer.grid import Grid
# Get the grid which we'll need for extraction
grid_dir = "../../../../tests/test_grid"
grid_name = "test_grid"
grid = Grid(grid_name, grid_dir=grid_dir)
IncidentEmission¶
Incident emission is the pure stellar emission from a population of stars, usually defined by a SPS model. Incident emission has not been processed by natal birth clouds, or in any other way through a photoionisation code.
Specifically, an incident emission model defines the extraction of the "incident"
SPS spectra key from a grid file.
[2]:
from synthesizer.emission_models import IncidentEmission
incident = IncidentEmission(grid=grid)
print(incident)
|==== EmissionModel: incident ====|
|---------------------------------|
| INCIDENT (stellar) |
|---------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: incident |
| Escape fraction: 0.0 |
| Save emission: True |
|=================================|
NebularLineEmission¶
Nebular line emission defines the line emission from the natal birth cloud surrounding young stars. Specificly for this model, you can specify an escape fraction for lyman alpha independently from the total escape fraction applied to all line emission.
Here we also demonstrate using a mask, since nebular line emission is typically from young stars still surrounded by their birth cloud.
Specifically, a nebular line emission model defines the extraction of the "linecont"
reprocessed SPS spectra key from a grid file.
[3]:
from synthesizer.emission_models import NebularLineEmission
line_cont = NebularLineEmission(
grid,
fesc=0.8,
fesc_ly_alpha=1.0,
mask_attr="ages",
mask_op="<",
mask_thresh=10 * Myr,
)
print(line_cont)
|== EmissionModel: nebular_line ===|
|----------------------------------|
| NEBULAR_LINE (stellar) |
|----------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.8 |
| Save emission: True |
| Masks: |
| - ages < 10 Myr |
|==================================|
TransmittedEmission¶
Transmitted emission is the incident emission that is transmitted through the gas when reprocessed using a photoionisation model. Unlike incident emission, transmitted emission has little flux below the Lyman-limit, since it is typically absorbed by the neutral gas (depending on fesc
).
A transmitted model defines the extraction of the "transmitted"
reprocessed SPS spectra key from a grid file, with some escape fraction.
[4]:
from synthesizer.emission_models import TransmittedEmission
transmitted = TransmittedEmission(grid=grid, fesc=0.1)
print(transmitted)
|==== EmissionModel: transmitted ====|
|------------------------------------|
| TRANSMITTED (stellar) |
|------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.1 |
| Save emission: True |
|====================================|
EscapedEmission¶
Escaped emission is the portion of the incident emission which, when reprocessed using a photoionsaition code, fully escapes without being affected by the gas.
An escaped model defines the extraction of the "transmitted"
reprocessed SPS spectra key from a grid file, with some escape fraction (i.e. escaped = fesc * incident
).
[5]:
from synthesizer.emission_models import EscapedEmission
escaped = EscapedEmission(grid, fesc=0.1)
print(escaped)
|====== EmissionModel: escaped ======|
|------------------------------------|
| ESCAPED (stellar) |
|------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.9 |
| Save emission: True |
|====================================|
Notice here that the “escape fraction” for the escaped model is 1 - fesc
, because escaped is the inverse of transmitted.
NebularContinuumEmission¶
Nebular continuum emission is the continuum emission coming directly from the nebular birth cloud of a stellar population. A nebular continuum model defines the extraction of the "nebular_continuum"
reprocessed SPS spectra key from a grid file.
Like LineContinuum
we also use a mask here, since nebular continuum is typically dominated by young stars still surrounded by their natal birth clouds.
[6]:
from synthesizer.emission_models import NebularContinuumEmission
nebular_cont = NebularContinuumEmission(
grid, fesc=0.2, mask_attr="ages", mask_op="<", mask_thresh=10 * Myr
)
print(nebular_cont)
|==== EmissionModel: nebular_continuum ====|
|------------------------------------------|
| NEBULAR_CONTINUUM (stellar) |
|------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular_continuum |
| Escape fraction: 0.2 |
| Save emission: True |
| Masks: |
| - ages < 10 Myr |
|==========================================|
NebularEmission¶
Nebular emission is the emission from the gas surrounding a (typically young) stellar population. Unlike other models we’ve shown so far, NebularEmission
comes in two forms depending on whether a Lyman-\(\alpha\) escape fraction is provided. If a Lyman-\(\alpha\) escape fraction less than 1.0 is passed then NebularEmission
is the combination of NebularLineEmission
and NebularContinuumEmission
. If not, it is an extraction of the "nebular"
reprocessed SPS spectra.
Again, as for NebularLineEmission
and NebularContinuum
, we’ll include a mask for young stars.
[7]:
from synthesizer.emission_models import NebularEmission
nebular_extract = NebularEmission(grid)
print(nebular_extract)
print()
nebular_combined = NebularEmission(
grid,
fesc=0.1,
fesc_ly_alpha=0.8,
mask_attr="ages",
mask_op="<",
mask_thresh=10 * Myr,
)
print(nebular_combined)
nebular_combined.plot_emission_tree()
|==== EmissionModel: nebular ====|
|--------------------------------|
| NEBULAR (stellar) |
|--------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular |
| Escape fraction: 0.0 |
| Save emission: True |
|================================|
|========================== EmissionModel: nebular =========================|
|---------------------------------------------------------------------------|
| NEBULAR_CONTINUUM (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular_continuum |
| Escape fraction: 0.1 |
| Save emission: True |
| Masks: |
| - ages < 10 Myr |
|---------------------------------------------------------------------------|
| NEBULAR_LINE_LYMAN_ALPHA (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.2799999999999999 |
| Save emission: False |
| Masks: |
| - ages < 10 Myr |
|---------------------------------------------------------------------------|
| NEBULAR_LINE_NO_LYMAN (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.1 |
| Save emission: False |
| Masks: |
| - ages < 10 Myr |
|---------------------------------------------------------------------------|
| NEBULAR_LINE (stellar) |
|---------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line_no_lyman, nebular_line_lyman_alpha |
| Save emission: True |
| Masks: |
| - ages < 10 Myr |
|---------------------------------------------------------------------------|
| NEBULAR (stellar) |
|---------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line, nebular_continuum |
| Save emission: True |
| Masks: |
| - ages < 10 Myr |
|===========================================================================|
[7]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
The NebularEmission
model is our first example of a model model with child models (LineCont
and NebularContinuuum
). For more complex models like this we can plot the “emission tree” to visualise the model. When the model is eventually used to generate emission, the model will be traversed bottom to top (breadth first), generating each spectra in the tree.
ReprocessedEmission¶
Reprocessed emission is the stellar emission which has been reprocessed by gas (i.e. the combination of the reprocessed spectra we saw above, transmitted and nebular).
A reprocessed model defines the combination of TransmittedEmission
and NebularEmission
.
[8]:
from synthesizer.emission_models import ReprocessedEmission
reprocessed = ReprocessedEmission(grid, fesc=0.1, fesc_ly_alpha=0.8)
print(reprocessed)
reprocessed.plot_emission_tree()
|======================== EmissionModel: reprocessed =======================|
|---------------------------------------------------------------------------|
| TRANSMITTED (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.1 |
| Save emission: True |
|---------------------------------------------------------------------------|
| NEBULAR_LINE_NO_LYMAN (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.1 |
| Save emission: False |
|---------------------------------------------------------------------------|
| NEBULAR_LINE_LYMAN_ALPHA (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.2799999999999999 |
| Save emission: False |
|---------------------------------------------------------------------------|
| NEBULAR_CONTINUUM (stellar) |
|---------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular_continuum |
| Escape fraction: 0.1 |
| Save emission: True |
|---------------------------------------------------------------------------|
| NEBULAR_LINE (stellar) |
|---------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line_no_lyman, nebular_line_lyman_alpha |
| Save emission: True |
|---------------------------------------------------------------------------|
| NEBULAR (stellar) |
|---------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line, nebular_continuum |
| Save emission: True |
|---------------------------------------------------------------------------|
| REPROCESSED (stellar) |
|---------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular, transmitted |
| Save emission: True |
|===========================================================================|
[8]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
IntrinsicEmission¶
Intrinsic emission is the total stellar emission, including all photoionisation reprocessing, prior to dust attenuation. Effectively, intrinsic emission is the emission that is “incident” on the dust distribution. Note that this does not take account of any dust within the birth cloud; this is typically modelled internally within a photoionisation code.
An intrinsic model defines the combination of EscapedEmission
and ReprocessedEmission
.
[9]:
from synthesizer.emission_models import IntrinsicEmission
intrinsic = IntrinsicEmission(grid, fesc=0.1, fesc_ly_alpha=1.0)
print(intrinsic)
intrinsic.plot_emission_tree()
|=========== EmissionModel: intrinsic ===========|
|------------------------------------------------|
| TRANSMITTED (stellar) |
|------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.1 |
| Save emission: True |
|------------------------------------------------|
| NEBULAR (stellar) |
|------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular |
| Escape fraction: 0.1 |
| Save emission: True |
|------------------------------------------------|
| ESCAPED (stellar) |
|------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.9 |
| Save emission: True |
|------------------------------------------------|
| REPROCESSED (stellar) |
|------------------------------------------------|
|Combination model: |
| Combine models: nebular, transmitted |
| Save emission: True |
|------------------------------------------------|
| INTRINSIC (stellar) |
|------------------------------------------------|
|Combination model: |
| Combine models: escaped, reprocessed |
| Save emission: True |
|================================================|
[9]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
EmergentEmission¶
Emergent emission is the dust attenuated intrinsic emission, i.e. the stellar emission, post nebular attenuation and post dust attenuation. We haven’t seen the Attenuation model yet, since this is a “common” model, and will be covered below.
An emergent model is a combination of EscapedEmission
and AttenuatedEmission
.
[10]:
from synthesizer.emission_models import EmergentEmission
emergent = EmergentEmission(
grid=grid,
dust_curve=PowerLaw(slope=-1),
apply_dust_to=reprocessed,
tau_v=0.67,
fesc=0.2,
)
print(emergent)
emergent.plot_emission_tree()
|======================================= EmissionModel: emergent ========================================|
|--------------------------------------------------------------------------------------------------------|
| TRANSMITTED (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.1 |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| NEBULAR_LINE_NO_LYMAN (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.1 |
| Save emission: False |
|--------------------------------------------------------------------------------------------------------|
| NEBULAR_LINE_LYMAN_ALPHA (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.2799999999999999 |
| Save emission: False |
|--------------------------------------------------------------------------------------------------------|
| NEBULAR_CONTINUUM (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular_continuum |
| Escape fraction: 0.1 |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| ESCAPED (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.8 |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| NEBULAR_LINE (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line_no_lyman, nebular_line_lyman_alpha |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| NEBULAR (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line, nebular_continuum |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| REPROCESSED (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular, transmitted |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| ATTENUATED (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e899a020> |
| Apply dust to: reprocessed |
| Optical depth (tau_v): [0.67] |
| Save emission: True |
|--------------------------------------------------------------------------------------------------------|
| EMERGENT (stellar) |
|--------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: attenuated, escaped |
| Save emission: True |
|========================================================================================================|
[10]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
TotalEmission¶
The Total emission is the combined emission from the stellar population (post dust attenuation) along with the thermal emission from dust.
Once again, dust emission is a common model and is covered here. A total model is a combination of DustEmission
and EmergentEmission
.
[11]:
from synthesizer.emission_models import TotalEmission
total = TotalEmission(
grid=grid,
dust_curve=PowerLaw(slope=-1),
tau_v=0.67,
fesc=0.2,
fesc_ly_alpha=0.7,
dust_emission_model=Blackbody(temperature=100 * kelvin),
)
print(total)
total.plot_emission_tree()
|================================================ EmissionModel: total ===============================================|
|---------------------------------------------------------------------------------------------------------------------|
| NEBULAR_LINE_LYMAN_ALPHA (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.44000000000000006 |
| Save emission: False |
|---------------------------------------------------------------------------------------------------------------------|
| NEBULAR_LINE_NO_LYMAN (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: linecont |
| Escape fraction: 0.2 |
| Save emission: False |
|---------------------------------------------------------------------------------------------------------------------|
| NEBULAR_CONTINUUM (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular_continuum |
| Escape fraction: 0.2 |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| TRANSMITTED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.2 |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| ESCAPED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.8 |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| NEBULAR_LINE (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line_no_lyman, nebular_line_lyman_alpha |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| NEBULAR (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular_line, nebular_continuum |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| REPROCESSED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: nebular, transmitted |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| ATTENUATED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e8879c00> |
| Apply dust to: reprocessed |
| Optical depth (tau_v): [0.67] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| DUST_EMISSION (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Generation model: |
| Emission generation model: <synthesizer.emission_models.dust.emission.Blackbody object at 0x7fe0e8879cc0> |
| Dust luminosity: reprocessed - attenuated |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| EMERGENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: attenuated, escaped |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| TOTAL (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: emergent, dust_emission |
| Save emission: True |
|=====================================================================================================================|
[11]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
Note that omitting dust_emission_model
when initialising TotalEmission
will result in a simpler model, where total
is identical to emergent
.
CharlotFall2000¶
In addition to the simpler models shown above we also provide three more complex emission models. The first of these follows Charlot&Fall+2000, which splits the stellar population into young and old populations (with the threshold defined by age_pivot
), with specific dust attenuation parameters for each population.
[12]:
from synthesizer.emission_models import CharlotFall2000
cf_model = CharlotFall2000(
grid=grid,
tau_v_ism=1.0,
tau_v_birth=0.7,
dust_curve_ism=PowerLaw(slope=-0.7),
dust_curve_birth=PowerLaw(slope=-1.3),
age_pivot=7 * dimensionless,
dust_emission_ism=Blackbody(temperature=50 * kelvin),
dust_emission_birth=Blackbody(temperature=100 * kelvin),
)
print(cf_model)
cf_model.plot_emission_tree(fontsize=6)
|================================================ EmissionModel: total ===============================================|
|---------------------------------------------------------------------------------------------------------------------|
| OLD_TRANSMITTED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.0 |
| Save emission: True |
| Masks: |
| - log10ages >= 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_NEBULAR (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular |
| Escape fraction: 0.0 |
| Save emission: True |
| Masks: |
| - log10ages >= 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_TRANSMITTED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: transmitted |
| Escape fraction: 0.0 |
| Save emission: True |
| Masks: |
| - log10ages < 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_NEBULAR (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: nebular |
| Escape fraction: 0.0 |
| Save emission: True |
| Masks: |
| - log10ages < 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_INCIDENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: incident |
| Escape fraction: 0.0 |
| Save emission: True |
| Masks: |
| - log10ages < 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_INCIDENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Extraction model: |
| Grid: test_grid |
| Extract key: incident |
| Escape fraction: 0.0 |
| Save emission: True |
| Masks: |
| - log10ages >= 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_INTRINSIC (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: old_nebular, old_transmitted |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_EMERGENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e8756110> |
| Apply dust to: old_intrinsic |
| Optical depth (tau_v): [1.0] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_REPROCESSED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: old_transmitted, old_nebular |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_ATTENUATED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e8756110> |
| Apply dust to: old_reprocessed |
| Optical depth (tau_v): [1.0] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_DUST_EMISSION (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Generation model: |
| Emission generation model: <synthesizer.emission_models.dust.emission.Blackbody object at 0x7fe0e8757df0> |
| Dust luminosity: old_intrinsic - old_attenuated |
| Save emission: True |
| Masks: |
| - log10ages >= 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| OLD_TOTAL (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: old_dust_emission, old_emergent |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_INTRINSIC (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_nebular, young_transmitted |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_REPROCESSED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_transmitted, young_nebular |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_ATTENUATED_NEBULAR (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e87561d0> |
| Apply dust to: young_reprocessed |
| Optical depth (tau_v): [0.7] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_DUST_EMISSION_BIRTH (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Generation model: |
| Emission generation model: <synthesizer.emission_models.dust.emission.Blackbody object at 0x7fe0e871bca0> |
| Dust luminosity: young_intrinsic - young_attenuated_nebular |
| Save emission: True |
| Masks: |
| - log10ages < 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_ATTENUATED_ISM (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e8756110> |
| Apply dust to: young_reprocessed |
| Optical depth (tau_v): [1.0] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_DUST_EMISSION_ISM (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Generation model: |
| Emission generation model: <synthesizer.emission_models.dust.emission.Blackbody object at 0x7fe0e8757df0> |
| Dust luminosity: young_intrinsic - young_attenuated_ism |
| Save emission: True |
| Masks: |
| - log10ages < 7 dimensionless |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_DUST_EMISSION (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_dust_emission_birth, young_dust_emission_ism |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_EMERGENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e8756110> |
| Apply dust to: young_attenuated_nebular |
| Optical depth (tau_v): [1.0] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_TOTAL (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_dust_emission, young_emergent |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| TOTAL (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_total, old_total |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| INTRINSIC (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_intrinsic, old_intrinsic |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| REPROCESSED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_reprocessed, old_reprocessed |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| YOUNG_ATTENUATED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Dust attenuation model: |
| Dust curve: <synthesizer.emission_models.attenuation.dust.PowerLaw object at 0x7fe0e8756110> |
| Apply dust to: young_attenuated_nebular |
| Optical depth (tau_v): [1.0] |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| ATTENUATED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_attenuated, old_attenuated |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| DUST_EMISSION (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_dust_emission, old_dust_emission |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| EMERGENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_emergent, old_emergent |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| INCIDENT (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_incident, old_incident |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| NEBULAR (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_nebular, old_nebular |
| Save emission: True |
|---------------------------------------------------------------------------------------------------------------------|
| TRANSMITTED (stellar) |
|---------------------------------------------------------------------------------------------------------------------|
|Combination model: |
| Combine models: young_transmitted, old_transmitted |
| Save emission: True |
|=====================================================================================================================|
[12]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
If we omit the dust emission model then we get a simpler model with a root at "emergent"
.
[13]:
cf_model = CharlotFall2000(
grid=grid,
tau_v_ism=1.0,
tau_v_birth=0.7,
dust_curve_ism=PowerLaw(slope=-0.7),
dust_curve_birth=PowerLaw(slope=-1.3),
age_pivot=7 * dimensionless,
)
cf_model.plot_emission_tree()
[13]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
It’s also possible to plot a subtree within a model by passing the root of the subtree. This is particularly helpful for models like CharlotFall2000
which define a lot of extra spectra that don’t necessarily appear in the main tree depending on the exact inputs. You can see this in the plots below which show the trees defining the “extra” spectra available when using CharlotFall2000
(and indeed PacmanEmission
and BimodelPacmanEmission
which we’ll cover shortly).
[14]:
cf_model.plot_emission_tree(root="incident")
[14]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
[15]:
cf_model.plot_emission_tree(root="transmitted")
[15]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
[16]:
cf_model.plot_emission_tree(root="intrinsic")
[16]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
[17]:
cf_model.plot_emission_tree(root="attenuated")
[17]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
PacmanEmission¶
We also implement a general model which accounts for escape fractions. We call this the “Pacman” model.
Pacman calculates dust attenuated spectra, including an escape fraction and variable Lyman-\(\alpha\) transmission. In this model, some fraction (fesc
) of the pure stellar emission is able to completely escape the galaxy without reprocessing by gas or dust. The rest is assumed to be reprocessed by both gas and a screen of dust.
The Pacman model has two forms: the first is the PacmanEmission
model, which does not differentiate between young and old populations.
[18]:
from synthesizer.emission_models import PacmanEmission
# Simple Pacman with dust emission
simple_pc_model = PacmanEmission(
grid=grid,
tau_v=0.7,
dust_curve=PowerLaw(slope=-1.3),
dust_emission=Blackbody(temperature=100 * kelvin),
fesc=0.2,
fesc_ly_alpha=0.9,
)
simple_pc_model.plot_emission_tree()
[18]:
(<Figure size 600x600 with 1 Axes>, <Axes: >)
Again, omitting the dust_emission_model
will result in a model with "emergent"
at it’s root.
BiomodalPacmanEmission¶
The second flavour of the Pacman model is the BimodalPacmanEmission
model, which is the same as PacmanEmission
in every other respect, but does differentiate between old and young populations, analogous to Charlot&Fall+2000. The young component feels attenuation from both the ISM and birth clouds, while the old component only feels attenuation from the ISM.
[19]:
from synthesizer.emission_models import BimodalPacmanEmission
pc_model = BimodalPacmanEmission(
grid=grid,
tau_v_ism=1.0,
tau_v_birth=0.7,
dust_curve_ism=PowerLaw(slope=-1.3),
dust_curve_birth=PowerLaw(slope=-0.7),
dust_emission_ism=Blackbody(temperature=100 * kelvin),
dust_emission_birth=Blackbody(temperature=30 * kelvin),
fesc=0.2,
fesc_ly_alpha=0.9,
)
pc_model.plot_emission_tree(fontsize=5, figsize=(8, 6))
[19]:
(<Figure size 800x600 with 1 Axes>, <Axes: >)
And as with the other models the dust emission can be omitted, leaving "emergent"
at the root.
A note: Complex model spectra location¶
When working with a Stars
object alone the behaviour detailed above is exactly what you will want. However, in reality the dust emission is not a “stellar emission” but instead something more general to the galaxy. CharlotFall2000
, PacmanEmission
, and BimodalPacmanEmission
all allow you to pass a stellar_dust
argument which is True
by default. When stellar_dust=False
is passed, the "dust_emission"
and "total"
spectra will instead be attached to a galaxy
emitter, and will only be generated when used with Galaxy.get_spectra
.
This is more “correct”, but only works when working with a Galaxy
, and also only works for integrated spectra. If you are only working with a Stars
object stellar_dust
can be ignored, yielding "dust_emission"
and "total"
spectra on the stellar component. If you are working with per particle spectra then these must be associated to a component, and stellar_dust
can be ignored to attach the per particle spectra to a component. If galaxy level integrated spectra are required
these can be generated down stream, either by integrating and attaching, or integrating and using a combination emission model.
[20]:
pc_model = BimodalPacmanEmission(
grid=grid,
tau_v_ism=1.0,
tau_v_birth=0.7,
dust_curve_ism=PowerLaw(slope=-1.3),
dust_curve_birth=PowerLaw(slope=-0.7),
dust_emission_ism=Blackbody(temperature=100 * kelvin),
dust_emission_birth=Blackbody(temperature=30 * kelvin),
fesc=0.2,
fesc_ly_alpha=0.9,
stellar_dust=False,
)
pc_model.plot_emission_tree(fontsize=5, figsize=(8, 6))
[20]:
(<Figure size 800x600 with 1 Axes>, <Axes: >)
For more information see the combined models docs where we explictly show the construction of a multicomponent model with dust emission.