Source code for sourcefinder.accessors

"""
Data accessors.

These can be used to populate ImageData objects based on some data source
(FITS file, array in memory... etc.).
"""

import os

import astropy.io.fits as pyfits
from astropy.io.fits.hdu.hdulist import HDUList

from sourcefinder.accessors import detection
from sourcefinder.accessors.fitsimageblob import FitsImageBlob
from sourcefinder.accessors.lofarfitsimage import LofarFitsImage
from sourcefinder.config import Conf, ImgConf, ExportSettings
from sourcefinder.image import ImageData


[docs] def sourcefinder_image_from_accessor( image, conf: Conf = Conf(image=ImgConf(), export=ExportSettings()), ): """Create a sourcefinder.image.ImageData object from an image 'accessor'. This function initializes a `sourcefinder.image.ImageData` object using the data, beam, and WCS information provided by the given image accessor. Parameters ---------- image : DataAccessor FITS/AIPS/HDF5 image available through an accessor. conf : Conf, default: Conf(image=ImgConf(), export=ExportSettings()) Configuration options for source finding. This includes settings related to image processing (e.g., background and rms noise estimation, thresholds) as well as export options (e.g., source parameters and output maps). Returns ------- ImageData A sourcefinder.image.ImageData object. """ image = ImageData(image.data, image.beam, image.wcs, conf=conf) return image
[docs] def writefits(data, filename, header={}): """Dump a NumPy array to a FITS file. This function writes a given NumPy array to a FITS file, optionally including header information. The header can be provided as a dictionary containing key-value pairs to be added to the FITS file's metadata. Parameters ---------- data : numpy.ndarray The NumPy array to be written to the FITS file. filename : Path or str The path to the output FITS file. header : dict, default: {} A dictionary containing key-value pairs for the FITS header. Raises ------ OSError If the file cannot be written due to permission issues or other errors. Notes ----- The data is transposed before writing to match the transpose from `fitsimage.FitsImage.read_data()`. This is necessary to ensure that the data is stored in the correct orientation in the FITS file. """ if header.__class__.__name__ == "Header": pyfits.writeto(filename, data.transpose(), header) else: hdu = pyfits.PrimaryHDU(data.transpose()) for key in header.keys(): hdu.header.update(key, header[key]) hdu.writeto(filename)
[docs] def open(path, *args, **kwargs): """Returns an accessor object (if available) for the file or directory 'path'. This function attempts to find an appropriate accessor for the given file or directory path. Accessors are tried in order from most specific to least specific. For example, an accessor providing `LofarAccessor` is preferred over one providing `DataAccessor`, but the latter will be used if no better match is found. Parameters ---------- path : str or HDUList The file path or HDUList object to be processed. *args : tuple Additional positional arguments to pass to the accessor constructor. **kwargs : dict Additional keyword arguments to pass to the accessor constructor. Returns ------- DataAccessor or subclass An accessor object for the given file or directory. Raises ------ OSError If the file does not exist, cannot be read, or no matching accessor class is found. Exception If the `path` parameter is neither a string nor an `HDUList`. """ if type(path) == HDUList: return FitsImageBlob(path, *args, **kwargs) elif type(path) == str: if not os.access(path, os.F_OK): raise OSError("%s does not exist!" % path) if not os.access(path, os.R_OK): raise OSError("Don't have permission to read %s!" % path) Accessor = detection.detect(path) if not Accessor: raise OSError("no accessor found for %s" % path) return Accessor(path, *args, **kwargs) else: raise Exception("image should be path or HDUlist, got " + str(path))