예제 #1
0
    def write_to_fits(self, outfil, clobber=True, add_wave=False):

        """ Write to a FITS file
        Should generate a separate code to make a Binary FITS table format

        Parameters
        ----------
        outfil: String
          Name of the FITS file
        clobber: bool (True)
          Clobber existing file?
        add_wave: bool (False)
          Force writing of wavelength array
        """
        # TODO
        #  1. Add unit support for wavelength arrays

        from specutils.wcs.specwcs import Spectrum1DPolynomialWCS, Spectrum1DLookupWCS
        from specutils.io import write_fits as sui_wf

        prihdu = sui_wf._make_hdu(self.data)  # Not for binary table format
        prihdu.name = "FLUX"

        hdu = fits.HDUList([prihdu])

        # Type
        if type(self.wcs) is Spectrum1DPolynomialWCS:  # CRVAL1, etc. WCS
            # WCS
            wcs = self.wcs
            wcs.write_fits_header(prihdu.header)
            # Error array?
            if self.sig is not None:
                sighdu = fits.ImageHDU(self.sig)
                sighdu.name = "ERROR"
                hdu.append(sighdu)
                #
            if add_wave:
                wvhdu = fits.ImageHDU(self.dispersion.value)
                wvhdu.name = "WAVELENGTH"
                hdu.append(wvhdu)

        elif type(self.wcs) is Spectrum1DLookupWCS:
            # Wavelengths as an array (without units for now)
            # Add sig, wavelength to HDU
            if self.sig is not None:
                sighdu = fits.ImageHDU(self.sig)
                sighdu.name = "ERROR"
                hdu.append(sighdu)
            wvhdu = fits.ImageHDU(self.dispersion.value)
            wvhdu.name = "WAVELENGTH"
            hdu.append(wvhdu)
        else:
            raise ValueError("write_to_fits: Not ready for this type of spectrum wavelengths")

        if hasattr(self, "co") and self.co is not None:
            cohdu = fits.ImageHDU(self.co)
            cohdu.name = "CONTINUUM"
            hdu.append(cohdu)

        # Deal with header
        if hasattr(self, "head"):
            hdukeys = prihdu.header.keys()
            # Append ones to avoid
            hdukeys = hdukeys + ["BUNIT", "COMMENT", "", "NAXIS2", "HISTORY"]
            for key in self.head.keys():
                # Use new ones
                if key in hdukeys:
                    continue
                # Update unused ones
                try:
                    prihdu.header[key] = self.head[key]
                except ValueError:
                    raise ValueError("l.spectra.utils: Bad header key card")
            # History
            if "HISTORY" in self.head.keys():
                # Strip \n
                tmp = str(self.head["HISTORY"]).replace("\n", " ")
                try:
                    prihdu.header.add_history(str(tmp))
                except ValueError:
                    import pdb

                    pdb.set_trace()

        if self.meta is not None and len(self.meta) > 0:
            d = liu.jsonify_dict(self.meta)
            prihdu.header["METADATA"] = json.dumps(d)

        hdu.writeto(outfil, clobber=clobber)
        print("Wrote spectrum to {:s}".format(outfil))
예제 #2
0
    def write_to_fits(self, outfil, clobber=True, add_wave=False):
        ''' Write to a FITS file.

        Note that this does not generate a binary FITS table format.

        Parameters
        ----------
        outfil : str
          Name of the FITS file
        clobber : bool (True)
          Clobber existing file?
        add_wave : bool (False)
          Force writing of wavelengths as array, instead of using FITS
          header keywords to specify a wcs.
        '''
        # TODO
        #  1. Add unit support for wavelength arrays

        from specutils.wcs.specwcs import Spectrum1DPolynomialWCS, Spectrum1DLookupWCS
        from specutils.io import write_fits as sui_wf
        prihdu = sui_wf._make_hdu(self.data)  # Not for binary table format
        prihdu.name = 'FLUX'

        hdu = fits.HDUList([prihdu])

        # Type
        if type(self.wcs) is Spectrum1DPolynomialWCS:  # CRVAL1, etc. WCS
            # WCS
            wcs = self.wcs
            wcs.write_fits_header(prihdu.header)
            # Error array?
            if self.sig is not None:
                sighdu = fits.ImageHDU(self.sig)
                sighdu.name = 'ERROR'
                hdu.append(sighdu)
                #
            if add_wave:
                wvhdu = fits.ImageHDU(self.wavelength.value)
                wvhdu.name = 'WAVELENGTH'
                hdu.append(wvhdu)

        elif type(self.wcs) is Spectrum1DLookupWCS:
            # Wavelengths as an array (without units for now)
            # Add sig, wavelength to HDU
            if self.sig is not None:
                sighdu = fits.ImageHDU(self.sig)
                sighdu.name = 'ERROR'
                hdu.append(sighdu)
            wvhdu = fits.ImageHDU(self.wavelength.value)
            wvhdu.name = 'WAVELENGTH'
            hdu.append(wvhdu)
        else:
            raise ValueError(
                'write_to_fits: Not ready for this for wavelength WCS')

        if hasattr(self, 'co') and self.co is not None:
            cohdu = fits.ImageHDU(self.co)
            cohdu.name = 'CONTINUUM'
            hdu.append(cohdu)

        # Deal with header
        if hasattr(self, 'head'):
            hdukeys = list(prihdu.header.keys())
            # Append ones to avoid
            hdukeys = hdukeys + ['BUNIT', 'COMMENT', '', 'NAXIS2', 'HISTORY']
            for key in self.head.keys():
                # Use new ones
                if key in hdukeys:
                    continue
                # Update unused ones
                try:
                    prihdu.header[key] = self.head[key]
                except ValueError:
                    raise ValueError('l.spectra.utils: Bad header key card')
            # History
            if 'HISTORY' in self.head.keys():
                # Strip \n
                tmp = str(self.head['HISTORY']).replace('\n', ' ')
                try:
                    prihdu.header.add_history(str(tmp))
                except ValueError:
                    import pdb
                    pdb.set_trace()

        if self.meta is not None and len(self.meta) > 0:
            d = liu.jsonify(self.meta)
            prihdu.header['METADATA'] = json.dumps(d)

        hdu.writeto(outfil, clobber=clobber)
        print('Wrote spectrum to {:s}'.format(outfil))
예제 #3
0
파일: utils.py 프로젝트: mneeleman/xastropy
    def write_to_fits(self, outfil, clobber=True, add_wave=False):
        ''' Write to a FITS file
        Should generate a separate code to make a Binary FITS table format

        Parameters
        ----------
        outfil: String
          Name of the FITS file
        clobber: bool (True)
          Clobber existing file?
        add_wave: bool (False)
          Force writing of wavelength array
        '''
        # TODO
        #  1. Add unit support for wavelength arrays

        from specutils.io import write_fits as sui_wf
        prihdu = sui_wf._make_hdu(self.data)  # Not for binary table format
        prihdu.name = 'FLUX'
        multi = 0 #  Multi-extension?

        # Type
        if type(self.wcs) is Spectrum1DPolynomialWCS:  # CRVAL1, etc. WCS
            # WCS
            wcs = self.wcs
            wcs.write_fits_header(prihdu.header)
            # Error array?
            if self.sig is not None:
                sighdu = fits.ImageHDU(self.sig)
                sighdu.name='ERROR'
                # 
                if add_wave:
                    wvhdu = fits.ImageHDU(self.dispersion.value)
                    wvhdu.name = 'WAVELENGTH'
                    hdu = fits.HDUList([prihdu, sighdu, wvhdu])
                else:
                    hdu = fits.HDUList([prihdu, sighdu])
                multi=1
            else:
                hdu = prihdu

        elif type(self.wcs) is Spectrum1DLookupWCS: # Wavelengths as an array (without units for now)
            # Add sig, wavelength to HDU
            sighdu = fits.ImageHDU(self.sig)
            sighdu.name='ERROR'
            wvhdu = fits.ImageHDU(self.dispersion.value)
            wvhdu.name = 'WAVELENGTH'
            hdu = fits.HDUList([prihdu, sighdu, wvhdu])
            multi=1
        else:
            raise ValueError('write_to_fits: Not ready for this type of spectrum wavelengths')

        # Deal with header
        if hasattr(self,'head'):
            hdukeys = prihdu.header.keys()
            # Append ones to avoid
            hdukeys = hdukeys +ZZ ['BUNIT','COMMENT','', 'NAXIS2', 'HISTORY']
            for key in self.head.keys():
                # Use new ones
                if key in hdukeys:
                    continue
                # Update unused ones
                try:
                    prihdu.header[key] = self.head[key]
                except ValueError:
                    xdb.set_trace()
            # History
            if 'HISTORY' in self.head.keys():
                prihdu.header.add_history(str(self.head['HISTORY']))

        # Write
        hdu.writeto(outfil, clobber=clobber)
        print('Wrote spectrum to {:s}'.format(outfil))
예제 #4
0
    def write_to_fits(self, outfil, clobber=True, add_wave=False):
        ''' Write to a FITS file
        Should generate a separate code to make a Binary FITS table format

        Parameters
        ----------
        outfil: String
          Name of the FITS file
        clobber: bool (True)
          Clobber existing file?
        add_wave: bool (False)
          Force writing of wavelength array
        '''
        # TODO
        #  1. Add unit support for wavelength arrays

        from specutils.io import write_fits as sui_wf
        prihdu = sui_wf._make_hdu(self.data)  # Not for binary table format
        prihdu.name = 'FLUX'
        multi = 0  #  Multi-extension?

        # Type
        if type(self.wcs) is Spectrum1DPolynomialWCS:  # CRVAL1, etc. WCS
            # WCS
            wcs = self.wcs
            wcs.write_fits_header(prihdu.header)
            # Error array?
            if self.sig is not None:
                sighdu = fits.ImageHDU(self.sig)
                sighdu.name = 'ERROR'
                #
                if add_wave:
                    wvhdu = fits.ImageHDU(self.dispersion.value)
                    wvhdu.name = 'WAVELENGTH'
                    hdu = fits.HDUList([prihdu, sighdu, wvhdu])
                else:
                    hdu = fits.HDUList([prihdu, sighdu])
                multi = 1
            else:
                hdu = prihdu

        elif type(
                self.wcs
        ) is Spectrum1DLookupWCS:  # Wavelengths as an array (without units for now)
            # Add sig, wavelength to HDU
            sighdu = fits.ImageHDU(self.sig)
            sighdu.name = 'ERROR'
            wvhdu = fits.ImageHDU(self.dispersion.value)
            wvhdu.name = 'WAVELENGTH'
            hdu = fits.HDUList([prihdu, sighdu, wvhdu])
            multi = 1
        else:
            raise ValueError(
                'write_to_fits: Not ready for this type of spectrum wavelengths'
            )

        # Deal with header
        if hasattr(self, 'head'):
            hdukeys = prihdu.header.keys()
            # Append ones to avoid
            hdukeys = hdukeys + ZZ['BUNIT', 'COMMENT', '', 'NAXIS2', 'HISTORY']
            for key in self.head.keys():
                # Use new ones
                if key in hdukeys:
                    continue
                # Update unused ones
                try:
                    prihdu.header[key] = self.head[key]
                except ValueError:
                    xdb.set_trace()
            # History
            if 'HISTORY' in self.head.keys():
                prihdu.header.add_history(str(self.head['HISTORY']))

        # Write
        hdu.writeto(outfil, clobber=clobber)
        print('Wrote spectrum to {:s}'.format(outfil))