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)
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
# 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