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.