-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement utility functions purely related to survey and filter numbe…
…rs (#24) * Tentative implementation of functions * Simplify the computation for the conversion * Add docstring explainations * Cast value to integer * Add tests
- Loading branch information
Showing
3 changed files
with
114 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
import astropy.units as u | ||
|
||
from galcheat.helpers import get_filter, get_survey | ||
|
||
|
||
def mag2counts(magnitude, survey_name, filter_name): | ||
"""Convert source magnitude to counts for a given filter of a survey | ||
To perform the computation, we use the filter zeropoint computed | ||
with `speclite` under classical atmospheric conditions and at a | ||
given airmass and we integrate over the survey lifetime using the | ||
full filter exposure time. | ||
Expect a rough estimate from this calculation since e.g. it does not | ||
take into account the atmospheric extinction. Therefore the result | ||
is casted to an integer. | ||
Parameters | ||
---------- | ||
magnitude: float | ||
magnitude of source | ||
survey_name: str | ||
Name of a given survey | ||
filter_name: str | ||
Name of the survey filter | ||
Returns | ||
------- | ||
The corresponding flux in counts | ||
References | ||
---------- | ||
The `WeakLensingDeblending` package | ||
https://github.com/LSSTDESC/WeakLensingDeblending | ||
""" | ||
if not isinstance(magnitude, u.Quantity): | ||
magnitude *= u.mag(u.ct / u.s) | ||
else: | ||
magnitude = magnitude.value * u.mag(u.ct / u.s) | ||
|
||
filter = get_filter(filter_name, survey_name) | ||
|
||
flux = (magnitude - filter.zeropoint).to(u.ct / u.s) | ||
counts = flux * filter.exposure_time | ||
|
||
return counts.astype(int) | ||
|
||
|
||
def mean_sky_level(survey_name, filter_name): | ||
"""Computes the mean sky level for a given survey and a filter | ||
This computation uses the sky brightness parameter from galcheat, | ||
expressed as a magnitude per square arcminute, weights it by the | ||
pixel area and converts it to counts. | ||
Parameters | ||
---------- | ||
survey_name: str | ||
Name of a given survey | ||
filter_name: str | ||
Name of the survey filter | ||
Returns | ||
------- | ||
The corresponding mean sky level in counts | ||
""" | ||
survey = get_survey(survey_name) | ||
filter = get_filter(filter_name, survey_name) | ||
|
||
sky_brightness_counts = mag2counts(filter.sky_brightness, survey_name, filter_name) | ||
pixel_area = survey.pixel_scale.to_value(u.arcsec) ** 2 | ||
|
||
mean_sky_level = sky_brightness_counts * pixel_area | ||
|
||
return mean_sky_level |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
from galcheat.utilities import mag2counts, mean_sky_level | ||
|
||
BTK_COUNTS_MAG24 = { | ||
"Rubin_u": 15321.782101179268, | ||
"Rubin_g": 121397.91888074754, | ||
"Rubin_r": 240956.73939657194, | ||
"Rubin_i": 179448.18815675998, | ||
"Rubin_z": 108953.51289042353, | ||
"Rubin_y": 50727.240442255556, | ||
} | ||
|
||
BTK_MEAN_SKY_LEVEL = { | ||
"Rubin_u": 1687.9876819744386, | ||
"Rubin_g": 23241.878848667337, | ||
"Rubin_r": 127057.1381640446, | ||
"Rubin_i": 180301.3875959776, | ||
"Rubin_z": 250784.8105213134, | ||
"Rubin_y": 293292.6831817095, | ||
} | ||
|
||
|
||
def test_mag2counts(): | ||
survey = "Rubin" | ||
for filt in "ugrizy": | ||
counts = mag2counts(24, survey, filt).value | ||
assert counts == int(BTK_COUNTS_MAG24[f"{survey}_{filt}"]) | ||
|
||
|
||
def test_mean_sky_level(): | ||
survey = "Rubin" | ||
for filt in "ugrizy": | ||
sky_level = mean_sky_level(survey, filt).value | ||
assert int(sky_level) == int(BTK_MEAN_SKY_LEVEL[f"{survey}_{filt}"]) |