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)