Source code for noctua.templates.focus

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# System modules
from time import sleep

# Third-party modules
import gnuplotlib as gp
import numpy as np
from astropy.io import fits
from astropy.time import Time

# Other templates
from ..config.constants import pixscale, temp_fits
from ..devices import cam, foc
from ..utils.analysis import fit_star
from ..utils.logger import log
from ..utils.structure import foc_path
from .basetemplate import BaseTemplate
from .box import Template as Box


[docs] class Template(BaseTemplate): def __init__(self): super().__init__() self.name = "focus" self.description = "Fit boxed images to get optimal focus"
[docs] def content(self, params): ######################## ##### Params check ##### ######################## try: objname = params.get("object") or "test" filt = params["filter"] binning = params["binning"] exptime = params["exptime"] center = params.get("center") or cam.center width = params.get("width") or 400 // binning height = params.get("height") or 400 // binning repeat = params.get("repeat") or 10 step = params.get("step") or 10 except KeyError as e: msg = f"Parameter {e} not found" log.error(msg) self.error.append(msg) return # for Box fixed = { "objname": objname, "repeat": 1, "center": center, "width": width, "height": height, } params.update(fixed) ####################################### ##### Preparing to the focus loop ##### ####################################### # Getting initial focus original_foc = foc.position # starting from half before total_lenght = step * repeat foc.position -= total_lenght / 2 # Preparing empty arrays for values m2_arr = np.array([], dtype=int) fwhm_arr = np.array([]) self.output = [] # Preparing the focus file path now = Time.now().isot file_path = foc_path(now) # Initial comment about variables a, b, c comment1 = f"Focus procedure of {now}" comment2 = f"rep m2[µm] fwhm[px]" # Write the initial comment if the file doesn't exist with open(file_path, "a+") as file: log.info(f"Init file {file_path}") file.seek(0) if not file.read(1): file.write(f"# {comment1}\n") file.write(f"# {comment2}\n") # Instanciating a Box template box = Box() for rep in range(0, repeat): log.info(f"Step {rep} of {repeat - 1}") ################################ ##### Taking a boxed image ##### ################################ box.run(params) # saves temp.fits boxed image data = fits.getdata(temp_fits) ############################### ##### Fitting a 2d Moffat ##### ############################### fitted = fit_star(data, model="moffat") ############################## ##### Filling the arrays ##### ############################## m2 = foc.position fwhm = fitted.fwhm * pixscale * binning m2_arr = np.append(m2_arr, m2) fwhm_arr = np.append(fwhm_arr, fwhm) y, x = np.indices(data.shape) self.output = { "focus": { "m2": m2_arr.tolist(), "fwhm": fwhm_arr.tolist(), }, # "data": data.tolist(), # "fit": fitted(x,y).tolist(), # "residuals": np.round( data - fitted(x,y) , 1).tolist(), } # log.debug(self.output) # log.info(f"Found: focus={m2}µm, FWHM={fwhm}'' ") # opening all the time and not at begginning just for safety with open(file_path, "a") as file: msg = f"{rep:>3} {m2:>10} {fwhm:>10} " file.write(msg + "\n") log.info("Writing: " + msg) ###################### ##### Moving M2 ##### ###################### foc.position += step log.warning(f"Moving focus py {step}µm, to {foc.position}µm") sleep(0.3) ############################## ##### Showing the result ##### ############################## log.info(f"focus={m2_arr}") log.info(f"fwhm={fwhm_arr}") gp.plot((m2_arr, fwhm_arr), unset="grid", _with="linespoints", terminal='dumb 90 30', xlabel="x=focus [µm], y=fwhm ['']") ################################# ##### Back to initial focus ##### ################################# log.info("Setting back original focus") foc.position = original_foc