Note
Go to the end to download the full example code.
CCD Heuristics#
Examples to develop a better intuition for CCD counts from known sources
import numpy as np
import mirage as mr
z_obs = 0.0 # Point the telescope towards zenith
station = mr.Station(preset='pogs')
projected_irrad_per_pixel_area = mr.dms_to_rad(
0, 0, station.telescope.ccd.pixel_scale
) ** 2 * mr.mpsas_to_irradiance_per_steradian(22)
sint_val = mr.sint(station, z_obs)[0]
count_per_second_per_pixel = sint_val * projected_irrad_per_pixel_area
print(
f'For a telescope pointed towards zenith of 22 MPSAS sky, each pixel counts on average {count_per_second_per_pixel:.2f} per second'
)
For a telescope pointed towards zenith of 22 MPSAS sky, each pixel counts on average 1.61 per second
We can also look at counts due to point sources. Note that these sources are actually spread across a few pixels, so the values are actually much lower on the CCD
total_star_counts = sint_val * mr.apparent_magnitude_to_irradiance(16)
print(
f'A magnitude 16 star produces on average {total_star_counts:.2e} counts per second'
)
total_star_counts = sint_val * mr.apparent_magnitude_to_irradiance(8)
print(
f'A magnitude 8 star produces on average {total_star_counts:.2e} counts per second'
)
r_sph_meter = 3
irrad_sphere = (
mr.AstroConstants.sun_irradiance_vacuum
* mr.normalized_light_curve_sphere(
cd_sphere=0.5, r_sphere_m=r_sph_meter, phase_angle_rad=np.pi / 2
)
/ (40e6) ** 2
)
print(
f'A {r_sph_meter}-meter diffuse sphere in GEO produces on average {irrad_sphere*sint_val:.2e} counts per second'
)
A magnitude 16 star produces on average 7.67e+02 counts per second
A magnitude 8 star produces on average 1.22e+06 counts per second
A 3-meter diffuse sphere in GEO produces on average 6.22e+04 counts per second
The size in square pixels of a large GEO satellite when observed from the surface of the Earth by POGS
station.telescope.ccd.pixel_scale = 1
station.telescope.aperture_diameter = 0.5
sat_radius_m = 20
sat_dist_m = (36e3) * 1e3
pscale = station.telescope.ccd.pixel_scale # arcseconds / pixel
p_area_sterad = mr.dms_to_rad(0, 0, pscale) ** 2 # sterad / pixel ** 2
angular_radius_of_sat_geo = np.arctan(sat_radius_m / sat_dist_m)
angular_radius_of_sat_geo_pix = angular_radius_of_sat_geo / mr.dms_to_rad(
0, 0, station.telescope.ccd.pixel_scale
)
print(f'A GEO satellite is {2*angular_radius_of_sat_geo_pix:.1f} pixels wide from POGS')
sat_radius_m = 0.3
sat_dist_m = (1000) * 1e3
pscale = station.telescope.ccd.pixel_scale # arcseconds / pixel
p_area_sterad = mr.dms_to_rad(0, 0, pscale) ** 2 # sterad / pixel ** 2
angular_radius_of_sat_leo = np.arctan(sat_radius_m / sat_dist_m)
angular_radius_of_sat_leo_pix = angular_radius_of_sat_leo / mr.dms_to_rad(
0, 0, station.telescope.ccd.pixel_scale
)
print(f'A LEO satellite is {2*angular_radius_of_sat_leo_pix:.1f} pixels wide from POGS')
A GEO satellite is 0.2 pixels wide from POGS
A LEO satellite is 0.1 pixels wide from POGS
Airy disk size for GEO objects
rayleigh_crit_rad = 1.22 * 550e-9 / station.telescope.aperture_diameter
rayleigh_crit_pix = rayleigh_crit_rad / mr.dms_to_rad(
0, 0, station.telescope.ccd.pixel_scale
)
print(
f'For GEO the Airy disk is {rayleigh_crit_pix/angular_radius_of_sat_geo_pix:.1f}x wider than the object itself'
)
print(
f'For LEO the Airy disk is {rayleigh_crit_pix/angular_radius_of_sat_leo_pix:.1f}x wider than the object itself'
)
For GEO the Airy disk is 2.4x wider than the object itself
For LEO the Airy disk is 4.5x wider than the object itself
Total running time of the script: (0 minutes 0.007 seconds)