The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#!perl
# Testing CFITSIO read/write of fits headers
use strict;
BEGIN {
eval "use Astro::FITS::CFITSIO qw / :longnames /; use Astro::FITS::CFITSIO qw/ :constants /;";
if ($@) {
plan skip_all => "Astro::FITS::CFITSIO module not available";
exit;
} else {
plan tests => 41;
}
}
# ----------------------------------------------------------------------------
# Copy the test data to a temporary location
BEGIN{ copy( File::Spec->catfile("t", "cfitsio.fit"),
File::Spec->catfile("t", "test.fit" ) )
or croak("Unable to copy test data file to temporary location"); };
# Delete the temporary copy of the test data
END{ unlink File::Spec->catfile("t", "test.fit" )
or croak("Unable to delete test data"); };
# ----------------------------------------------------------------------------
require_ok( "Astro::FITS::Header::CFITSIO" );
# Read from the __DATA__ block
my @cards = <DATA>;
chomp(@cards);
# Version test, need cfitsio library version > 2.1
ok( fits_get_version(my $version) > 2.1, "Check Astro::FITS::CFITSIO version number");
# get the path to the test data file
my $file = File::Spec->catfile("t", "test.fit");
# create a header
my $header = new Astro::FITS::Header::CFITSIO( File => $file );
# overwrite the header in memory with cards stored in __DATA__
# its a cheap and cheerful kludge and not the OO way to do it
$header->configure( Cards => \@cards );
# write our modified header out again
$header->writehdr( File => $file );
# open the header back up again reading directly from the file
my $compare = new Astro::FITS::Header::CFITSIO( File => $file );
# test the header against the raw data
for my $i (0 .. $#cards) {
my @items = $compare->item($i);
is( "$items[0]", $cards[$i], "Compare item $i");
}
exit;
__DATA__
SIMPLE = T / file does conform to FITS standard
BITPIX = -32 / number of bits per data pixel
NAXIS = 2 / number of data axes
NAXIS1 = 59 / length of data axis 1
NAXIS2 = 110 / length of data axis 2
EXTEND = T / FITS dataset may contain extensions
COMMENT FITS (Flexible Image Transport System) format defined in Astronomy and
COMMENT Astrophysics Supplement Series v44/p363, v44/p371, v73/p359, v73/p365.
COMMENT Contact the NASA Science Office of Standards and Technology for the
COMMENT FITS Definition document #100 and other FITS information.
CLOCK0 = -6.20000000000000018 / ALICE CLOCK0 voltage
CLOCK1 = -3 / ALICE CLOCK1 voltage
CLOCK2 = -7.5 / ALICE CLOCK2 voltage
CLOCK3 = -2.79999999999999982 / ALICE CLOCK3 voltage
CLOCK4 = -6 / ALICE CLOCK4 voltage
CLOCK5 = -2 / ALICE CLOCK5 voltage
CLOCK6 = -7.5 / ALICE CLOCK6 voltage
CRVAL1 = -0.03125 / Axis 1 reference value
CRPIX1 = 29.5 / Axis 1 pixel value
CTYPE1 = 'LINEAR ' / Quantity represented by axis 1
CRVAL2 = -0.03125 / Axis 2 reference value
CRPIX2 = 55.0 / Axis 2 pixel value
CTYPE2 = 'LINEAR ' / Quantity represented by axis 2
CD1_1 = 0.0625 / Axis rotation and scaling matrix
CD1_2 = 0.0 / Axis rotation and scaling matrix
CD2_1 = 0.0 / Axis rotation and scaling matrix
CD2_2 = 0.0625 / Axis rotation and scaling matrix
OBJECT = ' ' / Title of the dataset
DATE = '2000-12-12T20:28:35'/ file creation date (YYYY-MM-DDThh:mm:ss UTC)
ORIGIN = 'Starlink Project, U.K.'/ Origin of this FITS file
BSCALE = 1.0 / True_value = BSCALE * FITS_value + BZERO
BZERO = 0.0 / True_value = BSCALE * FITS_value + BZERO
HDUCLAS1= 'NDF ' / Starlink NDF (hierarchical n-dim format)
HDUCLAS2= 'DATA ' / Array component subclass
LINEAR = F / Linearisation disabled
FILTER = 'B1 ' / Combined filter name
FILTERS = 'B1 ' / Combined filter name
LAMP = 'off ' / Name of calibration lamp
END