A friendly package for Kepler & TESS time series analysis in Python.
—
Advanced algorithms for removing instrumental systematics and improving photometric precision. Essential for detecting small astrophysical signals by correcting spacecraft-induced noise patterns.
class PLDCorrector:
"""
Pixel Level Decorrelation for removing systematic noise correlations.
Uses pixel-level data to model and remove instrumental systematics.
"""
def __init__(self, tpf, aperture_mask=None):
"""
Initialize PLD corrector.
Parameters:
- tpf: TargetPixelFile - Target pixel file to correct
- aperture_mask: array-like, optional - Pixel mask for aperture
"""
def correct(self, aperture_mask=None, pld_aperture_mask=None,
pld_order=1, **kwargs):
"""
Perform PLD correction.
Parameters:
- aperture_mask: array-like - Pixels for photometry
- pld_aperture_mask: array-like - Pixels for PLD regressors
- pld_order: int - PLD polynomial order (1 or 2)
- cadence_mask: array-like - Time points to include
- sigma: float - Outlier rejection threshold
Returns:
Corrected LightCurve object
"""
class TessPLDCorrector(PLDCorrector):
"""TESS-optimized PLD corrector with mission-specific features"""
def correct(self, **kwargs):
"""TESS-optimized PLD correction with default parameters"""class CBVCorrector:
"""
Cotrending Basis Vector correction using pre-computed systematic trends.
Removes common systematic patterns across multiple targets.
"""
def __init__(self, lc):
"""
Initialize CBV corrector.
Parameters:
- lc: LightCurve - Light curve to correct
"""
def correct(self, cbvs=None, **kwargs):
"""
Perform CBV correction.
Parameters:
- cbvs: CotrendingBasisVectors - CBV object (auto-downloaded if None)
- cbv_indices: list - Which CBV components to use
- alpha: float - Regularization parameter
- interpolate_missing: bool - Interpolate missing CBV data
Returns:
Corrected LightCurve object
"""
# CBV data containers
class CotrendingBasisVectors:
"""Generic container for cotrending basis vectors"""
class KeplerCotrendingBasisVectors(CotrendingBasisVectors):
"""Kepler-specific CBV implementation"""
class TessCotrendingBasisVectors(CotrendingBasisVectors):
"""TESS-specific CBV implementation"""
# CBV utility functions
def load_kepler_cbvs(mission, quarter, channel, **kwargs):
"""Load Kepler CBV files from local storage"""
def load_tess_cbvs(sector, camera, ccd, **kwargs):
"""Load TESS CBV files from local storage"""
def download_kepler_cbvs(mission, quarter, channel, **kwargs):
"""Download Kepler CBV files from MAST archive"""
def download_tess_cbvs(sector, camera, ccd, **kwargs):
"""Download TESS CBV files from MAST archive"""class SFFCorrector:
"""
Self Flat Fielding corrector optimized for K2 data.
Removes systematic effects caused by spacecraft motion.
"""
def __init__(self, tpf):
"""
Initialize SFF corrector.
Parameters:
- tpf: TargetPixelFile - K2 target pixel file
"""
def correct(self, centroid_col=None, centroid_row=None, **kwargs):
"""
Perform SFF correction.
Parameters:
- centroid_col: array-like - Column centroids (auto-computed if None)
- centroid_row: array-like - Row centroids (auto-computed if None)
- polyorder: int - Polynomial order for detrending
- sigma: float - Outlier rejection threshold
- windows: int - Number of windows for local correction
Returns:
Corrected LightCurve object
"""class DesignMatrix:
"""
Matrix for linear regression problems in systematics correction.
Provides tools for building and manipulating design matrices.
"""
def __init__(self, df, **kwargs):
"""
Initialize design matrix.
Parameters:
- df: pandas.DataFrame or array-like - Design matrix data
"""
def split(self, row_indices):
"""Split design matrix by row indices"""
def append_constant(self):
"""Add constant column to design matrix"""
def standardize(self):
"""Standardize columns to zero mean and unit variance"""
def plot(self, **kwargs):
"""Visualize design matrix structure"""
class SparseDesignMatrix(DesignMatrix):
"""Memory-efficient sparse design matrix for large problems"""
class DesignMatrixCollection:
"""Collection of multiple design matrices"""
class SparseDesignMatrixCollection:
"""Collection of sparse design matrices"""class RegressionCorrector:
"""
Base class for regression-based systematics correction.
Provides common functionality for linear regression correctors.
"""
def __init__(self, lc):
"""Initialize regression corrector with light curve"""
def correct(self, regressors=None, **kwargs):
"""
Perform regression-based correction.
Parameters:
- regressors: array-like or DesignMatrix - Systematic regressors
- sigma: float - Outlier rejection threshold
- alpha: float - Regularization parameter
Returns:
Corrected LightCurve object
"""import lightkurve as lk
# Download target pixel file
search = lk.search_targetpixelfile('K2-18', mission='K2', campaign=5)
tpf = search[0].download()
# Apply PLD correction
corrector = lk.PLDCorrector(tpf)
corrected_lc = corrector.correct()
# Compare before and after
raw_lc = tpf.to_lightcurve()
raw_lc.plot(label='Raw')
corrected_lc.plot(label='PLD Corrected')# TESS-specific PLD correction
tess_search = lk.search_targetpixelfile('TOI-715', mission='TESS')
tess_tpf = tess_search[0].download()
# Use TESS-optimized corrector
tess_corrector = lk.TessPLDCorrector(tess_tpf)
corrected_lc = tess_corrector.correct(pld_order=2, sigma=3)
# Plot results
corrected_lc.plot()# Download light curve for CBV correction
lc_search = lk.search_lightcurve('KIC 11904151', quarter=4)
lc = lc_search[0].download()
# Apply CBV correction
cbv_corrector = lk.CBVCorrector(lc)
corrected_lc = cbv_corrector.correct(cbv_indices=[1, 2, 3])
# Compare results
lc.plot(label='Original')
corrected_lc.plot(label='CBV Corrected')# Load specific CBVs
cbvs = lk.load_kepler_cbvs(mission='Kepler', quarter=4, channel=20)
# Apply with custom settings
corrected_lc = cbv_corrector.correct(cbvs=cbvs, alpha=0.1)# K2 data requires SFF correction
k2_search = lk.search_targetpixelfile('EPIC 211945201', campaign=2)
k2_tpf = k2_search[0].download()
# Apply SFF correction
sff_corrector = lk.SFFCorrector(k2_tpf)
corrected_lc = sff_corrector.correct(polyorder=3)
# Show improvement
raw_lc = k2_tpf.to_lightcurve()
print(f"Raw CDPP: {raw_lc.estimate_cdpp():.1f} ppm")
print(f"Corrected CDPP: {corrected_lc.estimate_cdpp():.1f} ppm")import pandas as pd
import numpy as np
# Create custom regressors
time = lc.time.value
regressors = pd.DataFrame({
'time': time,
'time_squared': time**2,
'sin_component': np.sin(2*np.pi*time/10),
'cos_component': np.cos(2*np.pi*time/10)
})
# Build design matrix
dm = lk.DesignMatrix(regressors)
dm = dm.standardize().append_constant()
# Apply regression correction
reg_corrector = lk.RegressionCorrector(lc)
corrected_lc = reg_corrector.correct(regressors=dm)# Compare different correction methods
raw_lc = tpf.to_lightcurve()
pld_lc = lk.PLDCorrector(tpf).correct()
sff_lc = lk.SFFCorrector(tpf).correct()
# Plot comparison
import matplotlib.pyplot as plt
fig, axes = plt.subplots(3, 1, figsize=(12, 10))
raw_lc.plot(ax=axes[0], title='Raw Light Curve')
pld_lc.plot(ax=axes[1], title='PLD Corrected')
sff_lc.plot(ax=axes[2], title='SFF Corrected')
# Compare precision
print(f"Raw CDPP: {raw_lc.estimate_cdpp():.1f} ppm")
print(f"PLD CDPP: {pld_lc.estimate_cdpp():.1f} ppm")
print(f"SFF CDPP: {sff_lc.estimate_cdpp():.1f} ppm")# High-order PLD with custom apertures
threshold_mask = tpf.create_threshold_mask(threshold=5)
custom_pld_mask = tpf.flux[0] > 100
corrector = lk.PLDCorrector(tpf)
corrected_lc = corrector.correct(
aperture_mask=threshold_mask,
pld_aperture_mask=custom_pld_mask,
pld_order=2,
sigma=4.0
)Install with Tessl CLI
npx tessl i tessl/pypi-lightkurve