Source code for scopesim.optics.monochromatic_trace_curve
import numpy as np
from ..base_classes import PoorMansHeader
[docs]class MonochromeTraceCurve:
"""
Contains coordinates along a monochromatic section of a spectral trace.
Used to generate detector plane position WCS info for FOVs in spectral mode
"""
def __init__(self, x, y, s, wave_min, wave_max, **kwargs):
self.wave_min = wave_min
self.wave_max = wave_max
self.x = x
self.y = y
self.s = s
self.meta = {"rotation": 0,
"shear": 0}
self.meta.update(kwargs)
self._header = None
@property
def header(self):
if "pixel_size" in self.meta:
hdr = self.get_header(self.meta["pixel_size"])
else:
hdr = self._header
return hdr
[docs] def get_header(self, pixel_size):
dx = self.x[-1] - self.x[0] # [mm]
dy = self.y[-1] - self.y[0] # [mm]
ds = self.s[-1] - self.s[0] # [mm]
len_mm = (dx**2 + dy**2)**0.5 # [mm]
arcsec_per_mm = ds / len_mm # [arcsec / mm]
x_sign = 1 if dx * ds >= 0 else -1
y_sign = 1 if dy * ds >= 0 else -1
hdr_dict = {"NAXIS": 2,
"NAXIS1": int(round(len_mm / pixel_size)),
"NAXIS2": 0,
"CTYPE1D": "LINEAR",
"CTYPE2D": "LINEAR",
"CUNIT1D": "mm",
"CUNIT2D": "mm",
"CDELT1D": pixel_size * x_sign, # [mm / pix]
"CDELT2D": pixel_size * y_sign, # [mm / pix]
"CRVAL1D": self.x[0],
"CRVAL2D": self.y[0],
"CRPIX1D": 0,
"CRPIX2D": 0,
}
rad2deg = np.pi / 180.
c = np.cos(self.meta["rotation"] * rad2deg)
s = np.sin(self.meta["rotation"] * rad2deg)
t = np.tan(self.meta["shear"] * rad2deg)
pc_dict = {"PC1_1D": c, "PC1_2D": s + c*t,
"PC2_1D": -s, "PC2_2D": c + s*t}
hdr_dict.update(pc_dict)
# ..todo: deal with these aspects
# curvature
# self._header = fits.Header(hdr_dict)
self._header = PoorMansHeader(hdr_dict)
self._header["WAVE_MIN"] = self.wave_min
self._header["WAVE_MID"] = 0.5 * (self.wave_min + self.wave_max)
self._header["WAVE_MAX"] = self.wave_max
self._header["PLATESCL"] = (arcsec_per_mm,
"[arcsec mm-1] Along slit")
self._header["ROTANGD"] = (self.meta["rotation"] * rad2deg,
"[deg] w.r.t. focal plane")
self._header["SKEWANGD"] = (self.meta["shear"] * rad2deg,
"[deg] w.r.t. trace trajectory")
return self._header