diff options
author | Aaron LI <aaronly.me@outlook.com> | 2016-10-11 22:26:01 +0800 |
---|---|---|
committer | Aaron LI <aaronly.me@outlook.com> | 2016-10-11 22:26:01 +0800 |
commit | 0ce54992d3f4f3c64083337f71418cfec5326409 (patch) | |
tree | 6a07f3e1fd8f9e6aeab88f86d05d06fd986005fb | |
parent | 34191e3525f258b850dc41616eb08da9a5520a23 (diff) | |
download | fg21sim-0ce54992d3f4f3c64083337f71418cfec5326409.tar.bz2 |
galactic/freefree: Mask regions where absorption is uncertain
* Mask the regions where the dust absorption is too high to well
determine the true Halpha absorption.
There are regions (e.g., Galactic plane) have too large dust
absorption which cause float overflow when applying absorption
correction to the Halpha map.
* Fix a bug on the wrong parameter passed to "_calc_ratio_a()" method
in "_simulate_frequency()"
* Move "_correct_dust_absorption()" invokation from "simulate()"
to "_simulate_frequency()"
Already tested and OK!
-rw-r--r-- | fg21sim/galactic/freefree.py | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/fg21sim/galactic/freefree.py b/fg21sim/galactic/freefree.py index 28a92d6..0dd131d 100644 --- a/fg21sim/galactic/freefree.py +++ b/fg21sim/galactic/freefree.py @@ -129,16 +129,37 @@ class FreeFree: """Correct the H{\alpha} map for dust absorption using the 100-{\mu}m dust map. - References: [Dickinson2003], Eq.(3) + References: [Dickinson2003]: Eq.(1, 3); Sec.(2.5) """ if hasattr(self, "dust_corrected") and self.dust_corrected: return # + logger.info("Correct H[alpha] map for dust absorption") # Effective dust fraction in the LoS actually absorbing Halpha f_dust = 0.33 + logger.info("Effective dust fraction: {0}".format(f_dust)) + # NOTE: + # Mask the regions where the true Halpha absorption is uncertain. + # When the dust absorption goes rather large, the true Halpha + # absorption can not well determined. + # Therefore, the regions where the calculated Halpha absorption + # greater than 1.0 mag are masked out. + halpha_abs_th = 1.0 # Halpha absorption threshold, unit: [ mag ] + # Corresponding dust absorption threshold, unit: [ MJy / sr ] + dust_abs_th = halpha_abs_th / 0.0462 / f_dust + logger.info("Dust absorption mask threshold: " + + "{0:.1f} MJy/sr ".format(dust_abs_th) + + "<-> H[alpha] absorption threshold: " + + "{0:.1f} mag".format(halpha_abs_th)) + mask = (self.dustmap > dust_abs_th) + self.dustmap[mask] = np.nan + fp_mask = 100 * mask.sum() / self.dustmap.size + logger.warning("Dust map masked fraction: {0:.1f}%".format(fp_mask)) + # halphamap_corr = self.halphamap * 10**(self.dustmap * 0.0185 * f_dust) self.halphamap = halphamap_corr self.dust_corrected = True + logger.info("Done dust absorption correction") def _calc_ratio_a(self, Te, nu_GHz): """Calculate the ratio factor a(T, nu), which will be used to @@ -159,11 +180,13 @@ class FreeFree: NOTE: [Dickinson2003], Eq.(11) may wrongly have the "10^3" term. """ + # Correct for dust absorption first + self._correct_dust_absorption() # Assumed electron temperature [ K ] Te = 7000.0 T4 = Te / 1e4 nu = frequency * self.freq_unit.to(au.GHz) # frequency [ GHz ] - ratio_a = self._calc_ratio_a(T4, nu) + ratio_a = self._calc_ratio_a(Te, nu) # NOTE: ignored the "10^3" term in the referred equation ratio_mK_R = (8.396 * ratio_a * nu**(-2.1) * T4**0.667 * 10**(0.029/T4) * (1+0.08)) @@ -218,8 +241,6 @@ class FreeFree: def simulate(self, frequencies): """Simulate the free-free map at the specified frequencies.""" - self._correct_dust_absorption() - # hpmaps = [] for f in np.array(frequencies, ndmin=1): logger.info("Simulating free-free map at {0} ({1}) ...".format( |