Skip to content

simeonreusch/ztfparsnip

Repository files navigation

ztfparsnip

PyPI version CI Coverage Status

Retrain Parsnip for ZTF. This is achieved by using fpbot forced photometry lightcurves of the Bright Transient Survey. These are augmented (redshifted, noisified and - when possible - K-corrected).

The package is maintained by A. Townsend (HU Berlin) and S. Reusch (DESY).

The following augmentation steps are taken for each parent lightcurve to generate a desired number of children (calculated via weights):

  • draw a new redshift from a cubic distribution with maximum redshift increase delta_z
  • only accept the lightcurve if at least n_det_threshold datapoints are above the signal-to-noise threshold SN_threshold
  • if the lightcurve has an existing SNCosmo template, apply a K-correction at that magnitude (if k_corr=True)
  • randomly drop datapoints until subsampling_rate is reached
  • add some scatter to the observed dates (jd_scatter_sigma in days)
  • if phase_lim=True, only keep datapoints during a typical duration (depends on the type of source)

⚠️ Note that a high delta_z without loosening the SN_threshold and n_det_threshold will result in a large dropout rate, which will ultimately lead to far less lightcurves being generated than initially desired.

Usage

Create an augmented training sample

from pathlib import Path
from ztfparsnip.create import CreateLightcurves

weights = {"sn_ia": 9400, "tde": 9400, "sn_other": 9400, "agn": 9400, "star": 9400}

if __name__ == "__main__":
    sample = CreateLightcurves(
        output_format="parsnip",
        classkey="simpleclasses",
        weights=weights,
        train_dir=Path("train"),
        plot_dir=Path("plot"),
        seed=None,
        phase_lim=True,
        k_corr=True,
    )
    sample.select()
    sample.create(plot_debug=False)

Train Parsnip with the augmented sample

from ztfparsnip.train import Train

if __name__ == "__main__":
    train = Train(classkey="simpleclasses", seed=None)
    train.run()

Evaluate the Parsnip model

from ztfparsnip.train import Train

if __name__ == "__main__":
    train = Train(classkey="simpleclasses", seed=None)
    train.classify()