1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
# -*-perl-*-
# Test merge header functionality
# Author: Tim Jenness <t.jenness@jach.hawaii.edu>
# Copyright (C) 2005 Particle Physics and Astronomy Research Council.
# All Rights Reserved.
use strict;
use warnings;
use Test::More tests => 39;
require_ok("Astro::FITS::Header");
# Read all the fits headers
my @all = <DATA>;
chomp(@all);
my @fits;
my $i = 0;
my $start = 0;
while ($i <= $#all) {
if ($all[$i] eq "=cut" || $i == $#all) {
my $end = ( $i == $#all ? $i : $i - 1);
push(@fits, new Astro::FITS::Header( Cards => [ @all[$start..$end]]));
$start = $i + 1;
}
$i++;
}
# merge in list and then in scalar context
my ($merged, @different) = $fits[0]->merge_primary( @fits[1..$#fits]);
my $scalar = $fits[0]->merge_primary( @fits[1..$#fits] );
is($merged->sizeof, 21, "Number of cards in merged header");
is(@different, 3, "Number of diff headers");
is($merged->itembyname("RA")->value+0, 5, "RA is in merged header");
is($scalar->sizeof, 21, "Number of cards in merged header");
is($scalar->itembyname("RA")->value+0, 5, "RA is in merged header");
ok($different[0]->itembyname("UNIQUE"), "UNIQUE was not merged");
$different[0]->removebyname( "UNIQUE" );
ok($different[0]->itembyname("COMMON"), "COMMON was not merged");
$different[0]->removebyname( "COMMON" );
ok($different[1]->itembyname("COMMON"), "COMMON was not merged");
$different[1]->removebyname( "COMMON" );
for my $i (0..$#different) {
is($different[$i]->sizeof, 1, "Number of diffs in header $i");
is($different[$i]->itembyname("RUN")->value, ($i+1), "Run number in diff");
ok($different[$i]->itembyname("DATE-OBS"), "DATE-OBS is not merged");
}
# Now do the merge but merge unique keys to the merged header
($merged, @different) = $fits[0]->merge_primary( {merge_unique=>1},
@fits[1..$#fits]);
#print "Merged: $merged\n";
is($merged->sizeof, 23, "Number of cards in merged header");
is(@different, 3, "Number of diff headers");
is($merged->itembyname("RA")->value+0, 5, "RA is in merged header");
ok($merged->itembyname("UNIQUE"), "UNIQUE was now merged");
ok(!$merged->itembyname("DATE-OBS"), "DATE-OBS was not merged");
# COMMON should be merged since it is common to 2 of the 3
# but identical in those 2
ok($merged->itembyname("COMMON"), "COMMON was now merged");
for my $i (0..$#different) {
is($different[$i]->sizeof, 1, "Number of diffs in header $i");
is($different[$i]->itembyname("RUN")->value, ($i+1), "Run number in diff");
ok($different[$i]->itembyname("DATE-OBS"), "DATE-OBS is not merged");
}
# Now clone the merge and test the force_return flag
my $m2 = new Astro::FITS::Header( Cards => [$merged->cards] );
my ($m3, @diff3) = $merged->merge_primary( { force_return_diffs => 0}, $m2);
is(@diff3, 0, "Empty diff");
($m3, @diff3) = $merged->merge_primary( { force_return_diffs => 1}, $m2);
is(@diff3, 2, "Forced non-Empty diff");
# Merge itself in list and scalar context
my ($m4) = $merged->merge_primary();
is("$m4", "$merged", "Full header comparison");
is($m4->sizeof, $merged->sizeof, "Get back what we started with");
$m4 = $merged->merge_primary();
is("$m4", "$merged", "Full header comparison");
is($m4->sizeof, $merged->sizeof, "Get back what we started with");
__END__
Block 1 description:
DATE-OBS= '2005-05-01T12:00:00' / observation date
RA = 5. / Right Ascension of observation
DEC = 5. / Declination of observation
ADD_ATM = 1 / flag for adding atmospheric emission
ADDFNOIS= 0 / flag for adding 1/f noise
ADD_PNS = 1 / flag for adding photon noise
FLUX2CUR= 1 / flag for converting flux to current
SMU_SAMP= 8 / number of samples between jiggle vertices
DISTFAC = 0. / distortion factor (0=no distortion)
CONVSHAP= 2 / convolution function (Gaussian=0)
CONV_SIG= 1. / convolution function parameter
NBOLX = 40 / number of bolometers in X direction
NBOLY = 32 / number of bolometers in Y direction
SAMPLE_T= 5. / The sample interval in msec
SUBSYSNR= 1 / subsystem number
NVERT = 8 / Nr of vertices in the Jiggle pattern
MOVECODE= 8 / Code for the SMU move algorithm
HIERARCH JIG_STEPX = 12.56 / The Jiggle step value in -X-direction on the sk
HIERARCH JIG_STEPY = 12.56 / The Jiggle step value in -Y-direction on the sk
NCYCLE = 4 / number of cycles
NUMSAMP = 256 / number of samples
Block 2 description:
RUN = 1 / Run number
UNIQUE = 1 / A unique header
COMMON = T / A somewhat common header
=cut
Block 1 description:
DATE-OBS= '2005-05-01T12:01:00' / observation date
RA = 5. / Right Ascension of observation
DEC = 5. / Declination of observation
ADD_ATM = 1 / flag for adding atmospheric emission
ADDFNOIS= 0 / flag for adding 1/f noise
ADD_PNS = 1 / flag for adding photon noise
FLUX2CUR= 1 / flag for converting flux to current
SMU_SAMP= 8 / number of samples between jiggle vertices
DISTFAC = 0. / distortion factor (0=no distortion)
CONVSHAP= 2 / convolution function (Gaussian=0)
CONV_SIG= 1. / convolution function parameter
NBOLX = 40 / number of bolometers in X direction
NBOLY = 32 / number of bolometers in Y direction
SAMPLE_T= 5. / The sample interval in msec
SUBSYSNR= 1 / subsystem number
NVERT = 8 / Nr of vertices in the Jiggle pattern
MOVECODE= 8 / Code for the SMU move algorithm
HIERARCH JIG_STEPX = 12.56 / The Jiggle step value in -X-direction on the sk
HIERARCH JIG_STEPY = 12.56 / The Jiggle step value in -Y-direction on the sk
NCYCLE = 4 / number of cycles
NUMSAMP = 256 / number of samples
Block 2 description:
RUN = 2 / Run number
COMMON = T / A somewhat common header
=cut
Block 1 description:
DATE-OBS= '2005-05-01T12:02:00' / observation date
RA = 5. / Right Ascension of observation
DEC = 5. / Declination of observation
ADD_ATM = 1 / flag for adding atmospheric emission
ADDFNOIS= 0 / flag for adding 1/f noise
ADD_PNS = 1 / flag for adding photon noise
FLUX2CUR= 1 / flag for converting flux to current
SMU_SAMP= 8 / number of samples between jiggle vertices
DISTFAC = 0. / distortion factor (0=no distortion)
CONVSHAP= 2 / convolution function (Gaussian=0)
CONV_SIG= 1. / convolution function parameter
NBOLX = 40 / number of bolometers in X direction
NBOLY = 32 / number of bolometers in Y direction
SAMPLE_T= 5. / The sample interval in msec
SUBSYSNR= 1 / subsystem number
NVERT = 8 / Nr of vertices in the Jiggle pattern
MOVECODE= 8 / Code for the SMU move algorithm
HIERARCH JIG_STEPX = 12.56 / The Jiggle step value in -X-direction on the sk
HIERARCH JIG_STEPY = 12.56 / The Jiggle step value in -Y-direction on the sk
NCYCLE = 4 / number of cycles
Block 2 description:
NUMSAMP = 256 / number of samples
RUN = 3 / Run number
|