Source code for corrections.KASOCFilterCorrector

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Lightcurve correction using the KASOC Filter (Handberg et al. 2015).

.. codeauthor:: Rasmus Handberg <rasmush@phys.au.dk>
"""

import numpy as np
import logging
import requests
from collections import defaultdict
from . import kasoc_filter as kf
from . import BaseCorrector, STATUS
from .quality import CorrectorQualityFlags

[docs] class KASOCFilterCorrector(BaseCorrector): #----------------------------------------------------------------------------------------------
[docs] def __init__(self, *args, **kwargs): # Call the parent initializing: # This will set several default settings super().__init__(*args, **kwargs) logger = logging.getLogger(__name__) # Store a list of known periods of TESS Objects of Interest (TOIs): self.tois_periods = defaultdict(list) # Contact TASOC database for list of TOIs: r = requests.get('https://tasoc.dk/pipeline/toilist.php') r.raise_for_status() for row in r.json(): self.tois_periods[row['tic']].append(row['period']) logger.debug(self.tois_periods)
#----------------------------------------------------------------------------------------------
[docs] def do_correction(self, lc): logger = logging.getLogger(__name__) #position = np.column_stack((lc.centroid_col, lc.centroid_row)) position = None periods = np.array(self.tois_periods.get(lc.targetid, [])) if len(periods) == 0: periods = None else: indx = (np.max(lc.time) - np.min(lc.time)) / np.array(periods) > 3.0 periods = periods[indx] if len(periods) == 0: periods = None logger.debug(periods) jumps = None cadence = 86400*np.median(np.diff(lc.time)) if cadence > 1000: filter_timescale_long = 6.0 filter_timescale_short = 0.5 else: filter_timescale_long = 3.0 filter_timescale_short = 1.0/24.0 filter_phase_smooth_factor = 200 filter_sigma_clip = 4.5 filter_turnover_clip = 5.0 filter_turnover_width = 1.0 filter_position_mode = 'None' # Configure plotting in KASOC filter: if self.plot: kf.set_output(self.plot_folder(lc), '%011d_kf_' % lc.targetid, fmt='png') else: kf.set_output(None) # Run the KASOC Filter: lc_corr = lc.copy() time2, lc_corr.flux, lc_corr.flux_err, kasoc_quality, filt, turnover, xlong, xpos, xtransit, xshort = kf.filter( lc.time, lc.flux, quality=lc.pixel_quality, P=periods, jumps=jumps, position=position, timescale_long=filter_timescale_long, timescale_short=filter_timescale_short, phase_smooth_factor=filter_phase_smooth_factor, sigma_clip=filter_sigma_clip, scale_clip=filter_turnover_clip, scale_width=filter_turnover_width ) # Translate the quality flags from the KASOC filter to the real ones: lc_corr.quality[kasoc_quality & 2 != 0] |= CorrectorQualityFlags.JumpAdditiveConstant lc_corr.quality[kasoc_quality & 4 != 0] |= CorrectorQualityFlags.JumpAdditiveLinear lc_corr.quality[kasoc_quality & 256 != 0] |= CorrectorQualityFlags.JumpMultiplicativeConstant lc_corr.quality[kasoc_quality & 512 != 0] |= CorrectorQualityFlags.JumpMultiplicativeLinear lc_corr.quality[kasoc_quality & 8+128 != 0] |= CorrectorQualityFlags.SigmaClip # Set headers that will be saved to the FITS file: #lc_corr.meta['additional_headers']['KF_MODE'] = (filter_operation_mode, 'KASOC filter: operation mode') lc_corr.meta['additional_headers']['KF_POSS'] = (filter_position_mode, 'KASOC filter: star positions used') lc_corr.meta['additional_headers']['KF_LONG'] = (filter_timescale_long, '[d] KASOC filter: long timescale') lc_corr.meta['additional_headers']['KF_SHORT'] = (filter_timescale_short, '[d] KASOC filter: short timescale') lc_corr.meta['additional_headers']['KF_SCLIP'] = (filter_sigma_clip, 'KASOC filter: sigma clipping') lc_corr.meta['additional_headers']['KF_TCLIP'] = (filter_turnover_clip, 'KASOC filter: turnover clip') lc_corr.meta['additional_headers']['KF_TWDTH'] = (filter_turnover_width, 'KASOC filter: turnover width') lc_corr.meta['additional_headers']['KF_PSMTH'] = (filter_phase_smooth_factor, 'KASOC filter: phase smooth factor') # Add information about removed periods to the header: if periods is not None: lc_corr.meta['additional_headers']['NUM_PER'] = (len(periods), 'KASOC filter: number of periods removed') for k, p in enumerate(periods): lc_corr.meta['additional_headers']['PER_%d' % (k+1)] = (p, '[d] KASOC filter: period removed') else: lc_corr.meta['additional_headers']['NUM_PER'] = (0, 'KASOC filter: number of periods removed') return lc_corr, STATUS.OK