CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-lightkurve

A friendly package for Kepler & TESS time series analysis in Python.

Pending
Overview
Eval results
Files

systematics-correction.mddocs/

Systematics Correction

Advanced algorithms for removing instrumental systematics and improving photometric precision. Essential for detecting small astrophysical signals by correcting spacecraft-induced noise patterns.

Capabilities

Pixel Level Decorrelation (PLD)

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"""

Cotrending Basis Vector (CBV) Correction

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"""

Self Flat Fielding (SFF)

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
        """

Design Matrix Framework

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"""

Base Regression Corrector

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
        """

Usage Examples

Basic PLD Correction

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 PLD with Custom Parameters

# 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()

CBV Correction

# 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')

Manual CBV Loading

# 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 SFF Correction

# 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")

Custom Design Matrix

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)

Comparing Correction Methods

# 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")

Advanced PLD Options

# 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

docs

asteroseismology.md

core-data.md

data-search.md

index.md

prf-modeling.md

systematics-correction.md

time-series-analysis.md

tile.json