Commit 88b0874b authored by Médéric Boquien's avatar Médéric Boquien
Browse files

Add the light-weight nebular module that absorbs the nebular continuum but does not emit anything.

parent 3ce03f73
# -*- coding: utf-8 -*-
# Copyright (C) 2014 University of Cambridge
# Licensed under the CeCILL-v2 licence - see Licence_CeCILL_V2-en.txt
# Author: Médéric Boquien <mboquien@ast.cam.ac.uk>
from collections import OrderedDict
import numpy as np
import scipy.constants as cst
from pcigale.data import Database
from . import CreationModule
class NebularEmission(CreationModule):
"""
Module computing the nebular emission from the ultraviolet to the
near-infrared. It includes both the nebular lines and the nubular
continuum. It takes into account the escape fraction and the absorption by
dust.
Given the number of Lyman continuum photons, we compute the Hβ line
luminosity. We then compute the other lines using the
metallicity-dependent templates that provide the ratio between individual
lines and Hβ. The nebular continuum is scaled directly from the number of
ionizing photons.
"""
parameter_list = OrderedDict([
('f_esc', (
'float',
"Fraction of Lyman continuum photons escaping the galaxy",
0.
)),
('f_dust', (
'float',
"Fraction of Lyman continuum photons absorbed by dust",
0.
))
])
def _init_code(self):
"""Get the nebular emission lines out of the database and resample
them to see the line profile. Compute scaling coefficients.
"""
fesc = self.parameters['f_esc']
fdust = self.parameters['f_dust']
if fesc < 0. or fesc > 1:
raise Exception("Escape fraction must be between 0 and 1")
if fdust < 0 or fdust > 1:
raise Exception("Fraction of lyman photons absorbed by dust must "
"be between 0 and 1")
if fesc + fdust > 1:
raise Exception("Escape fraction+f_dust>1")
self.idx_Ly_break = None
self.absorbed_old = None
self.absorbed_young = None
def process(self, sed):
"""Add the nebular emission lines
Parameters
----------
sed: pcigale.sed.SED object
parameters: dictionary containing the parameters
"""
if self.idx_Ly_break is None:
self.idx_Ly_break = np.searchsorted(sed.wavelength_grid, 91.)
self.absorbed_old = np.zeros(sed.wavelength_grid.size)
self.absorbed_young = np.zeros(sed.wavelength_grid.size)
self.absorbed_old[:self.idx_Ly_break] -= sed.get_lumin_contribution('stellar.old')[:self.idx_Ly_break] * (1. - self.parameters['f_esc'])
self.absorbed_young[:self.idx_Ly_break] -= sed.get_lumin_contribution('stellar.young')[:self.idx_Ly_break] * (1. - self.parameters['f_esc'])
sed.add_module(self.name, self.parameters)
sed.add_info('nebular.f_esc', self.parameters['f_esc'])
sed.add_info('nebular.f_dust', self.parameters['f_dust'])
sed.add_info('dust.luminosity', (sed.info['stellar.lum_ly_young'] +
sed.info['stellar.lum_ly_old']) *
self.parameters['f_dust'], True)
sed.add_contribution('nebular.absorption_old', sed.wavelength_grid,
self.absorbed_old)
sed.add_contribution('nebular.absorption_young', sed.wavelength_grid,
self.absorbed_young)
# CreationModule to be returned by get_module
Module = NebularEmission
...@@ -132,7 +132,7 @@ class Configuration(object): ...@@ -132,7 +132,7 @@ class Configuration(object):
["Order of the modules use for SED creation. Available modules:"] + ["Order of the modules use for SED creation. Available modules:"] +
["SFH: sfh2exp, sfhdelayed, sfhfromfile, sfhperiodic"] + ["SFH: sfh2exp, sfhdelayed, sfhfromfile, sfhperiodic"] +
["SSP: bc03, m2005"] + ["SSP: bc03, m2005"] +
["Nebular emission: nebular"] + ["Nebular emission: nebular, nebular_noemission"] +
["Dust attenuation: dustatt_calzleit, dustatt_powerlaw"] + ["Dust attenuation: dustatt_calzleit, dustatt_powerlaw"] +
["Dust emission: casey2012, dale2014, dl2007, dl2014"] + ["Dust emission: casey2012, dale2014, dl2007, dl2014"] +
["AGN: dale2014, fritz2006"] + ["AGN: dale2014, fritz2006"] +
...@@ -219,7 +219,8 @@ class Configuration(object): ...@@ -219,7 +219,8 @@ class Configuration(object):
self.config['sed_creation_modules'].comments[module_name] = [ self.config['sed_creation_modules'].comments[module_name] = [
creation_modules.get_module(module_name, blank=True).comments] creation_modules.get_module(module_name, blank=True).comments]
if 'nebular' not in self.config['creation_modules']: if ('nebular' not in self.config['creation_modules'] and
'nebular_noemission' not in self.config['creation_modules']):
print("WARNING: no nebular module selected. The Lyman continuum " print("WARNING: no nebular module selected. The Lyman continuum "
"is left untouched.") "is left untouched.")
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment