from collections import OrderedDict
import numpy as np
from astropy import units as u
from ..utils import real_colname, quantify
from .radiometry_utils import combine_emissions, combine_throughputs, \
combine_tables, add_surface_to_table, add_surface_to_dict, \
make_surface_from_row
[docs]
class RadiometryTable:
def __init__(self, tables=(), **kwargs):
self.meta = {"area": None}
self.meta.update(kwargs)
self.table = None
self.surfaces = OrderedDict({})
if len(tables) > 0:
self.add_surface_list(tables)
[docs]
def add_surface_list(self, surface_list, prepend=False):
self.table = combine_tables(surface_list, self.table, prepend=prepend)
r_name = real_colname("name", self.table.colnames)
for row in self.table:
if row[r_name] not in self.surfaces:
surf = make_surface_from_row(row)
self.add_surface(surf, row[r_name], position=-1,
add_to_table=False)
[docs]
def add_surface(self, surface, name, position=-1, add_to_table=True):
if self.table is None:
raise ValueError("Cannot add surface without <self>.table template."
"Please add an empty table to define column names")
if position < 0:
position += len(self.table) + 1
self.surfaces = add_surface_to_dict(self.surfaces, surface,
name, position)
if add_to_table:
self.table = add_surface_to_table(self.table, surface,
name, position)
[docs]
def get_throughput(self, start=0, end=None, rows=None):
if self.table is None:
return None
if end is None:
end = len(self.table)
elif end < 0:
end += len(self.table)
if rows is None:
rows = np.arange(start, end)
return combine_throughputs(self.table, self.surfaces, rows)
[docs]
def get_emission(self, etendue, start=0, end=None, rows=None,
use_area=False):
if self.table is None:
return None
if end is None:
end = len(self.table)
elif end < 0:
end += len(self.table)
if rows is None:
rows = np.arange(start, end)
return combine_emissions(self.table, self.surfaces, rows, etendue,
use_area)
@property
def emission(self):
if "etendue" not in self.meta:
raise ValueError("self.meta[\"etendue\"] must be set")
etendue = quantify(self.meta["etendue"], "m2 arcsec2")
return self.get_emission(etendue)
@property
def throughput(self):
return self.get_throughput()
[docs]
def plot(self, what="all", rows=None):
raise NotImplementedError()
def __getitem__(self, item):
return self.surfaces[item]
def __repr__(self):
return f"{self.__class__.__name__}({self.table!r}, **{self.meta})"