Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/astronomy/exoplanet_transit.tex
51 views
unlisted
1
\documentclass[a4paper, 11pt]{article}
2
\usepackage[utf8]{inputenc}
3
\usepackage[T1]{fontenc}
4
\usepackage{amsmath, amssymb}
5
\usepackage{graphicx}
6
\usepackage{siunitx}
7
\usepackage{booktabs}
8
\usepackage{subcaption}
9
\usepackage[makestderr]{pythontex}
10
11
% Theorem environments
12
\newtheorem{definition}{Definition}
13
\newtheorem{theorem}{Theorem}
14
\newtheorem{example}{Example}
15
\newtheorem{remark}{Remark}
16
17
\title{Exoplanet Transit Photometry: Light Curves and Planetary Parameters\\
18
\large A Comprehensive Analysis of Transit Detection Methods}
19
\author{Exoplanet Science Division\\Computational Science Templates}
20
\date{\today}
21
22
\begin{document}
23
\maketitle
24
25
\begin{abstract}
26
This 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.
27
\end{abstract}
28
29
\section{Introduction}
30
31
Transit 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.
32
33
\begin{definition}[Transit Event]
34
A 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:
35
\begin{equation}
36
p_{transit} = \frac{R_\star + R_p}{a} \approx \frac{R_\star}{a}
37
\end{equation}
38
where $R_\star$ is the stellar radius, $R_p$ is the planetary radius, and $a$ is the semi-major axis.
39
\end{definition}
40
41
\section{Theoretical Framework}
42
43
\subsection{Transit Geometry}
44
45
The fundamental observable is the transit depth:
46
47
\begin{theorem}[Transit Depth]
48
For a uniform stellar disk, the fractional flux decrease during transit is:
49
\begin{equation}
50
\delta = \left(\frac{R_p}{R_\star}\right)^2
51
\end{equation}
52
This simple relation allows direct measurement of the planet-to-star radius ratio.
53
\end{theorem}
54
55
\subsection{Impact Parameter and Inclination}
56
57
The impact parameter $b$ quantifies the transit chord across the stellar disk:
58
\begin{equation}
59
b = \frac{a \cos i}{R_\star}
60
\end{equation}
61
where $i$ is the orbital inclination. A central transit has $b = 0$.
62
63
\subsection{Transit Duration}
64
65
\begin{theorem}[Transit Duration]
66
The total transit duration (first to fourth contact) is:
67
\begin{equation}
68
T_{14} = \frac{P}{\pi} \arcsin\left[\frac{R_\star}{a}\sqrt{(1+k)^2 - b^2}\right]
69
\end{equation}
70
where $k = R_p/R_\star$ and $P$ is the orbital period.
71
72
The full transit duration (second to third contact) is:
73
\begin{equation}
74
T_{23} = \frac{P}{\pi} \arcsin\left[\frac{R_\star}{a}\sqrt{(1-k)^2 - b^2}\right]
75
\end{equation}
76
\end{theorem}
77
78
\subsection{Limb Darkening}
79
80
Stars are not uniformly bright across their disks. The intensity decreases toward the limb due to viewing different atmospheric depths:
81
82
\begin{definition}[Limb Darkening Laws]
83
Common parameterizations include:
84
\begin{align}
85
\text{Linear:} \quad I(\mu) &= 1 - u(1-\mu) \\
86
\text{Quadratic:} \quad I(\mu) &= 1 - u_1(1-\mu) - u_2(1-\mu)^2 \\
87
\text{Nonlinear:} \quad I(\mu) &= 1 - \sum_{n=1}^4 c_n(1-\mu^{n/2})
88
\end{align}
89
where $\mu = \cos\theta$ is the cosine of the angle from disk center.
90
\end{definition}
91
92
\section{Transit Light Curve Models}
93
94
\subsection{Mandel-Agol Model}
95
96
The 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.
97
98
\begin{remark}[Transit Phases]
99
\begin{itemize}
100
\item $z > 1 + k$: No transit (full flux)
101
\item $1 - k < z < 1 + k$: Ingress/egress (partial overlap)
102
\item $z < 1 - k$: Full transit (complete overlap)
103
\item $z < k - 1$: Planet larger than star (not physical for most cases)
104
\end{itemize}
105
\end{remark}
106
107
\section{Computational Analysis}
108
109
\begin{pycode}
110
import numpy as np
111
from scipy.special import ellipk, ellipe
112
import matplotlib.pyplot as plt
113
plt.rc('text', usetex=True)
114
plt.rc('font', family='serif')
115
116
np.random.seed(42)
117
118
# Physical constants
119
R_sun = 6.957e8 # meters
120
R_jup = 7.1492e7 # meters
121
AU = 1.496e11 # meters
122
123
# System parameters (Hot Jupiter)
124
R_star = 1.1 # Solar radii
125
R_planet = 1.2 # Jupiter radii
126
a = 0.045 # Semi-major axis (AU)
127
P = 3.5 # Orbital period (days)
128
i = 87.0 # Inclination (degrees)
129
ecc = 0.0 # Eccentricity (circular orbit)
130
131
# Convert to consistent units
132
R_star_m = R_star * R_sun
133
R_planet_m = R_planet * R_jup
134
a_m = a * AU
135
136
# Derived parameters
137
k = R_planet_m / R_star_m # Radius ratio
138
b = (a_m / R_star_m) * np.cos(np.deg2rad(i)) # Impact parameter
139
delta = k**2 # Transit depth
140
141
# Orbital velocity (circular)
142
v_orb = 2 * np.pi * a_m / (P * 86400) # m/s
143
144
# Transit duration (simple formula for circular orbit)
145
T_dur_s = 2 * R_star_m * np.sqrt((1+k)**2 - b**2) / v_orb
146
T_dur_hr = T_dur_s / 3600
147
148
# Ingress/egress time
149
T_ing_s = 2 * R_star_m * k / (v_orb * np.sqrt(1 - b**2))
150
T_ing_hr = T_ing_s / 3600
151
152
# Limb darkening coefficients (quadratic law for Sun-like star)
153
u1, u2 = 0.4, 0.26
154
155
def limb_darkening(r, u1, u2):
156
"""Quadratic limb darkening: I(r)/I(0)"""
157
mu = np.sqrt(np.maximum(1 - r**2, 0))
158
return 1 - u1*(1-mu) - u2*(1-mu)**2
159
160
def transit_flux(z, k, u1, u2):
161
"""
162
Calculate transit flux using simplified Mandel-Agol formalism
163
z: projected separation in stellar radii
164
k: radius ratio R_p/R_star
165
"""
166
z = np.atleast_1d(z)
167
flux = np.ones_like(z)
168
169
for i, zi in enumerate(z):
170
if zi >= 1 + k:
171
# No transit
172
flux[i] = 1.0
173
elif zi <= 1 - k:
174
# Full transit - use uniform source approximation with LD correction
175
# Approximate by averaging over occulted region
176
r = np.linspace(0, k, 100)
177
ld = limb_darkening(zi + r * 0.5, u1, u2)
178
flux[i] = 1 - k**2 * np.mean(ld)
179
else:
180
# Partial transit (ingress/egress)
181
# Simplified calculation
182
overlap = k**2 * np.arccos((zi**2 + k**2 - 1)/(2*zi*k))
183
overlap += np.arccos((zi**2 + 1 - k**2)/(2*zi))
184
overlap -= 0.5 * np.sqrt((1+k-zi)*(zi+k-1)*(zi-k+1)*(zi+k+1))
185
overlap /= np.pi
186
ld_avg = limb_darkening(zi, u1, u2)
187
flux[i] = 1 - overlap * ld_avg
188
189
return flux
190
191
# Generate time array
192
t_days = np.linspace(-0.15, 0.15, 2000)
193
t_hours = t_days * 24
194
195
# Calculate projected separation
196
z = np.abs(t_days) * v_orb / R_star_m * 86400
197
198
# Calculate model flux
199
flux_model = transit_flux(z, k, u1, u2)
200
201
# Generate multiple noise levels
202
noise_levels = [100e-6, 500e-6, 1000e-6] # ppm
203
flux_noisy = {}
204
for noise in noise_levels:
205
flux_noisy[noise] = flux_model + np.random.normal(0, noise, len(flux_model))
206
207
# Secondary eclipse depth (thermal emission)
208
T_star = 5800 # K
209
T_planet = 1500 # K (hot Jupiter)
210
eclipse_depth = (R_planet_m/R_star_m)**2 * (T_planet/T_star)**4
211
eclipse_depth_ppm = eclipse_depth * 1e6
212
213
# Phase curve amplitude (day-night contrast)
214
phase_amplitude = eclipse_depth * 0.5 # Assume 50% redistribution
215
216
# Create comprehensive figure
217
fig = plt.figure(figsize=(14, 16))
218
219
# Plot 1: Light curve with different noise levels
220
ax1 = fig.add_subplot(3, 3, 1)
221
ax1.plot(t_hours, flux_model, 'k-', linewidth=2, label='Model', zorder=10)
222
ax1.plot(t_hours, flux_noisy[100e-6], '.', color='blue', markersize=1,
223
alpha=0.3, label='100 ppm')
224
ax1.set_xlabel('Time from mid-transit (hours)')
225
ax1.set_ylabel('Relative Flux')
226
ax1.set_title('Transit Light Curve')
227
ax1.legend(fontsize=8)
228
ax1.grid(True, alpha=0.3)
229
ax1.set_xlim(-3, 3)
230
231
# Plot 2: Zoomed transit with different noise
232
ax2 = fig.add_subplot(3, 3, 2)
233
colors = ['blue', 'green', 'red']
234
for idx, noise in enumerate(noise_levels):
235
label = f'{int(noise*1e6)} ppm'
236
ax2.plot(t_hours, flux_noisy[noise], '.', color=colors[idx],
237
markersize=1, alpha=0.5, label=label)
238
ax2.plot(t_hours, flux_model, 'k-', linewidth=2, zorder=10)
239
ax2.set_xlabel('Time from mid-transit (hours)')
240
ax2.set_ylabel('Relative Flux')
241
ax2.set_title('Noise Level Comparison')
242
ax2.legend(fontsize=7)
243
ax2.grid(True, alpha=0.3)
244
ax2.set_xlim(-T_dur_hr, T_dur_hr)
245
246
# Plot 3: Transit depth vs wavelength (simulated)
247
ax3 = fig.add_subplot(3, 3, 3)
248
wavelengths = np.linspace(0.4, 2.5, 50) # microns
249
# Simulate atmospheric absorption (simplified)
250
base_depth = delta
251
H_scale = 500e3 # Scale height in meters
252
n_scales = 5 # Number of scale heights
253
atm_signal = n_scales * 2 * R_planet_m * H_scale / R_star_m**2
254
255
# Add spectral features
256
depth_spectrum = np.ones_like(wavelengths) * base_depth
257
# Water absorption at 1.4 and 1.9 microns
258
depth_spectrum += atm_signal * 0.3 * np.exp(-((wavelengths-1.4)/0.1)**2)
259
depth_spectrum += atm_signal * 0.4 * np.exp(-((wavelengths-1.9)/0.15)**2)
260
# Sodium at 0.59 microns
261
depth_spectrum += atm_signal * 0.2 * np.exp(-((wavelengths-0.59)/0.02)**2)
262
263
ax3.plot(wavelengths, depth_spectrum * 100, 'b-', linewidth=2)
264
ax3.axhline(y=delta*100, color='r', linestyle='--', alpha=0.7, label='Flat')
265
ax3.set_xlabel(r'Wavelength ($\mu$m)')
266
ax3.set_ylabel('Transit Depth (\\%)')
267
ax3.set_title('Transmission Spectrum')
268
ax3.legend(fontsize=8)
269
ax3.grid(True, alpha=0.3)
270
271
# Plot 4: Impact parameter effect
272
ax4 = fig.add_subplot(3, 3, 4)
273
b_values = [0.0, 0.3, 0.6, 0.8]
274
for bi in b_values:
275
# Calculate duration for this b
276
if (1+k)**2 - bi**2 > 0:
277
T_i = 2 * R_star_m * np.sqrt((1+k)**2 - bi**2) / v_orb / 3600
278
t_i = np.linspace(-T_i/2*1.5, T_i/2*1.5, 500)
279
z_i = np.sqrt((t_i*3600*v_orb/R_star_m)**2 + bi**2)
280
flux_i = transit_flux(z_i, k, u1, u2)
281
ax4.plot(t_i, flux_i, linewidth=2, label=f'b={bi:.1f}')
282
283
ax4.set_xlabel('Time (hours)')
284
ax4.set_ylabel('Relative Flux')
285
ax4.set_title('Impact Parameter Effect')
286
ax4.legend(fontsize=8)
287
ax4.grid(True, alpha=0.3)
288
289
# Plot 5: Limb darkening comparison
290
ax5 = fig.add_subplot(3, 3, 5)
291
r_disk = np.linspace(0, 1, 100)
292
293
# Different LD laws
294
ld_uniform = np.ones_like(r_disk)
295
ld_linear = limb_darkening(r_disk, 0.6, 0)
296
ld_quad = limb_darkening(r_disk, u1, u2)
297
298
ax5.plot(r_disk, ld_uniform, 'k--', linewidth=2, label='Uniform')
299
ax5.plot(r_disk, ld_linear, 'b-', linewidth=2, label='Linear')
300
ax5.plot(r_disk, ld_quad, 'r-', linewidth=2, label='Quadratic')
301
ax5.set_xlabel('Radial position (r/$R_\\star$)')
302
ax5.set_ylabel('Intensity I/I$_0$')
303
ax5.set_title('Limb Darkening Laws')
304
ax5.legend(fontsize=8)
305
ax5.grid(True, alpha=0.3)
306
307
# Plot 6: Transit with different LD
308
ax6 = fig.add_subplot(3, 3, 6)
309
flux_uniform = transit_flux(z, k, 0, 0)
310
flux_linear = transit_flux(z, k, 0.6, 0)
311
312
ax6.plot(t_hours, flux_uniform, 'k--', linewidth=2, label='Uniform')
313
ax6.plot(t_hours, flux_linear, 'b-', linewidth=2, label='Linear')
314
ax6.plot(t_hours, flux_model, 'r-', linewidth=2, label='Quadratic')
315
ax6.set_xlabel('Time (hours)')
316
ax6.set_ylabel('Relative Flux')
317
ax6.set_title('Limb Darkening Effect on Transit')
318
ax6.legend(fontsize=8)
319
ax6.grid(True, alpha=0.3)
320
ax6.set_xlim(-T_dur_hr, T_dur_hr)
321
322
# Plot 7: Phase curve
323
ax7 = fig.add_subplot(3, 3, 7)
324
phase = np.linspace(-0.5, 0.5, 1000)
325
phase_flux = np.ones_like(phase)
326
327
# Add transit
328
transit_phase = T_dur_hr / 24 / P
329
in_transit = np.abs(phase) < transit_phase
330
phase_flux[in_transit] = 1 - delta
331
332
# Add secondary eclipse
333
eclipse_phase = np.abs(phase - 0) < transit_phase # At phase 0.5 (but we center on transit)
334
sec_eclipse = np.abs(phase + 0) < transit_phase # Opposite side
335
336
# Add phase variation (cosine)
337
phase_flux += phase_amplitude * np.cos(2*np.pi*phase)
338
339
# Secondary eclipse at phase 0.5 (half period from transit)
340
ax7.plot(phase, phase_flux, 'b-', linewidth=2)
341
ax7.axvline(x=0, color='r', linestyle=':', alpha=0.7, label='Transit')
342
ax7.axvline(x=0.5, color='g', linestyle=':', alpha=0.7, label='Eclipse')
343
ax7.set_xlabel('Orbital Phase')
344
ax7.set_ylabel('Relative Flux')
345
ax7.set_title('Phase Curve')
346
ax7.legend(fontsize=8)
347
ax7.grid(True, alpha=0.3)
348
349
# Plot 8: Transit timing variations
350
ax8 = fig.add_subplot(3, 3, 8)
351
n_transits = 20
352
ttv_amplitude = 5 # minutes
353
t_expected = np.arange(n_transits) * P
354
ttv = ttv_amplitude * np.sin(2*np.pi*np.arange(n_transits)/8) # TTV signal
355
ttv += np.random.normal(0, 1, n_transits) # Noise
356
357
ax8.errorbar(np.arange(n_transits), ttv, yerr=1, fmt='bo', capsize=3)
358
ax8.axhline(y=0, color='r', linestyle='--', alpha=0.7)
359
ax8.set_xlabel('Transit Number')
360
ax8.set_ylabel('O-C (minutes)')
361
ax8.set_title('Transit Timing Variations')
362
ax8.grid(True, alpha=0.3)
363
364
# Plot 9: Detection significance vs planet size
365
ax9 = fig.add_subplot(3, 3, 9)
366
R_p_range = np.linspace(0.5, 2.0, 50) # Jupiter radii
367
k_range = R_p_range * R_jup / R_star_m
368
depth_range = k_range**2
369
370
# SNR for different noise levels
371
for noise in noise_levels:
372
# Number of in-transit points
373
n_transit = int(T_dur_hr * 60) # 1 point per minute
374
snr = depth_range / noise * np.sqrt(n_transit)
375
ax9.plot(R_p_range, snr, linewidth=2, label=f'{int(noise*1e6)} ppm')
376
377
ax9.axhline(y=10, color='k', linestyle='--', alpha=0.7, label='SNR=10')
378
ax9.set_xlabel('Planet Radius ($R_J$)')
379
ax9.set_ylabel('Transit SNR')
380
ax9.set_title('Detection Significance')
381
ax9.legend(fontsize=7)
382
ax9.grid(True, alpha=0.3)
383
ax9.set_yscale('log')
384
385
plt.tight_layout()
386
plt.savefig('exoplanet_transit_plot.pdf', bbox_inches='tight', dpi=150)
387
print(r'\begin{center}')
388
print(r'\includegraphics[width=\textwidth]{exoplanet_transit_plot.pdf}')
389
print(r'\end{center}')
390
plt.close()
391
392
# Parameter estimation
393
in_transit_mask = flux_model < 0.999
394
depth_measured = 1 - np.min(flux_noisy[100e-6])
395
R_p_estimated = R_star * np.sqrt(depth_measured) * R_sun / R_jup
396
\end{pycode}
397
398
\section{Results and Analysis}
399
400
\subsection{System Parameters}
401
402
\begin{pycode}
403
# Generate system parameters table
404
print(r'\begin{table}[h]')
405
print(r'\centering')
406
print(r'\caption{Transit System Parameters}')
407
print(r'\begin{tabular}{lcc}')
408
print(r'\toprule')
409
print(r'Parameter & Symbol & Value \\')
410
print(r'\midrule')
411
print(f"Stellar radius & $R_\\star$ & {R_star:.2f} $R_\\odot$ \\\\")
412
print(f"Planet radius & $R_p$ & {R_planet:.2f} $R_J$ \\\\")
413
print(f"Semi-major axis & $a$ & {a:.3f} AU \\\\")
414
print(f"Orbital period & $P$ & {P:.2f} days \\\\")
415
print(f"Inclination & $i$ & {i:.1f}$^\\circ$ \\\\")
416
print(f"Impact parameter & $b$ & {b:.3f} \\\\")
417
print(f"Radius ratio & $k$ & {k:.4f} \\\\")
418
print(r'\bottomrule')
419
print(r'\end{tabular}')
420
print(r'\end{table}')
421
\end{pycode}
422
423
\subsection{Transit Observables}
424
425
\begin{pycode}
426
# Transit observables table
427
print(r'\begin{table}[h]')
428
print(r'\centering')
429
print(r'\caption{Transit Observables}')
430
print(r'\begin{tabular}{lcc}')
431
print(r'\toprule')
432
print(r'Observable & Value & Unit \\')
433
print(r'\midrule')
434
print(f"Transit depth & {delta*100:.4f} & \\% \\\\")
435
print(f"Transit depth & {delta*1e6:.1f} & ppm \\\\")
436
print(f"Transit duration & {T_dur_hr:.2f} & hours \\\\")
437
print(f"Ingress time & {T_ing_hr*60:.1f} & minutes \\\\")
438
print(f"Orbital velocity & {v_orb/1000:.1f} & km/s \\\\")
439
print(f"Transit probability & {R_star_m/a_m*100:.2f} & \\% \\\\")
440
print(f"Secondary eclipse & {eclipse_depth_ppm:.1f} & ppm \\\\")
441
print(r'\bottomrule')
442
print(r'\end{tabular}')
443
print(r'\end{table}')
444
\end{pycode}
445
446
\begin{example}[Hot Jupiter Transit]
447
For the simulated hot Jupiter system:
448
\begin{itemize}
449
\item True planet radius: \py{f"{R_planet:.2f}"} $R_J$
450
\item Measured transit depth: \py{f"{depth_measured*100:.4f}"}\%
451
\item Estimated planet radius: \py{f"{R_p_estimated:.2f}"} $R_J$
452
\item Limb darkening coefficients: $u_1 = $ \py{f"{u1}"}, $u_2 = $ \py{f"{u2}"}
453
\end{itemize}
454
\end{example}
455
456
\subsection{Atmospheric Characterization}
457
458
Transmission spectroscopy during transit probes the planetary atmosphere at the terminator. The effective transit depth varies with wavelength due to atmospheric absorption:
459
460
\begin{equation}
461
\delta(\lambda) = \left(\frac{R_p + n H(\lambda)}{R_\star}\right)^2
462
\end{equation}
463
464
where $H$ is the atmospheric scale height and $n$ is the number of scale heights probed.
465
466
\begin{remark}[Transmission Spectrum Features]
467
Common spectral features in hot Jupiter atmospheres:
468
\begin{itemize}
469
\item \textbf{Sodium (Na I)}: 0.59 $\mu$m doublet
470
\item \textbf{Potassium (K I)}: 0.77 $\mu$m
471
\item \textbf{Water (H$_2$O)}: 1.1, 1.4, 1.9 $\mu$m bands
472
\item \textbf{Carbon monoxide (CO)}: 2.3, 4.6 $\mu$m
473
\item \textbf{Methane (CH$_4$)}: 3.3 $\mu$m
474
\end{itemize}
475
\end{remark}
476
477
\section{Advanced Topics}
478
479
\subsection{Secondary Eclipse}
480
481
The secondary eclipse occurs when the planet passes behind the star, blocking thermal emission and reflected light:
482
483
\begin{equation}
484
\delta_{eclipse} \approx \left(\frac{R_p}{R_\star}\right)^2 \left(\frac{T_p}{T_\star}\right)^4
485
\end{equation}
486
487
For our hot Jupiter: $\delta_{eclipse} = $ \py{f"{eclipse_depth_ppm:.1f}"} ppm.
488
489
\subsection{Transit Timing Variations}
490
491
Gravitational perturbations from additional planets cause deviations from a constant orbital period. TTVs can reveal:
492
\begin{itemize}
493
\item Unseen companion planets
494
\item Planet masses (combined with TDVs)
495
\item Orbital resonances
496
\end{itemize}
497
498
\subsection{Rossiter-McLaughlin Effect}
499
500
During transit, the planet blocks different portions of the rotating stellar disk, causing an anomalous radial velocity signal. This measures the spin-orbit alignment.
501
502
\section{Observational Considerations}
503
504
\subsection{Photometric Precision Requirements}
505
506
\begin{pycode}
507
# Precision requirements table
508
print(r'\begin{table}[h]')
509
print(r'\centering')
510
print(r'\caption{Photometric Precision for Different Planet Sizes}')
511
print(r'\begin{tabular}{lccc}')
512
print(r'\toprule')
513
print(r'Planet Type & Radius ($R_\oplus$) & Depth (ppm) & Required Precision \\')
514
print(r'\midrule')
515
print(r'Hot Jupiter & 11 & 10000 & 1000 ppm \\')
516
print(r'Neptune & 4 & 1600 & 200 ppm \\')
517
print(r'Super-Earth & 2 & 400 & 50 ppm \\')
518
print(r'Earth & 1 & 100 & 10 ppm \\')
519
print(r'\bottomrule')
520
print(r'\end{tabular}')
521
print(r'\end{table}')
522
\end{pycode}
523
524
\subsection{Red Noise and Systematics}
525
526
Real transit observations are affected by:
527
\begin{enumerate}
528
\item Stellar variability (spots, granulation)
529
\item Instrumental systematics
530
\item Atmospheric effects (ground-based)
531
\item Correlated noise
532
\end{enumerate}
533
534
\section{Limitations and Extensions}
535
536
\subsection{Model Limitations}
537
\begin{enumerate}
538
\item \textbf{Circular orbits}: Eccentric orbits modify transit shape
539
\item \textbf{Point source star}: Ignores stellar oblateness
540
\item \textbf{Opaque planet}: No atmospheric effects in base model
541
\item \textbf{Single planet}: No TTVs or mutual events
542
\end{enumerate}
543
544
\subsection{Possible Extensions}
545
\begin{itemize}
546
\item Full Mandel-Agol model with elliptic integrals
547
\item Eccentric orbit parameterization
548
\item Starspot crossing events
549
\item Ring systems and oblate planets
550
\item Multi-planet systems
551
\end{itemize}
552
553
\section{Conclusion}
554
555
This analysis demonstrates the power of transit photometry for exoplanet science:
556
\begin{itemize}
557
\item Transit depth of \py{f"{delta*100:.3f}"}\% reveals a Jupiter-sized planet
558
\item Transit duration of \py{f"{T_dur_hr:.1f}"} hours constrains orbital geometry
559
\item Impact parameter $b = $ \py{f"{b:.2f}"} indicates near-central transit
560
\item Limb darkening creates characteristic curved transit bottom
561
\item Secondary eclipse depth enables thermal emission studies
562
\end{itemize}
563
564
\section*{Further Reading}
565
\begin{itemize}
566
\item Mandel, K. \& Agol, E. (2002). Analytic Light Curves for Planetary Transit Searches. \textit{ApJ Letters}, 580, L171.
567
\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.
568
\item Winn, J. N. (2010). Exoplanet Transits and Occultations. In \textit{Exoplanets}, ed. S. Seager.
569
\end{itemize}
570
571
\end{document}
572
573