Пример #1
0
def read_fits_wcs_linear1d(wcs_info, dispersion_unit=None, spectral_axis=0):
    """Read very a very simple 1D WCS mainly comprising of CRVAL, CRPIX, ...
    from a FITS WCS Information container

    Parameters
    ----------

    fits_wcs_information : ~specutils.io.read_fits.FITSWCSSpectrum
        object compiling WCS information to be used in these readers

    .. TODO: Examine this further.

    """

    # for the 1D reader setting the spectral_axis to anything else than 0 seems
    # to be strange;
    # actually, it's perfectly reasonable IF you want to extract
    # information from, say, a data cube and you're only interested in the
    # spectral dimension.  This tool can easily be used for that purpose.

    dispersion_unit = dispersion_unit

    dispersion_delta = None
    if wcs_info.transform_matrix is not None:
        dispersion_delta = wcs_info.transform_matrix[spectral_axis,
                                                     spectral_axis]

    if wcs_info.affine_transform_dict['cdelt'][spectral_axis] is not None:
        #checking that both cd1_1 and cdelt1 are either the same or
        # one of them non-existent
        if dispersion_delta is not None:
            np.testing.assert_almost_equal(
                dispersion_delta,
                wcs_info.affine_transform_dict['cdelt'][spectral_axis])
        dispersion_delta = wcs_info.affine_transform_dict['cdelt'][
            spectral_axis]

    if dispersion_delta is None:
        raise FITSWCSSpectrum1DError

    if wcs_info.affine_transform_dict['crval'][spectral_axis] is None:
        raise FITSWCSSpectrum1DError
    else:
        dispersion_start = wcs_info.affine_transform_dict['crval'][
            spectral_axis]

    pixel_offset = wcs_info.affine_transform_dict['crpix'][spectral_axis] or 1
    pixel_offset -= 1

    dispersion_unit = wcs_info.units[spectral_axis] or dispersion_unit

    if None in [dispersion_start, dispersion_delta, pixel_offset]:
        raise FITSWCSSpectrum1DError
    dispersion_start += -pixel_offset * dispersion_delta
    return specwcs.Spectrum1DPolynomialWCS(degree=1,
                                           unit=dispersion_unit,
                                           c0=dispersion_start,
                                           c1=dispersion_delta)
Пример #2
0
def multispec_wcs_reader(wcs_info, dispersion_unit=None):
    """Extracting multispec information out of WAT header keywords and
    building WCS with it

    Parameters
    ----------

    dispersion_unit : astropy.unit.Unit, optional
        specify a unit for the dispersion if none exists or overwrite,
        default=None
    """

    assert wcs_info.global_wcs_attributes['system'] == 'multispec'
    assert wcs_info.wcs_attributes[1]['wtype'] == 'multispec'

    if dispersion_unit is None:
        dispersion_unit = wcs_info.wcs_attributes[0]['units']

    multispec_dict = _parse_multispec_dict(wcs_info.wcs_attributes[1])
    wcs_dict = OrderedDict()
    for spec_key in multispec_dict:
        single_spec_dict = multispec_dict[spec_key]
        if single_spec_dict['dispersion_type'] == 1:
            #log-linear dispersion
            log = True
        else:
            log = False

        if single_spec_dict['dispersion_type'] in [0, 1]:
            #linear or log-linear dispersion
            dispersion_wcs = specwcs.Spectrum1DPolynomialWCS(
                degree=1,
                c0=single_spec_dict["dispersion0"],
                c1=single_spec_dict["average_dispersion_delta"])

        else:
            # single_spec_dict['dispersion_type'] == 2
            dispersion_wcs = specwcs.WeightedCombinationWCS()
            for function_dict in single_spec_dict["functions"]:
                if function_dict['type'] == 'legendre':
                    ##### @embray can you figure out if that's the only way to
                    ##  instantiate a polynomial (with c0=xx, c1=xx, ...)?

                    coefficients = dict([
                        ('c{:d}'.format(i), function_dict['coefficients'][i])
                        for i in range(function_dict['order'])
                    ])

                    wcs = specwcs.Spectrum1DIRAFLegendreWCS(
                        function_dict['order'], function_dict['pmin'],
                        function_dict['pmax'], **coefficients)

                elif function_dict['type'] == 'chebyshev':
                    coefficients = dict([
                        ('c{:d}'.format(i), function_dict['coefficients'][i])
                        for i in range(function_dict['order'])
                    ])

                    wcs = specwcs.Spectrum1DIRAFChebyshevWCS(
                        function_dict['order'], function_dict['pmin'],
                        function_dict['pmax'], **coefficients)

                elif function_dict['type'] in ['linearspline', 'cubicspline']:
                    if function_dict['type'] == 'linearspline':
                        degree = 1
                    else:
                        degree = 3
                    n_pieces = function_dict['npieces']
                    pmin = function_dict['pmin']
                    pmax = function_dict['pmax']
                    y = [
                        function_dict['coefficients'][i]
                        for i in range(n_pieces + degree)
                    ]
                    wcs = specwcs.Spectrum1DIRAFBSplineWCS(
                        degree, n_pieces, y, pmin, pmax)
                else:
                    raise NotImplementedError
                dispersion_wcs.add_WCS(
                    wcs,
                    weight=function_dict["weight"],
                    zero_point_offset=function_dict["zero_point_offset"])

        composite_wcs = specwcs.MultispecIRAFCompositeWCS(
            dispersion_wcs,
            single_spec_dict["no_valid_pixels"],
            z=single_spec_dict["doppler_factor"],
            log=log,
            aperture=single_spec_dict["aperture"],
            beam=single_spec_dict["beam"],
            aperture_low=single_spec_dict["aperture_low"],
            aperture_high=single_spec_dict["aperture_high"],
            unit=dispersion_unit)
        wcs_dict[spec_key] = composite_wcs
    return wcs_dict
Пример #3
0
# containers relevant for plotting
plt_tup = ()
spectra = []
fits_files = [
    'fits/AUG_TELL_K_HIP93691NS.fits', 'fits/AUG_TELL_K_HIP79881NS.fits',
    'fits/AUG_OBJ_K.fits', 'fits/AUG_OBJ_K_clean_HIP79881.fits',
    'fits/AUG_OBJ_K_clean_HIP93691.fits'
]
figure = plt.figure(1, figsize=(14, 8))

# put all Spectrum1D objects created from fits files into container
for raw_file in fits_files:
    fits_file = fits.open(raw_file)[0]
    fits_wcs = specwcs.Spectrum1DPolynomialWCS(degree=1,
                                               unit='angstrom',
                                               c0=fits_file.header['CRVAL1'],
                                               c1=fits_file.header['CD1_1'])
    fits_spec = Spectrum1D(flux=fits_file.data, wcs=fits_wcs)
    spectra.append((fits_spec, raw_file))

# get the value of the minimum mean (used for scaling)
min_mean = find_min_mean([x[0] for x in spectra])
i = 0

# plot each spectrum in the "spectra" container
for spectrum in spectra:

    fits_spec = spectrum[0]
    fits_name = spectrum[1]

    # before plotting, calculate spectrum scale relative to spectrum with smallest avg flux