Path: blob/main/latex-templates/templates/astronomy/exoplanet_transit.tex
51 views
unlisted
\documentclass[a4paper, 11pt]{article}1\usepackage[utf8]{inputenc}2\usepackage[T1]{fontenc}3\usepackage{amsmath, amssymb}4\usepackage{graphicx}5\usepackage{siunitx}6\usepackage{booktabs}7\usepackage{subcaption}8\usepackage[makestderr]{pythontex}910% Theorem environments11\newtheorem{definition}{Definition}12\newtheorem{theorem}{Theorem}13\newtheorem{example}{Example}14\newtheorem{remark}{Remark}1516\title{Exoplanet Transit Photometry: Light Curves and Planetary Parameters\\17\large A Comprehensive Analysis of Transit Detection Methods}18\author{Exoplanet Science Division\\Computational Science Templates}19\date{\today}2021\begin{document}22\maketitle2324\begin{abstract}25This comprehensive analysis presents the theory and practice of exoplanet detection via transit photometry. We develop analytic models for transit light curves including the effects of limb darkening, derive expressions for transit depth, duration, and impact parameter, and demonstrate parameter extraction from simulated observations. The analysis covers the Mandel-Agol model for precise transit modeling, explores different limb darkening laws, and examines secondary eclipses and phase curves. We simulate a hot Jupiter transit and extract planetary parameters including radius, orbital period, and inclination.26\end{abstract}2728\section{Introduction}2930Transit photometry has revolutionized exoplanet science, enabling the detection of thousands of planets and detailed characterization of their properties. When a planet crosses in front of its host star as viewed from Earth, it blocks a fraction of the stellar light, creating a characteristic dip in the observed brightness.3132\begin{definition}[Transit Event]33A transit occurs when a planet passes between its host star and the observer, causing a temporary decrease in observed stellar flux. The transit probability for a randomly oriented orbit is:34\begin{equation}35p_{transit} = \frac{R_\star + R_p}{a} \approx \frac{R_\star}{a}36\end{equation}37where $R_\star$ is the stellar radius, $R_p$ is the planetary radius, and $a$ is the semi-major axis.38\end{definition}3940\section{Theoretical Framework}4142\subsection{Transit Geometry}4344The fundamental observable is the transit depth:4546\begin{theorem}[Transit Depth]47For a uniform stellar disk, the fractional flux decrease during transit is:48\begin{equation}49\delta = \left(\frac{R_p}{R_\star}\right)^250\end{equation}51This simple relation allows direct measurement of the planet-to-star radius ratio.52\end{theorem}5354\subsection{Impact Parameter and Inclination}5556The impact parameter $b$ quantifies the transit chord across the stellar disk:57\begin{equation}58b = \frac{a \cos i}{R_\star}59\end{equation}60where $i$ is the orbital inclination. A central transit has $b = 0$.6162\subsection{Transit Duration}6364\begin{theorem}[Transit Duration]65The total transit duration (first to fourth contact) is:66\begin{equation}67T_{14} = \frac{P}{\pi} \arcsin\left[\frac{R_\star}{a}\sqrt{(1+k)^2 - b^2}\right]68\end{equation}69where $k = R_p/R_\star$ and $P$ is the orbital period.7071The full transit duration (second to third contact) is:72\begin{equation}73T_{23} = \frac{P}{\pi} \arcsin\left[\frac{R_\star}{a}\sqrt{(1-k)^2 - b^2}\right]74\end{equation}75\end{theorem}7677\subsection{Limb Darkening}7879Stars are not uniformly bright across their disks. The intensity decreases toward the limb due to viewing different atmospheric depths:8081\begin{definition}[Limb Darkening Laws]82Common parameterizations include:83\begin{align}84\text{Linear:} \quad I(\mu) &= 1 - u(1-\mu) \\85\text{Quadratic:} \quad I(\mu) &= 1 - u_1(1-\mu) - u_2(1-\mu)^2 \\86\text{Nonlinear:} \quad I(\mu) &= 1 - \sum_{n=1}^4 c_n(1-\mu^{n/2})87\end{align}88where $\mu = \cos\theta$ is the cosine of the angle from disk center.89\end{definition}9091\section{Transit Light Curve Models}9293\subsection{Mandel-Agol Model}9495The analytic model of Mandel \& Agol (2002) provides exact expressions for the flux blocked by a planet in front of a limb-darkened star. The flux depends on the projected separation $z = d/R_\star$ between planet and star centers.9697\begin{remark}[Transit Phases]98\begin{itemize}99\item $z > 1 + k$: No transit (full flux)100\item $1 - k < z < 1 + k$: Ingress/egress (partial overlap)101\item $z < 1 - k$: Full transit (complete overlap)102\item $z < k - 1$: Planet larger than star (not physical for most cases)103\end{itemize}104\end{remark}105106\section{Computational Analysis}107108\begin{pycode}109import numpy as np110from scipy.special import ellipk, ellipe111import matplotlib.pyplot as plt112plt.rc('text', usetex=True)113plt.rc('font', family='serif')114115np.random.seed(42)116117# Physical constants118R_sun = 6.957e8 # meters119R_jup = 7.1492e7 # meters120AU = 1.496e11 # meters121122# System parameters (Hot Jupiter)123R_star = 1.1 # Solar radii124R_planet = 1.2 # Jupiter radii125a = 0.045 # Semi-major axis (AU)126P = 3.5 # Orbital period (days)127i = 87.0 # Inclination (degrees)128ecc = 0.0 # Eccentricity (circular orbit)129130# Convert to consistent units131R_star_m = R_star * R_sun132R_planet_m = R_planet * R_jup133a_m = a * AU134135# Derived parameters136k = R_planet_m / R_star_m # Radius ratio137b = (a_m / R_star_m) * np.cos(np.deg2rad(i)) # Impact parameter138delta = k**2 # Transit depth139140# Orbital velocity (circular)141v_orb = 2 * np.pi * a_m / (P * 86400) # m/s142143# Transit duration (simple formula for circular orbit)144T_dur_s = 2 * R_star_m * np.sqrt((1+k)**2 - b**2) / v_orb145T_dur_hr = T_dur_s / 3600146147# Ingress/egress time148T_ing_s = 2 * R_star_m * k / (v_orb * np.sqrt(1 - b**2))149T_ing_hr = T_ing_s / 3600150151# Limb darkening coefficients (quadratic law for Sun-like star)152u1, u2 = 0.4, 0.26153154def limb_darkening(r, u1, u2):155"""Quadratic limb darkening: I(r)/I(0)"""156mu = np.sqrt(np.maximum(1 - r**2, 0))157return 1 - u1*(1-mu) - u2*(1-mu)**2158159def transit_flux(z, k, u1, u2):160"""161Calculate transit flux using simplified Mandel-Agol formalism162z: projected separation in stellar radii163k: radius ratio R_p/R_star164"""165z = np.atleast_1d(z)166flux = np.ones_like(z)167168for i, zi in enumerate(z):169if zi >= 1 + k:170# No transit171flux[i] = 1.0172elif zi <= 1 - k:173# Full transit - use uniform source approximation with LD correction174# Approximate by averaging over occulted region175r = np.linspace(0, k, 100)176ld = limb_darkening(zi + r * 0.5, u1, u2)177flux[i] = 1 - k**2 * np.mean(ld)178else:179# Partial transit (ingress/egress)180# Simplified calculation181overlap = k**2 * np.arccos((zi**2 + k**2 - 1)/(2*zi*k))182overlap += np.arccos((zi**2 + 1 - k**2)/(2*zi))183overlap -= 0.5 * np.sqrt((1+k-zi)*(zi+k-1)*(zi-k+1)*(zi+k+1))184overlap /= np.pi185ld_avg = limb_darkening(zi, u1, u2)186flux[i] = 1 - overlap * ld_avg187188return flux189190# Generate time array191t_days = np.linspace(-0.15, 0.15, 2000)192t_hours = t_days * 24193194# Calculate projected separation195z = np.abs(t_days) * v_orb / R_star_m * 86400196197# Calculate model flux198flux_model = transit_flux(z, k, u1, u2)199200# Generate multiple noise levels201noise_levels = [100e-6, 500e-6, 1000e-6] # ppm202flux_noisy = {}203for noise in noise_levels:204flux_noisy[noise] = flux_model + np.random.normal(0, noise, len(flux_model))205206# Secondary eclipse depth (thermal emission)207T_star = 5800 # K208T_planet = 1500 # K (hot Jupiter)209eclipse_depth = (R_planet_m/R_star_m)**2 * (T_planet/T_star)**4210eclipse_depth_ppm = eclipse_depth * 1e6211212# Phase curve amplitude (day-night contrast)213phase_amplitude = eclipse_depth * 0.5 # Assume 50% redistribution214215# Create comprehensive figure216fig = plt.figure(figsize=(14, 16))217218# Plot 1: Light curve with different noise levels219ax1 = fig.add_subplot(3, 3, 1)220ax1.plot(t_hours, flux_model, 'k-', linewidth=2, label='Model', zorder=10)221ax1.plot(t_hours, flux_noisy[100e-6], '.', color='blue', markersize=1,222alpha=0.3, label='100 ppm')223ax1.set_xlabel('Time from mid-transit (hours)')224ax1.set_ylabel('Relative Flux')225ax1.set_title('Transit Light Curve')226ax1.legend(fontsize=8)227ax1.grid(True, alpha=0.3)228ax1.set_xlim(-3, 3)229230# Plot 2: Zoomed transit with different noise231ax2 = fig.add_subplot(3, 3, 2)232colors = ['blue', 'green', 'red']233for idx, noise in enumerate(noise_levels):234label = f'{int(noise*1e6)} ppm'235ax2.plot(t_hours, flux_noisy[noise], '.', color=colors[idx],236markersize=1, alpha=0.5, label=label)237ax2.plot(t_hours, flux_model, 'k-', linewidth=2, zorder=10)238ax2.set_xlabel('Time from mid-transit (hours)')239ax2.set_ylabel('Relative Flux')240ax2.set_title('Noise Level Comparison')241ax2.legend(fontsize=7)242ax2.grid(True, alpha=0.3)243ax2.set_xlim(-T_dur_hr, T_dur_hr)244245# Plot 3: Transit depth vs wavelength (simulated)246ax3 = fig.add_subplot(3, 3, 3)247wavelengths = np.linspace(0.4, 2.5, 50) # microns248# Simulate atmospheric absorption (simplified)249base_depth = delta250H_scale = 500e3 # Scale height in meters251n_scales = 5 # Number of scale heights252atm_signal = n_scales * 2 * R_planet_m * H_scale / R_star_m**2253254# Add spectral features255depth_spectrum = np.ones_like(wavelengths) * base_depth256# Water absorption at 1.4 and 1.9 microns257depth_spectrum += atm_signal * 0.3 * np.exp(-((wavelengths-1.4)/0.1)**2)258depth_spectrum += atm_signal * 0.4 * np.exp(-((wavelengths-1.9)/0.15)**2)259# Sodium at 0.59 microns260depth_spectrum += atm_signal * 0.2 * np.exp(-((wavelengths-0.59)/0.02)**2)261262ax3.plot(wavelengths, depth_spectrum * 100, 'b-', linewidth=2)263ax3.axhline(y=delta*100, color='r', linestyle='--', alpha=0.7, label='Flat')264ax3.set_xlabel(r'Wavelength ($\mu$m)')265ax3.set_ylabel('Transit Depth (\\%)')266ax3.set_title('Transmission Spectrum')267ax3.legend(fontsize=8)268ax3.grid(True, alpha=0.3)269270# Plot 4: Impact parameter effect271ax4 = fig.add_subplot(3, 3, 4)272b_values = [0.0, 0.3, 0.6, 0.8]273for bi in b_values:274# Calculate duration for this b275if (1+k)**2 - bi**2 > 0:276T_i = 2 * R_star_m * np.sqrt((1+k)**2 - bi**2) / v_orb / 3600277t_i = np.linspace(-T_i/2*1.5, T_i/2*1.5, 500)278z_i = np.sqrt((t_i*3600*v_orb/R_star_m)**2 + bi**2)279flux_i = transit_flux(z_i, k, u1, u2)280ax4.plot(t_i, flux_i, linewidth=2, label=f'b={bi:.1f}')281282ax4.set_xlabel('Time (hours)')283ax4.set_ylabel('Relative Flux')284ax4.set_title('Impact Parameter Effect')285ax4.legend(fontsize=8)286ax4.grid(True, alpha=0.3)287288# Plot 5: Limb darkening comparison289ax5 = fig.add_subplot(3, 3, 5)290r_disk = np.linspace(0, 1, 100)291292# Different LD laws293ld_uniform = np.ones_like(r_disk)294ld_linear = limb_darkening(r_disk, 0.6, 0)295ld_quad = limb_darkening(r_disk, u1, u2)296297ax5.plot(r_disk, ld_uniform, 'k--', linewidth=2, label='Uniform')298ax5.plot(r_disk, ld_linear, 'b-', linewidth=2, label='Linear')299ax5.plot(r_disk, ld_quad, 'r-', linewidth=2, label='Quadratic')300ax5.set_xlabel('Radial position (r/$R_\\star$)')301ax5.set_ylabel('Intensity I/I$_0$')302ax5.set_title('Limb Darkening Laws')303ax5.legend(fontsize=8)304ax5.grid(True, alpha=0.3)305306# Plot 6: Transit with different LD307ax6 = fig.add_subplot(3, 3, 6)308flux_uniform = transit_flux(z, k, 0, 0)309flux_linear = transit_flux(z, k, 0.6, 0)310311ax6.plot(t_hours, flux_uniform, 'k--', linewidth=2, label='Uniform')312ax6.plot(t_hours, flux_linear, 'b-', linewidth=2, label='Linear')313ax6.plot(t_hours, flux_model, 'r-', linewidth=2, label='Quadratic')314ax6.set_xlabel('Time (hours)')315ax6.set_ylabel('Relative Flux')316ax6.set_title('Limb Darkening Effect on Transit')317ax6.legend(fontsize=8)318ax6.grid(True, alpha=0.3)319ax6.set_xlim(-T_dur_hr, T_dur_hr)320321# Plot 7: Phase curve322ax7 = fig.add_subplot(3, 3, 7)323phase = np.linspace(-0.5, 0.5, 1000)324phase_flux = np.ones_like(phase)325326# Add transit327transit_phase = T_dur_hr / 24 / P328in_transit = np.abs(phase) < transit_phase329phase_flux[in_transit] = 1 - delta330331# Add secondary eclipse332eclipse_phase = np.abs(phase - 0) < transit_phase # At phase 0.5 (but we center on transit)333sec_eclipse = np.abs(phase + 0) < transit_phase # Opposite side334335# Add phase variation (cosine)336phase_flux += phase_amplitude * np.cos(2*np.pi*phase)337338# Secondary eclipse at phase 0.5 (half period from transit)339ax7.plot(phase, phase_flux, 'b-', linewidth=2)340ax7.axvline(x=0, color='r', linestyle=':', alpha=0.7, label='Transit')341ax7.axvline(x=0.5, color='g', linestyle=':', alpha=0.7, label='Eclipse')342ax7.set_xlabel('Orbital Phase')343ax7.set_ylabel('Relative Flux')344ax7.set_title('Phase Curve')345ax7.legend(fontsize=8)346ax7.grid(True, alpha=0.3)347348# Plot 8: Transit timing variations349ax8 = fig.add_subplot(3, 3, 8)350n_transits = 20351ttv_amplitude = 5 # minutes352t_expected = np.arange(n_transits) * P353ttv = ttv_amplitude * np.sin(2*np.pi*np.arange(n_transits)/8) # TTV signal354ttv += np.random.normal(0, 1, n_transits) # Noise355356ax8.errorbar(np.arange(n_transits), ttv, yerr=1, fmt='bo', capsize=3)357ax8.axhline(y=0, color='r', linestyle='--', alpha=0.7)358ax8.set_xlabel('Transit Number')359ax8.set_ylabel('O-C (minutes)')360ax8.set_title('Transit Timing Variations')361ax8.grid(True, alpha=0.3)362363# Plot 9: Detection significance vs planet size364ax9 = fig.add_subplot(3, 3, 9)365R_p_range = np.linspace(0.5, 2.0, 50) # Jupiter radii366k_range = R_p_range * R_jup / R_star_m367depth_range = k_range**2368369# SNR for different noise levels370for noise in noise_levels:371# Number of in-transit points372n_transit = int(T_dur_hr * 60) # 1 point per minute373snr = depth_range / noise * np.sqrt(n_transit)374ax9.plot(R_p_range, snr, linewidth=2, label=f'{int(noise*1e6)} ppm')375376ax9.axhline(y=10, color='k', linestyle='--', alpha=0.7, label='SNR=10')377ax9.set_xlabel('Planet Radius ($R_J$)')378ax9.set_ylabel('Transit SNR')379ax9.set_title('Detection Significance')380ax9.legend(fontsize=7)381ax9.grid(True, alpha=0.3)382ax9.set_yscale('log')383384plt.tight_layout()385plt.savefig('exoplanet_transit_plot.pdf', bbox_inches='tight', dpi=150)386print(r'\begin{center}')387print(r'\includegraphics[width=\textwidth]{exoplanet_transit_plot.pdf}')388print(r'\end{center}')389plt.close()390391# Parameter estimation392in_transit_mask = flux_model < 0.999393depth_measured = 1 - np.min(flux_noisy[100e-6])394R_p_estimated = R_star * np.sqrt(depth_measured) * R_sun / R_jup395\end{pycode}396397\section{Results and Analysis}398399\subsection{System Parameters}400401\begin{pycode}402# Generate system parameters table403print(r'\begin{table}[h]')404print(r'\centering')405print(r'\caption{Transit System Parameters}')406print(r'\begin{tabular}{lcc}')407print(r'\toprule')408print(r'Parameter & Symbol & Value \\')409print(r'\midrule')410print(f"Stellar radius & $R_\\star$ & {R_star:.2f} $R_\\odot$ \\\\")411print(f"Planet radius & $R_p$ & {R_planet:.2f} $R_J$ \\\\")412print(f"Semi-major axis & $a$ & {a:.3f} AU \\\\")413print(f"Orbital period & $P$ & {P:.2f} days \\\\")414print(f"Inclination & $i$ & {i:.1f}$^\\circ$ \\\\")415print(f"Impact parameter & $b$ & {b:.3f} \\\\")416print(f"Radius ratio & $k$ & {k:.4f} \\\\")417print(r'\bottomrule')418print(r'\end{tabular}')419print(r'\end{table}')420\end{pycode}421422\subsection{Transit Observables}423424\begin{pycode}425# Transit observables table426print(r'\begin{table}[h]')427print(r'\centering')428print(r'\caption{Transit Observables}')429print(r'\begin{tabular}{lcc}')430print(r'\toprule')431print(r'Observable & Value & Unit \\')432print(r'\midrule')433print(f"Transit depth & {delta*100:.4f} & \\% \\\\")434print(f"Transit depth & {delta*1e6:.1f} & ppm \\\\")435print(f"Transit duration & {T_dur_hr:.2f} & hours \\\\")436print(f"Ingress time & {T_ing_hr*60:.1f} & minutes \\\\")437print(f"Orbital velocity & {v_orb/1000:.1f} & km/s \\\\")438print(f"Transit probability & {R_star_m/a_m*100:.2f} & \\% \\\\")439print(f"Secondary eclipse & {eclipse_depth_ppm:.1f} & ppm \\\\")440print(r'\bottomrule')441print(r'\end{tabular}')442print(r'\end{table}')443\end{pycode}444445\begin{example}[Hot Jupiter Transit]446For the simulated hot Jupiter system:447\begin{itemize}448\item True planet radius: \py{f"{R_planet:.2f}"} $R_J$449\item Measured transit depth: \py{f"{depth_measured*100:.4f}"}\%450\item Estimated planet radius: \py{f"{R_p_estimated:.2f}"} $R_J$451\item Limb darkening coefficients: $u_1 = $ \py{f"{u1}"}, $u_2 = $ \py{f"{u2}"}452\end{itemize}453\end{example}454455\subsection{Atmospheric Characterization}456457Transmission spectroscopy during transit probes the planetary atmosphere at the terminator. The effective transit depth varies with wavelength due to atmospheric absorption:458459\begin{equation}460\delta(\lambda) = \left(\frac{R_p + n H(\lambda)}{R_\star}\right)^2461\end{equation}462463where $H$ is the atmospheric scale height and $n$ is the number of scale heights probed.464465\begin{remark}[Transmission Spectrum Features]466Common spectral features in hot Jupiter atmospheres:467\begin{itemize}468\item \textbf{Sodium (Na I)}: 0.59 $\mu$m doublet469\item \textbf{Potassium (K I)}: 0.77 $\mu$m470\item \textbf{Water (H$_2$O)}: 1.1, 1.4, 1.9 $\mu$m bands471\item \textbf{Carbon monoxide (CO)}: 2.3, 4.6 $\mu$m472\item \textbf{Methane (CH$_4$)}: 3.3 $\mu$m473\end{itemize}474\end{remark}475476\section{Advanced Topics}477478\subsection{Secondary Eclipse}479480The secondary eclipse occurs when the planet passes behind the star, blocking thermal emission and reflected light:481482\begin{equation}483\delta_{eclipse} \approx \left(\frac{R_p}{R_\star}\right)^2 \left(\frac{T_p}{T_\star}\right)^4484\end{equation}485486For our hot Jupiter: $\delta_{eclipse} = $ \py{f"{eclipse_depth_ppm:.1f}"} ppm.487488\subsection{Transit Timing Variations}489490Gravitational perturbations from additional planets cause deviations from a constant orbital period. TTVs can reveal:491\begin{itemize}492\item Unseen companion planets493\item Planet masses (combined with TDVs)494\item Orbital resonances495\end{itemize}496497\subsection{Rossiter-McLaughlin Effect}498499During transit, the planet blocks different portions of the rotating stellar disk, causing an anomalous radial velocity signal. This measures the spin-orbit alignment.500501\section{Observational Considerations}502503\subsection{Photometric Precision Requirements}504505\begin{pycode}506# Precision requirements table507print(r'\begin{table}[h]')508print(r'\centering')509print(r'\caption{Photometric Precision for Different Planet Sizes}')510print(r'\begin{tabular}{lccc}')511print(r'\toprule')512print(r'Planet Type & Radius ($R_\oplus$) & Depth (ppm) & Required Precision \\')513print(r'\midrule')514print(r'Hot Jupiter & 11 & 10000 & 1000 ppm \\')515print(r'Neptune & 4 & 1600 & 200 ppm \\')516print(r'Super-Earth & 2 & 400 & 50 ppm \\')517print(r'Earth & 1 & 100 & 10 ppm \\')518print(r'\bottomrule')519print(r'\end{tabular}')520print(r'\end{table}')521\end{pycode}522523\subsection{Red Noise and Systematics}524525Real transit observations are affected by:526\begin{enumerate}527\item Stellar variability (spots, granulation)528\item Instrumental systematics529\item Atmospheric effects (ground-based)530\item Correlated noise531\end{enumerate}532533\section{Limitations and Extensions}534535\subsection{Model Limitations}536\begin{enumerate}537\item \textbf{Circular orbits}: Eccentric orbits modify transit shape538\item \textbf{Point source star}: Ignores stellar oblateness539\item \textbf{Opaque planet}: No atmospheric effects in base model540\item \textbf{Single planet}: No TTVs or mutual events541\end{enumerate}542543\subsection{Possible Extensions}544\begin{itemize}545\item Full Mandel-Agol model with elliptic integrals546\item Eccentric orbit parameterization547\item Starspot crossing events548\item Ring systems and oblate planets549\item Multi-planet systems550\end{itemize}551552\section{Conclusion}553554This analysis demonstrates the power of transit photometry for exoplanet science:555\begin{itemize}556\item Transit depth of \py{f"{delta*100:.3f}"}\% reveals a Jupiter-sized planet557\item Transit duration of \py{f"{T_dur_hr:.1f}"} hours constrains orbital geometry558\item Impact parameter $b = $ \py{f"{b:.2f}"} indicates near-central transit559\item Limb darkening creates characteristic curved transit bottom560\item Secondary eclipse depth enables thermal emission studies561\end{itemize}562563\section*{Further Reading}564\begin{itemize}565\item Mandel, K. \& Agol, E. (2002). Analytic Light Curves for Planetary Transit Searches. \textit{ApJ Letters}, 580, L171.566\item Seager, S. \& Mall\'en-Ornelas, G. (2003). A Unique Solution of Planet and Star Parameters from an Extrasolar Planet Transit Light Curve. \textit{ApJ}, 585, 1038.567\item Winn, J. N. (2010). Exoplanet Transits and Occultations. In \textit{Exoplanets}, ed. S. Seager.568\end{itemize}569570\end{document}571572573