=head1 NAME
Astro::FITS::HdrTrans::CGS4New - UKIRT CGS4 translations for "new"
style CGS4 headers.
=head1 SYNOPSIS
use Astro::FITS::HdrTrans::CGS4New;
%gen = Astro::FITS::HdrTrans::CGS4New->translate_from_FITS( %hdr );
=head1 DESCRIPTION
This class provides a generic set of translations that are specific to
the CGS4 spectrometer of the United Kingdom Infrared Telescope.
=cut
use 5.006;
use strict;
use Carp;
# Inherit from UIST
our $VERSION = "1.66";
my %CONST_MAP = ( OBSERVATION_MODE => 'spectroscopy',
);
my %UNIT_MAP = ( DEC_BASE => "DECBASE",
DEC_SCALE => "CDELT3",
EXPOSURE_TIME => "DEXPTIME",
GRATING_DISPERSION => "GDISP",
GRATING_NAME => "GRATING",
GRATING_ORDER => "GORDER",
GRATING_WAVELENGTH => "GLAMBDA",
NSCAN_POSITIONS => "DETNINCR",
RA_BASE => "RABASE",
RA_SCALE => "CDELT2",
SCAN_INCREMENT => "DETINCR",
SLIT_ANGLE => "SANGLE",
SLIT_NAME => "SLIT",
SLIT_WIDTH => "SWIDTH",
X_BASE => "CRVAL2",
X_REFERENCE_PIXEL => "CRPIX2",
Y_BASE => "CRVAL3",
Y_REFERENCE_PIXEL => "CRPIX3",
);
# Create the translation methods
__PACKAGE__->_generate_lookup_methods( \%CONST_MAP, \%UNIT_MAP );
=head1 METHODS
=over 4
=item B<can_translate>
Returns true if the supplied headers can be handled by this class.
$cando = $class->can_translate( \%hdrs );
This method returns tru if the INSTRUME header exists and is equal to
'CGS4', and if the DHSVER header exists and is equal to 'UKDHS 2008
Dec. 1'.
=cut
sub can_translate {
my $self = shift;
my $headers = shift;
if ( exists( $headers->{INSTRUME} ) &&
uc( $headers->{INSTRUME} ) eq 'CGS4' &&
exists( $headers->{DHSVER} ) &&
uc( $headers->{DHSVER} ) eq 'UKDHS 2008 DEC. 1' ) {
return 1;
}
# Handle the reverse case as well. This module can translate CGS4
# headers newer than 20081115.
if ( exists $headers->{INSTRUMENT} &&
uc( $headers->{INSTRUMENT} ) eq 'CGS4' &&
exists $headers->{UTDATE} &&
$headers->{UTDATE} >= 20081115 ) {
return 1;
}
return 0;
}
=back
=head1 COMPLEX CONVERSIONS
=over 4
=item B<to_ROTATION>
This determines the angle, in decimal degrees, of the rotation of the
sky component of the WCS. It uses the standard transformation matrix
PCi_j as defined in the FITS WCS Standard. In the absence of a PCi_j
matrix, it looks for the CROTA2 keyword.
For CGS4 the PCi_j matrix is obtained from i=[2,3] and j=[2,3].
=cut
sub to_ROTATION {
my $self = shift;
my $FITS_headers = shift;
my $rotation;
my $rtod = 45 / atan2( 1, 1 );
if ( defined( $FITS_headers->{PC2_2} ) || defined( $FITS_headers->{PC2_3} ) ||
defined( $FITS_headers->{PC3_2} ) || defined( $FITS_headers->{PC3_3} ) ) {
my $pc22 = defined( $FITS_headers->{PC2_2} ) ? $FITS_headers->{PC2_2} : 1.0;
my $pc32 = defined( $FITS_headers->{PC3_2} ) ? $FITS_headers->{PC3_2} : 0.0;
my $pc23 = defined( $FITS_headers->{PC2_3} ) ? $FITS_headers->{PC2_3} : 0.0;
my $pc33 = defined( $FITS_headers->{PC3_3} ) ? $FITS_headers->{PC3_3} : 1.0;
# Average the estimates of the rotation converting from radians to
# degrees (rtod) as the matrix may not represent a pure rotation.
$rotation = $rtod * 0.5 * ( atan2( -$pc32 / $rtod, $pc22 / $rtod ) +
atan2( $pc23 / $rtod, $pc33 / $rtod ) );
} elsif ( exists $FITS_headers->{CROTA2} ) {
$rotation = $FITS_headers->{CROTA2} + 90.0;
} else {
$rotation = 90.0;
}
return $rotation;
}
=item B<to_UTDATE>
Sets the YYYYMMDD-style UTDATE generic header based on the DATE-OBS
header.
=cut
sub to_UTDATE {
my $self = shift;
my $FITS_headers = shift;
my $utdate;
my $dateobs = $FITS_headers->{'DATE-OBS'};
$dateobs =~ /^(\d{4}-\d\d-\d\d)/;
$utdate = $1;
$utdate =~ s/-//g;
return $utdate;
}
=back
=head1 SEE ALSO
C<Astro::FITS::HdrTrans>, C<Astro::FITS::HdrTrans::UKIRT>.
=head1 AUTHOR
Malcolm J. Currie E<lt>mjc@star.rl.ac.ukE<gt>
Brad Cavanagh E<lt>b.cavanagh@jach.hawaii.eduE<gt>,
Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt>.
=head1 COPYRIGHT
Copyright (C) 2008 Science and Technology Facilities Council.
Copyright (C) 2003-2005 Particle Physics and Astronomy Research Council.
All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either Version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful,but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307, USA.
=cut
1;