NextAstro logo NextAstroDocumentation Open Hub

Python examples

Estimate conversion gain from image pairs

The complete source is included below.

python -m nextastro_obs_client.examples.photon_transfer_curve --filter V --seconds 0.5 1 2 4

Writes photon_transfer.csv. Each flat pair contributes mean signal above the bias mean and half its difference variance minus half the bias-pair difference variance. Their ratio is a diagnostic conversion gain in electrons/ADU. Use stable uniform illumination; illumination drift, gradients, nonlinearity and correlated noise bias this simple estimator. Negative signals/variances are reported, not discarded. No lamp is switched automatically.

Student extension: Fit the linear portion of variance against mean and compare regions or readout profiles.

Python source

"""Measure paired-flat noise after paired-bias subtraction, in raw ADU."""
from nextastro_obs_client.examples._common import parser, execute, write_rows


def run(obs, camera, args):
    biases = camera.bias(count=2, target_name="Photon transfer bias")
    bias_mean = sum(image.statistics().mean for image in biases) / 2
    bias_variance = biases[0].difference_statistics(biases[1]).stddev ** 2 / 2
    rows = []
    for seconds in args.seconds:
        pair = camera.flat(seconds=seconds, filter=args.filter, count=2, target_name="Photon transfer flats")
        signal = sum(image.statistics().mean for image in pair) / 2 - bias_mean
        variance = pair[0].difference_statistics(pair[1]).stddev ** 2 / 2 - bias_variance
        rows.append(dict(seconds=seconds, signal_adu=signal, variance_adu2=variance,
            gain_estimate_e_per_adu=signal / variance if variance else None,
            first=str(pair[0].path), second=str(pair[1].path)))
        write_rows(args.output, rows)
    return rows


def main(argv=None):
    p = parser("Photon transfer curve")
    p.add_argument("--filter", required=True)
    p.add_argument("--seconds", type=float, nargs="+", required=True)
    p.add_argument("--output", default="photon_transfer.csv")
    return execute(p, run, argv)


if __name__ == "__main__":
    main()

Shared argument and session helpers: Example support code.