Source code for utils.specutils_cos.extract_subspec
"""
.. module:: extract_subspec
:synopsis: Extracts a sub-spectrum from the provided COS spectrum object.
Modifies the COS spectrum object to replace that segment's spectrum with
the specified sub-spectrum.
.. moduleauthor:: Scott W. Fleming <fleming@stsci.edu>
"""
#--------------------
# Built-In Imports
#--------------------
from __future__ import absolute_import
from __future__ import print_function
import os
import sys
from builtins import str
#--------------------
# External Imports
#--------------------
import numpy
#--------------------
# Package Imports
#--------------------
from spec_plots.utils.specutils.specutilserror import SpecUtilsError
from spec_plots import __version__
#--------------------
#--------------------
[docs]
def extract_subspec(cos_spectrum, segment, min_wl=None, max_wl=None):
"""
Extracts a sub-spectrum of a COS segment's spectrum. If both min. and max.
wavelengths are specified, then it keeps the part of the spectrum within
those bounds. If only a min. or max. is specified, then those are treated
as lower or upper bounds, and the part of the spectrum redder/bluer than the
bound is retained.
:param cos_spectrum: COS spectrum as returned by READSPEC.
:type cos_spectrum: COSSpectrum
:param segment: The segment to do the extraction on.
:type segment: str
:param min_wl: The minimum wavlength value to keep. If None, then there
will be no lower bound.
:type min_wl: float
:param max_wl: The maximum wavelength value to keep. If None, then there
will be no upper bound.
:type max_wl: float
"""
if segment in cos_spectrum.segments:
if min_wl is not None and max_wl is not None:
where_within = numpy.where(
(cos_spectrum.segments[segment].wavelengths >= min_wl) &
(cos_spectrum.segments[segment].wavelengths <= max_wl))[0]
elif min_wl is not None and max_wl is None:
where_within = numpy.where(
(cos_spectrum.segments[segment].wavelengths >= min_wl))[0]
elif min_wl is None and max_wl is not None:
where_within = numpy.where(
(cos_spectrum.segments[segment].wavelengths <= max_wl))[0]
n_within = len(where_within)
if n_within > 0:
# Then we extract the subspectrum for this object by modifying the
# cos_spectrum object.
cos_spectrum.segments[segment].nelem = n_within
cos_spectrum.segments[segment].wavelengths = (
cos_spectrum.segments[segment].wavelengths[where_within])
cos_spectrum.segments[segment].fluxes = (
cos_spectrum.segments[segment].fluxes[where_within])
cos_spectrum.segments[segment].fluxerrs = (
cos_spectrum.segments[segment].fluxerrs[where_within])
cos_spectrum.segments[segment].dqs = (
cos_spectrum.segments[segment].dqs[where_within])
else:
print("*** WARNING in SPECUTILS_COS: Requested subspectrum does"
" not overlap with this segment's spectrum. No extraction"
" will be done.")
else:
raise SpecUtilsError("The segment where you want to perform the"
" subspectrum extraction is not present."
" Specified \"" + segment +
"\", available segments for this spectrum are: " +
', '.join(cos_spectrum.segments)+".")
#--------------------