Overview
This lightweight tool estimates the optimal exposure time for observations with the Ortega telescope. Taking into account sky brightness, seeing conditions, the desired signal-to-noise ratio and target magnitude, it provides a recommended integration time to achieve high-quality imaging without saturating the detector. Originally a Colab Python script for quick field calculations during observing runs, now also runs live in the browser below.
Calculate
Recommended exposure
—
- Sky background
- — counts/pix/s
- Star count rate
- — counts/s
- Observed magnitude
- — (airmass 1)
- Sky brightness
- — mag/arcsec²
- Seeing disk
- — pix
Key highlights
A quick snapshot of the most important features and design goals.
- Implements standard photometric exposure formulas with customizable parameters.
- Accounts for seeing, sky background and telescope/instrument throughput.
- Outputs both recommended single-frame exposure and total integration time.
- Simple Python script with clear documentation for future expansion or GUI integration.
Source
View original Python source (ortega-exposure.py)
# -*- coding: utf-8 -*-
# NOTE: ortega-exposure.html inlines this source in its <details> source viewer
# so search engines and noscript visitors see it. Keep the two in sync.
"""Exposure Time Calculator
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/15I6EacWttQ_XdIF9ssj-YXpEuKztZjb8
"""
# Commented out IPython magic to ensure Python compatibility.
# %matplotlib notebook
import numpy as np
from astropy.table import Table, Column
import matplotlib.pyplot as plt
Plate_scale = 0.00015625 # plate scale in rad / mm
Pixel_diamter = .0267 # mm/pixel
Plate_scale_relpix = Plate_scale * Pixel_diamter # plate scale in radians / pixel
readnoise = 2.9 # readnoise in units of e- / pix second
filter_names = np.array(['U','B','V','R','I']) #Johnson-Cousin filter names
filter_wav = np.array([3656, 4353, 5477, 6349, 8797]) # central wavenlength of the corresponding filter in Angstroms
seeing = 1.25 #@param {type:"number"}
seeing_disk = seeing
seeing_pix= ((((seeing_disk / 60) / 60) / 57.3) / (Plate_scale * Pixel_diamter))
lunar_age_data = {
'0': np.array([22.0, 22.7, 21.8, 20.9, 19.9]),
'3': np.array([21.5, 22.4, 21.7, 20.8, 19.9]),
'7': np.array([19.9, 21.6, 21.4, 20.6, 19.7]),
'10': np.array([18.5, 20.7, 20.7, 20.3, 19.5]),
'14': np.array([17.0, 19.5, 20.0, 19.9, 19.2])
}
Lunar_Age = '7' #@param ["0", "3", "7", "10", "14"]
Chosen_age = lunar_age_data[Lunar_Age]
#array of counts for an object with mag = 15 in each U, B, V, R, I filters
N15_count = np.array([400, 2600, 2400, 2300, 1600])
# (10**(M1-M2)/(-2.5))*Fm15 = F1
N15_back = 10**((Chosen_age-15)/(-2.5))*N15_count
#@title Select the filter
filter_choice = 'I' #@param ["U", "B", "V", "R", "I"]
#Determine the array index for the selected filter
arr_index = np.where(filter_names == filter_choice)
sky_count = N15_back[arr_index] # Sky counts for the respective filter
ref_count = N15_count[arr_index] # Counts for a 15 magnitude star in the respective filter
#@title Enter value for the signal-to-noise ratio
snr = 125 #@param {type:"integer"}
#@title Enter value for the magnitude, mag
mag = 19.7 #@param {type:"number"}
# Create an array for the extinction coefficient
k_lam = np.array([.6, .4, .2, .1, .08])
# Correct the magnitude for airmass = 1
mag_obs = mag + k_lam[arr_index]
# Convert the magnitude into counts using the respective reference filter magnitude
star_count = ref_count * 10**((mag_obs - 15.0) / (-2.5))
#Quadratic equation terms defined above.
a = star_count**2
b = (-1.0)*(snr**2)*(star_count + (seeing_pix*sky_count))
c = (-1.0)*(snr**2)*seeing_pix*readnoise
#Exposure time using the solution to th quadratic equation
exp_time = ((-1.0)*b + np.sqrt((b**2) - (4.0*a*c)))/(2*a)
print("The exposure time is",np.round(exp_time)[0], "seconds") #rounds the exposure to the nearest second
print(N15_back)
print(Chosen_age)