package Astro::Catalog::IO::UKIRTBS;

=head1 NAME

Astro::Catalog::IO::UKIRTBS - Old format used by UKIRT Bright Star catalogs

=head1 SYNOPSIS

    $cat = Astro::Catalog::IO::UKIRTBS->_read_catalog(\@lines);

=head1 DESCRIPTION

This class provides a read method for catalogs written in a format
used by the old C<ukstar> web interface to the SAO and Bright Star
catalogs. It is probable that this format has a real name and is a
historical format rather than a UKIRT-specific format but the history
of C<ukstar> and the associated catalog files is not known to the
author of this module.

=cut

use warnings;
use warnings::register;
use Carp;
use strict;

use Astro::Catalog;
use Astro::Catalog::Item;

use base qw/Astro::Catalog::IO::ASCII/;

our $VERSION = '4.37';

=over 4

=item B<_read_catalog>

Parses the catalog lines and returns a new C<Astro::Catalog>
object containing the catalog entries.

    $cat = Astro::Catalog::IO::JCMT->_read_catalog(\@lines);

No options are supported.

=cut

sub _read_catalog {
    my $class = shift;
    my $lines = shift;

    croak "Must supply catalog contents as a reference to an array"
        unless ref($lines) eq 'ARRAY';

    # Go through each line and parse it
    my @stars;
    for my $l (@$lines) {
        # benchmarks suggest that substr is faster than an unpack
        my $bs = substr($l, 0, 8);
        my $ra = substr($l, 9, 12);
        my $dec = substr($l, 21, 12);
        my $rap = substr($l, 34, 4);
        my $decp = substr($l, 40, 4);
        my $mag = substr($l, 46, 4);
        my $type = substr($l, 50);

        # Tidy the result
        chomp($type);
        $bs =~ s/^\s+//;

        # Create coordinate object
        my $c = new Astro::Coords(
            ra => $ra,
            dec => $dec,
            type => 'B1950',
            name => $bs,
            units => 'r',
        );

        my $s = new Astro::Catalog::Item(
            coords => $c,
            id =>  $bs,
            spectype => $type,
            fluxes => new Astro::Fluxes(
                new Astro::Flux($mag, 'mag', 'V')),
        );

        push(@stars, $s);
    }

    # Create the catalog object
    return new Astro::Catalog(
        Stars => \@stars,
        Origin => 'UKIRT BS Catalog',
    );
}

1;

__END__

=back

=head1 FORMAT

The catalog format uses fixed formatting (first column is column 1):

    Columns
     1-7     star id
    10-20    Right Ascension (presumed B1950). Radians
    21-32    Declination (presumed B1950). Radians
    33-38    "rap"  (unknown)
    39-44    "decp" (unknown)
    45-49    V Magnitude
    50-      Spectral type

=head1 COPYRIGHT

Copyright (C) 2004 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

=head1 AUTHORS

Tim Jenness E<lt>tjenness@cpan.orgE<gt>

=cut
