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 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
|
#!perl
# Testing NDF read/write of fits headers
use strict;
use Test::More;
BEGIN {
eval "use NDF;";
if ($@) {
plan skip_all => "NDF module not available";
exit;
} else {
plan tests => 193;
}
}
require_ok( "Astro::FITS::Header::NDF" );
my $file = "temp$$";
END { unlink $file . ".sdf" if defined $file; };
# Create an NDF file
my $status = &NDF::SAI__OK;
my $good = $status;
ndf_begin();
ndf_open(&NDF::DAT__ROOT(), $file, 'WRITE', 'UNKNOWN',
my $ndfid, my $place, $status);
# if the file was not there we have to create it from the place holder
# KLUGE : need to get NDF__NOID from the NDF module at some point
if ($ndfid == 0) {
my @lbnd = (1);
my @ubnd = (1);
ndf_new('_INTEGER', 1, @lbnd, @ubnd, $place, $ndfid, $status );
# Map the data array
ndf_map($ndfid, 'DATA', '_INTEGER', 'WRITE', my $pntr, my $el, $status);
my @data = (5);
&array2mem(\@data, "i*", $pntr) if ($status == $good);
ndf_unmap($ndfid,'DATA', $status);
}
ndf_annul($ndfid, $status);
ndf_end($status);
# Read the stuff from the end
my @cards = <DATA>;
chomp(@cards);
# Create a new object with those cards
my $hdr = new Astro::FITS::Header::NDF( Cards => \@cards );
# Store them on disk
$hdr->writehdr( File => $file );
ok( -e $file .".sdf", "Does $file exist?" );
# Read them back in
my $hdr2 = new Astro::FITS::Header::NDF( File => $file );
# Now compare with the original
my @newcards = $hdr2->cards;
for my $i (0..$#cards) {
is($newcards[$i], $cards[$i], "Compare card $i");
}
exit;
__DATA__
SIMPLE = T / file does conform to FITS standard
BITPIX = -32 / number of bits per data pixel
NAXIS = 3 / number of data axes
NAXIS1 = 5 / length of data axis 1
NAXIS2 = 37 / length of data axis 2
NAXIS3 = 32 / length of data axis 3
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.
DATE = '2001-03-17T05:32:30' / file creation date (YYYY-MM-DDThh:mm:ss UTC)
ORIGIN = 'Starlink Project, U.K.' / Origin of this FITS file
BSCALE = 1.0E+00 / True_value = BSCALE * FITS_value + BZERO
BZERO = 0.0E+00 / True_value = BSCALE * FITS_value + BZERO
HDUCLAS1= 'NDF ' / Starlink NDF (hierarchical n-dim format)
HDUCLAS2= 'DATA ' / Array component subclass
ACCEPT = 'PROMPT ' / accept update; PROMPT, YES or NO
ALIGN_AX= 'not used' / Alignment measurements in X or Y axis
ALIGN_SH= -1 / Distance between successive alignment offsets (
ALT-OBS = 4092 / Height of observatory above sea level (metres)
AMEND = 1.033522 / Airmass at end of observation
AMSTART = 1.033343 / Airmass at start of observation
APEND = 626.6301 / Air pressure at end of observation (mbar)
APSTART = 626.5079 / Air pressure at start of observation (mbar)
ATEND = -0.695969 / Air temp. at end of observation (C)
ATSTART = -0.793648 / Air temp. at start of observation (C)
BOLOMS = 'LONG ' / Names of bolometers measured
CALIBRTR= T / Internal calibrator is on or off
CAL_FRQ = 2.929688 / Calibrator frequency (Hz)
CENT_CRD= 'RJ ' / Centre coordinate system
CHOP_CRD= 'AZ ' / Chopper coordinate system
CHOP_FRQ= 7.8125 / Chopper frequency (Hz)
CHOP_FUN= 'SCUBAWAVE' / Chopper waveform
CHOP_PA = 90 / Chopper P.A., 0 = in lat, 90 = in long
CHOP_THR= 60 / Chopper throw (arcsec)
DATA_DIR= '20010316' / Sub-directory where datafile was stored
DATA_KPT= 'DEMOD ' / The type of data stored to disk
DRGROUP = 'UNKNOWN ' / Pipeline combination of observations
DRRECIPE= 'UNKNOWN ' / Data reduction recipe name
END_AZD = 349.946 / Azimuth at end of observation (deg)
END_EL = -1 / Elevation of last SKYDIP point (deg)
END_ELD = 75.3348 / Elevation at end of observation
EQUINOX = 2000 / Equinox of mean coordinate system
EXPOSED = 0 / Exposure per pixel (seconds)
EXP_NO = 1 / Exposure number at end of observation
EXP_TIME= 1.024 / Exposure time for each basic measurement (sec)
E_PER_I = 1 / Number of exposures per integration
FILTER = '450W:850W' / Filters used
FOCUS_SH= -1 / Shift between focus measurements (mm)
GAIN = 10 / Programmable gain
HSTEND = '5:10:43.99967' / HST at end of observation
HSTSTART= '5:09:42.00073' / HST at start of observation
HUMEND = 15 / Humidity (%) at end of observation
HUMSTART= 15 / Humidity (%) at start of observation
INSTRUME= 'SCUBA ' / Name of instrument used
INT_NO = 1 / Integration number at end of observation
JIGL_CNT= 16 / Number of offsets in jiggle pattern
JIGL_NAM= 'JCMTDATA_DIR:EASY_16_6P18.JIG' / File containing jiggle offsets
J_PER_S = 16 / Number of jiggles per switch position
J_REPEAT= 1 / No. jiggle pattern repeats in a switch
LAT = '+034:12:47.91' / Object latitude
LAT-OBS = 19.8258323669 / Latitude of observatory (degrees)
LAT2 = 'not used' / Object latitude at MJD2
LOCL_CRD= 'RJ ' / Local offset coordinate system
LONG = '+016:13:41.06' / Object longitude
LONG-OBS= 204.520278931 / East longitude of observatory (degrees)
LONG2 = 'not used' / Object Longitude at MJD2
MAP_HGHT= 180 / Height of rectangle to be mapped (arcsec)
MAP_PA = 0 / P.A. of map vertical, +ve towards +ve long
MAP_WDTH= 180 / Width of rectangle to be mapped (arcsec)
MAP_X = 0 / Map X offset from telescope centre (arcsec)
MAP_Y = 0 / Map Y offset from telescope centre (arcsec)
MAX_EL = -1 / Max elevation of sky-dip (deg)
MEANDEC = 34.20982 / 34:12:35.36499 = approx. mean Dec. (deg)
MEANRA = 243.4202 / 243:25:12.59766 = approx. mean R.A. (deg)
MEAS_NO = 1 / Measurement number at end of observation
MIN_EL = -1 / Min elevation of sky-dip (deg)
MJD1 = -1 / Modified Julian day planet at RA,DEC
MJD2 = -1 / Modified Julian day planet at RA2,DEC2
MODE = 'POINTING' / The type of observation
N_INT = 1 / No. integrations in the observation
N_MEASUR= 1 / No. measurements in the observation
OBJECT = '1611+343' / Name of object
OBJ_TYPE= 'UNKNOWN ' / Type of object
OBSDEF = 'ss:odfsxpo.t_1611x343_050456' / The observation definition file
OBSERVER= 'Captain Nemo' / The name of the observer
PROJ_ID = 'scuba ' / The project identification
RUN = 101 / Run number of observation
SAM_CRDS= 'NA ' / Coordinatesystem of sampling mesh
SAM_DX = -1 / Sample spacing along scan direction (arcsec)
SAM_DY = -1 / Sample spacing perp. to scan (arcsec)
SAM_MODE= 'JIGGLE ' / Sampling method
SAM_PA = -1 / Scan P.A. rel. to lat. line; 0=lat, 90=long
SCAN_REV= F / .TRUE. if alternate scans reverse direction
SPK_NSIG= 0 / N sigmas from fit of spike threshold
SPK_RMVL= T / Automatic spike removal
SPK_WDTH= 0 / Assumed width of spike
START_EL= -1 / Elevation of first SKYDIP point (deg)
STATE = 'Terminating :' / SCUCD state
STEND = '16:25:54.10538' / ST at end of observation
STRT_AZD= 350.459 / Azimuth at observation start (deg)
STRT_ELD= 75.364 / Elevation at observation start (deg)
STSTART = '16:24:52.939' / ST at start of observation
SWTCH_MD= 'BMSW ' / Switch mode of observation
SWTCH_NO= 2 / Switch number at end of observation
S_PER_E = 2 / Number of switch positions per exposure
TELESCOP= 'JCMT ' / Name of telescope
TEL_OPER= 'Ned Land' / Telescope operator
UTDATE = '2001:3:16' / UT date of observation
UTEND = '15:10:42.99889' / UT at end of observation
UTSTART = '15:09:42.00073' / UT at start of observation
VERSION = 1.1 / SCUCD version
WPLTNAME= 'JCMTDATA_DIR:WPLATE_16.DAT' / File name of waveplate positions
ALIGN_DX= 0.724521 / SMU tables X axis alignment offset
ALIGN_DY= -0.09 / SMU tables Y axis alignment offset
ALIGN_X = -4.26865 / SMU tables X axis
ALIGN_Y = 2.61996 / SMU tables Y axis
AZ_ERR = -0.277546 / Error in the telescope azimuth
CHOPPING= T / SMU Chopper chopping state
EL_ERR = 1.12316 / Error in the telescope elevation
FOCUS_DZ= -0.071401 / SMU tables Z axis focus offset
FOCUS_Z = -16.6062 / SMU tables Z axis
SEEING = 0.288833 / SAO atmospheric seeing
SEE_DATE= '0103161415' / Date and time of SAO seeing
TAU_225 = 0.035 / CSO tau
TAU_DATE= '0103161455' / Date and time of CSO tau
TAU_RMS = 3.0E-03 / CSO tau rms
UAZ = -0.402539 / User azimuth pointing offset
UEL = 3.99758 / User elevation pointing offset
UT_DATE = '16 MAR 2001' / UT date at start of observation
BAD_LIM = 32 / No. spikes before quality set bad
CALIB_LG= 6 / Lag of internal calibrator in samples
CALIB_PD= 42.66667 / Period of internal calibrator in samples
CHOP_LG = 4 / Chop lag in samples
CHOP_PD = 16 / Chop period in samples
CNTR_DU3= 0 / Nasmyth dU3 coord of instrument centre
CNTR_DU4= 0 / Nasmyth dU4 coord of instrument centre
ETATEL_1= -1 / Transmission of telescope
ETATEL_2= -1 / Transmission of telescope
ETATEL_3= -1 / Transmission of telescope
ETATEL_4= -1 / Transmission of telescope
ETATEL_5= -1 / Transmission of telescope
FILT_1 = '850 ' / Filter name
FILT_2 = 'not_used' / Filter name
FILT_3 = 'not_used' / Filter name
FILT_4 = 'not_used' / Filter name
FILT_5 = 'not_used' / Filter name
FLAT = 'jcmtdata_dir:lwswphot.dat' / Name of flat-field file
JIG_DSCD= -1 / No. samples discarded after jiggle movement
L_GD_BOL= 'H7 ' / Bol. to whose value LW guard ring is set
L_GUARD = F / Long wave guard ring on or off
MEAS_BOL= 'LONG ' / Bolometers actually measured in observation
N_BOLS = 37 / Number of bolometers selected
N_SUBS = 1 / Number of sub-instruments used
PHOT_BBF= 'not_used LL,C14,NULL' / The bolometers on the source
PRE_DSCD= 0 / No. of samples discarded before chop movement
PST_DSCD= 0 / No. samples discarded after chop movement
REBIN = 'LINEAR ' / Rebinning method used by SCUIP
REF_ADC = -1 / A/D card of FLATFIELD reference bolometer
REF_CHAN= -1 / Channel of FLATFIELD reference bolometer
SAM_TIME= 125 / A/D sample period in ticks (64musec)
SIMULATE= F / True if data is simulated
SKY = 'jcmtdata_dir:skydip_startup.dat' / Name of sky opacities file
SUB_1 = 'LONG ' / SCUBA instrument being used
SUB_2 = 'not used' / SCUBA instrument being used
SUB_3 = 'not used' / SCUBA instrument being used
SUB_4 = 'not used' / SCUBA instrument being used
SUB_5 = 'not used' / SCUBA instrument being used
S_GD_BOL= 'D9 ' / Bol. to whose value SW guard ring is set
S_GUARD = F / Short wave guard ring on or off
TAUZ_1 = 0 / Zenith sky optical depth
TAUZ_2 = 0 / Zenith sky optical depth
TAUZ_3 = 0 / Zenith sky optical depth
TAUZ_4 = 0 / Zenith sky optical depth
TAUZ_5 = 0 / Zenith sky optical depth
T_AMB = -1 / The ambient air temperature (K)
T_COLD_1= -1 / Effective temperature of cold load (K)
T_COLD_2= -1 / Effective temperature of cold load (K)
T_COLD_3= -1 / Effective temperature of cold load (K)
T_COLD_4= -1 / Effective temperature of cold load (K)
T_COLD_5= -1 / Effective temperature of cold load (K)
T_HOT = -1 / The temperature of the hot load (K)
T_TEL = -1 / The temperature of the telescope
USE_CAL = F / .TRUE. if dividing chop by cal before rebin
WAVE_1 = 863 / Wavelength of map (microns)
WAVE_2 = 0 / Wavelength of map (microns)
WAVE_3 = 0 / Wavelength of map (microns)
WAVE_4 = 0 / Wavelength of map (microns)
WAVE_5 = 0 / Wavelength of map (microns)
END
|