use serde::Serialize;
use skyangle::SkyAngle;
use super::Field;
use crate::{Observer, ObservingModes, Photometry};
#[derive(Debug, Clone, Serialize)]
pub enum FieldOfView {
PixelScale(usize),
PixelScaleAt(usize, String),
SkyAngle(SkyAngle<f64>),
}
impl From<SkyAngle<f64>> for FieldOfView {
fn from(alpha: SkyAngle<f64>) -> Self {
FieldOfView::SkyAngle(alpha)
}
}
impl From<usize> for FieldOfView {
fn from(n: usize) -> Self {
FieldOfView::PixelScale(n)
}
}
impl<T: Observer, M: ObservingModes> From<&Field<T, M>> for FieldOfView {
fn from(field: &Field<T, M>) -> Self {
FieldOfView::SkyAngle(SkyAngle::Radian(field.field_of_view()))
}
}
impl FieldOfView {
pub(super) fn get<T: Observer, M: ObservingModes>(&self, field: &Field<T, M>) -> f64 {
match self {
FieldOfView::PixelScale(n) => field.resolution() * *n as f64,
FieldOfView::PixelScaleAt(n, band) => {
let photometry: Photometry = band.into();
field.pixel_scale.get(&field.observer, &photometry) * *n as f64
}
FieldOfView::SkyAngle(val) => val.to_radians(),
}
}
pub(super) fn to_pixelscale_ratio<T: Observer, M: ObservingModes>(
&self,
field: &Field<T, M>,
) -> f64 {
match self {
FieldOfView::PixelScale(n) => *n as f64,
FieldOfView::PixelScaleAt(..) => self.get(field) / field.resolution(),
FieldOfView::SkyAngle(val) => val.to_radians() / field.resolution(),
}
}
}