# Path: sedfitter/utils/validator.py
# def validate_scalar(name, value, domain=None, physical_type=None):
# 
#     validate_physical_type(name, value, physical_type)
# 
#     if not physical_type:
#         if np.isscalar(value) or not np.isreal(value):
#             raise TypeError("{0} should be a scalar floating point value".format(name))
# 
#     if domain == 'positive':
#         if value < 0.:
#             raise ValueError("{0} should be positive".format(name))
#     elif domain == 'strictly-positive':
#         if value <= 0.:
#             raise ValueError("{0} should be strictly positive".format(name))
#     elif domain == 'negative':
#         if value > 0.:
#             raise ValueError("{0} should be negative".format(name))
#     elif domain == 'strictly-negative':
#         if value >= 0.:
#             raise ValueError("{0} should be strictly negative".format(name))
#     elif type(domain) in [tuple, list] and len(domain) == 2:
#         if value < domain[0] or value > domain[-1]:
#             raise ValueError("{0} should be in the range [{1}:{2}]".format(name, domain[0], domain[-1]))
# 
#     return value
# 
# def validate_array(name, value, domain=None, ndim=1, shape=None, physical_type=None):
# 
#     validate_physical_type(name, value, physical_type)
# 
#     # First convert to a Numpy array:
#     if type(value) in [list, tuple]:
#         value = np.array(value)
# 
#     # Check the value is an array with the right number of dimensions
#     if not isinstance(value, np.ndarray) or value.ndim != ndim:
#         if ndim == 1:
#             raise TypeError("{0} should be a 1-d sequence".format(name))
#         else:
#             raise TypeError("{0} should be a {1:d}-d array".format(name, ndim))
# 
#     # Check that the shape matches that expected
#     if shape is not None and value.shape != shape:
#         if ndim == 1:
#             raise ValueError("{0} has incorrect length (expected {1} but found {2})".format(name, shape[0], value.shape[0]))
#         else:
#             # On Windows, shapes can contain long integers, so we fix this to
#             # have consistent error messages across platforms.
#             expected_shape = tuple(int(x) for x in shape)
#             actual_shape = tuple(int(x) for x in value.shape)
#             raise ValueError("{0} has incorrect shape (expected {1} but found {2})".format(name, expected_shape, actual_shape))
# 
#     return value
# 
# Path: sedfitter/utils/io.py
# def read_table(file_name):
#     try:
#         return Table.read(file_name, format='fits', character_as_bytes=False)
#     except TypeError:  # older versions of Astropy
#         return Table.read(file_name, format='fits')


import numpy as np
from scipy.interpolate import interp1d
from astropy.logger import log
from astropy import units as u
from astropy.io import fits
from astropy.table import Table
from ..utils.validator import validate_scalar, validate_array
from ..utils.io import read_table
        from ..utils.misc import order_to_match

        Parameters
        ----------
        filename : str
            The name of the FITS file to read the convolved fluxes from
        """

        conv = cls()

        # Open the convolved flux FITS file
        convolved = fits.open(filename)

        keywords = convolved[0].header

        # Try and read in the wavelength of the filter
        if 'FILTWAV' in keywords:
            conv.central_wavelength = keywords['FILTWAV'] * u.micron
        else:
            conv.central_wavelength = None

        # Read in apertures, if present
        try:
            ta = read_table(convolved['APERTURES'])
            if ta['APERTURE'].unit is None:
                ta['APERTURE'].unit = u.au
            conv.apertures = ta['APERTURE'].data * ta['APERTURE'].unit
        except KeyError:
            pass

        # Create shortcuts to table

# Path: sedfitter/utils/validator.py
# def validate_scalar(name, value, domain=None, physical_type=None):
# 
#     validate_physical_type(name, value, physical_type)
# 
#     if not physical_type:
#         if np.isscalar(value) or not np.isreal(value):
#             raise TypeError("{0} should be a scalar floating point value".format(name))
# 
#     if domain == 'positive':
#         if value < 0.:
#             raise ValueError("{0} should be positive".format(name))
#     elif domain == 'strictly-positive':
#         if value <= 0.:
#             raise ValueError("{0} should be strictly positive".format(name))
#     elif domain == 'negative':
#         if value > 0.:
#             raise ValueError("{0} should be negative".format(name))
#     elif domain == 'strictly-negative':
#         if value >= 0.:
#             raise ValueError("{0} should be strictly negative".format(name))
#     elif type(domain) in [tuple, list] and len(domain) == 2:
#         if value < domain[0] or value > domain[-1]:
#             raise ValueError("{0} should be in the range [{1}:{2}]".format(name, domain[0], domain[-1]))
# 
#     return value
# 
# def validate_array(name, value, domain=None, ndim=1, shape=None, physical_type=None):
# 
#     validate_physical_type(name, value, physical_type)
# 
#     # First convert to a Numpy array:
#     if type(value) in [list, tuple]:
#         value = np.array(value)
# 
#     # Check the value is an array with the right number of dimensions
#     if not isinstance(value, np.ndarray) or value.ndim != ndim:
#         if ndim == 1:
#             raise TypeError("{0} should be a 1-d sequence".format(name))
#         else:
#             raise TypeError("{0} should be a {1:d}-d array".format(name, ndim))
# 
#     # Check that the shape matches that expected
#     if shape is not None and value.shape != shape:
#         if ndim == 1:
#             raise ValueError("{0} has incorrect length (expected {1} but found {2})".format(name, shape[0], value.shape[0]))
#         else:
#             # On Windows, shapes can contain long integers, so we fix this to
#             # have consistent error messages across platforms.
#             expected_shape = tuple(int(x) for x in shape)
#             actual_shape = tuple(int(x) for x in value.shape)
#             raise ValueError("{0} has incorrect shape (expected {1} but found {2})".format(name, expected_shape, actual_shape))
# 
#     return value
# 
# Path: sedfitter/utils/io.py
# def read_table(file_name):
#     try:
#         return Table.read(file_name, format='fits', character_as_bytes=False)
#     except TypeError:  # older versions of Astropy
#         return Table.read(file_name, format='fits')


# Path: sedfitter/convolved_fluxes/convolved_fluxes.py
import numpy as np
from scipy.interpolate import interp1d
from astropy.logger import log
from astropy import units as u
from astropy.io import fits
from astropy.table import Table
from ..utils.validator import validate_scalar, validate_array
from ..utils.io import read_table
        from ..utils.misc import order_to_match


        Parameters
        ----------
        filename : str
            The name of the FITS file to read the convolved fluxes from
        """

        conv = cls()

        # Open the convolved flux FITS file
        convolved = fits.open(filename)

        keywords = convolved[0].header

        # Try and read in the wavelength of the filter
        if 'FILTWAV' in keywords:
            conv.central_wavelength = keywords['FILTWAV'] * u.micron
        else:
            conv.central_wavelength = None

        # Read in apertures, if present
        try:
            ta = read_table(convolved['APERTURES'])
            if ta['APERTURE'].unit is None:
                ta['APERTURE'].unit = u.au
            conv.apertures = ta['APERTURE'].data * ta['APERTURE'].unit
        except KeyError:
            pass

        # Create shortcuts to table

        tc = read_table(convolved['CONVOLVED FLUXES'])