Source code for autowisp.tests.fits_test_case

"""Define a class to compare FITS files generated by AutoWISP."""

from os import path

import numpy

from autowisp.fits_utilities import read_image_components
from autowisp.tests import AutoWISPTestCase


[docs] class FITSTestCase(AutoWISPTestCase): """Add assert for comparing AutoWISP generated FITS files."""
[docs] def assert_fits_match(self, fname1, fname2): """Check if two headers match.""" fits_components = [ dict( zip( ["image", "error", "mask", "header"], read_image_components(fits_fname), ) ) for fits_fname in [fname1, fname2] ] self.assertTrue( set(fits_components[0]["header"].keys()) - set(["EXTEND"]) == set(fits_components[1]["header"].keys()) - set(["EXTEND"]), f"Headers of {fname1} and {fname2} do not have the same keys!", ) original_files = [set(), set()] for key, value in fits_components[0]["header"].items(): if key.strip() == "" or key in ["CALGITID", "COMMENT", "EXTEND"]: continue if key in [f"M{tp.upper()}FNM" for tp in ["bias", "dark", "flat"]]: self.assertEqual( path.basename(fits_components[1]["header"][key]), path.basename(value), f"Master {key[1:-3].lower()} does not match between " f"{fname1} and {fname2}.", ) elif key.startswith("ORIGF"): original_files[0].add(path.basename(value)) original_files[1].add( path.basename(fits_components[1]["header"][key]) ) else: self.assertEqual( fits_components[1]["header"][key], value, f"Value for key {key!r} does not match between {fname1} and" f" {fname2}.", ) self.assertEqual( *original_files, f"Original input files in {fname1} and {fname2} do not match!", ) for component in ["image", "error"]: self.assertTrue( numpy.isclose( fits_components[0][component], fits_components[1][component], rtol=5e-4, atol=1e-4 * ( numpy.mean( numpy.absolute(fits_components[0][component]) ) + numpy.mean( numpy.absolute(fits_components[1][component]) ) ), ).all(), f"{component.title()} pixels in {fname1} do not match " f"{component} pixels in {fname2}!", ) self.assertTrue( (fits_components[0]["mask"] == fits_components[1]["mask"]).all(), f"Pixel mask in {fname1} do not match pixel mask in {fname2}!", )