| Astro-Catalog documentation | Contained in the Astro-Catalog distribution. |
Astro::Catalog::Query - Base class for Astro::Catalog query objects
use base qw/ Astro::Catalog::Query /;
This class forms a base class for all the query classes provided
in the Astro::Catalog distribution (eg Astro::Catalog::GSC::Query).
$Id: Query.pm,v 1.8 2003/09/25 21:27:50 aa Exp $
Create a new instance from a hash of options
$q = new Astro::Catalog::Query( Coords => new Astro::Coords(), Radius => $radius, Bright => $magbright, Faint => $magfaint, Sort => $sort_type, Number => $number_out );
returns a reference to an query object. Must only called from sub-classed constructors.
RA and Dec are also allowed but are deprecated (since with only RA/Dec the coordinates must always be supplied as J2000 space-separated sexagesimal format).
Hash representing the query options to be used to query the catalog server. This keys in this hash are restricted by the subclass. Some keys are not usable by all catalogues.
Returns a copy of the options hash when.
%options = $q->query_options();
Note that the hash keys included here are not necessarily the keys used to form a remote query.
If an argument is supplied, the value for that option is returned if the option is supported.
$ra = $q->query_options( "ra" );
Values can not be set directly. Please use the provided accessor methods.
Return (or set) the current target R.A. defined for the query
$ra = $usno->ra(); $usno->ra( $ra );
where $ra should be a string of the form "HH MM SS.SS", e.g. 21 42 42.66
Return (or set) the current target Declination defined for the query
$dec = $q->dec(); $q->dec( $dec );
where $dec should be a string of the form "+-HH MM SS.SS", e.g. +43 35 09.5 or -40 25 67.89
Instead of querying by R.A. and Dec., you may also query it by object name. Return (or set) the current target object defined for the USNO-A2.0 query, will query SIMBAD for object name resolution.
$ident = $usno->target(); $usno->target( "HT Cas" );
using an object name will override the current R.A. and Dec settings for the Query object (if currently set) and the next querydb() method call will query using this identifier rather than any currently set co-ordinates.
The radius to be searched for objects around the target R.A. and Dec in arc minutes, the radius defaults to 5 arc minutes.
$radius = $query->radius(); $query->radius( 20 );
Set (or query) the faint magnitude limit for inclusion on the results
$faint = $query->faint(); $query->faint( 50 );
Set (or query) the bright magnitude limit for inclusion on the results
$faint = $query->bright(); $query->bright( 2 );
Set or query the order in which the stars are listed in the catalogue
$sort = $query->sort(); $query->sort( 'RA' );
valid options are RA, DEC, RMAG, BMAG, DIST (distance to centre of the requested field) and POS (the position angle to the centre of the field).
The number of objects to return, defaults to 2000 which should hopefully be sufficent to return all objects of interest. This value should be increased if a (very) large sample radius is requested.
$num = $query->number(); $query->nout( 100 );
Configures the object, takes an options hash as an argument
$dss->configure( %options );
Does nothing if the array is not supplied.
Copyright (C) 2001 University of Exeter. All Rights Reserved. Some modifications copyright (C) 2003 Particle Physics and Astronomy Research Council. All Rights Reserved.
This program was written as part of the eSTAR project and is free software; you can redistribute it and/or modify it under the terms of the GNU Public License.
Alasdair Allan <aa@astro.ex.ac.uk>, Tim Jenness <tjenness@cpan.org>
| Astro-Catalog documentation | Contained in the Astro-Catalog distribution. |
package Astro::Catalog::Query;
# L O A D M O D U L E S -------------------------------------------------- use strict; use warnings; use warnings::register; use vars qw/ $VERSION /; use File::Spec; use Carp; # generic catalog objects use Astro::Coords; use Astro::Catalog; use Astro::Catalog::Star; '$Revision: 1.8 $ ' =~ /.*:\s(.*)\s\$/ && ($VERSION = $1); # C O N S T R U C T O R ----------------------------------------------------
sub new { my $proto = shift; my $class = ref($proto) || $proto; # bless the query hash into the class my $block = bless { OPTIONS => {}, BUFFER => undef }, $class; # Configure the object [even if there are no args] $block->configure( @_ ); return $block; }
sub query_options { my $self = shift; if (@_) { my $opt = lc(shift); my %allow = $self->_get_allowed_options; if (!exists $allow{$opt}) { warnings::warnif("Option $opt not supported by this cataloge"); return; } return $self->{OPTIONS}->{$opt}; } return %{ $self->{OPTIONS} }; }
sub ra { my $self = shift; # SETTING R.A. if (@_) { # grab the new R.A. my $ra = shift; $self->_set_query_options( ra => $ra ); } # Return it return $self->query_options("ra"); }
sub dec { my $self = shift; # SETTING DEC if (@_) { # grab the new Dec my $dec = shift; $self->_set_query_options( dec => $dec ); } return $self->query_options("dec"); }
sub target { my $self = shift; # SETTING IDENTIFIER if (@_) { # grab the new object name my $ident = shift; # Need to clear RA and Dec iff they are allowed options my %allow = $self->_get_allowed_options(); my %clear; $clear{ra} = undef if exists $allow{ra}; $clear{dec} = undef if exists $allow{dec}; # Store it in the options table $self->_set_query_options( object => $ident, %clear ); } return $self->query_options("object"); }
sub radius { my $self = shift; if (@_) { $self->_set_query_options( radmax => shift ); } return $self->query_options("radmax"); }
sub faint { my $self = shift; if (@_) { $self->_set_query_options( magfaint => shift ); } return $self->query_options("magfaint"); }
sub bright { my $self = shift; if (@_) { $self->_set_query_options( magbright => shift ); } return $self->query_options("magbright"); }
sub sort { my $self = shift; if (@_) { my $sort = shift; $self->_set_query_options( sort => $sort ); } # return the sort option return $self->query_options("sort"); }
sub number { my $self = shift; if (@_) { $self->_set_query_options( nout => shift ); } return $self->query_options("nout"); } sub nout { my $self = shift; warnings::warnif("deprecated","The nout() method is deprecated. Please use number()"); return $self->number( @_ ); }
sub configure { my $self = shift; # CONFIGURE DEFAULTS # ------------------ # configure the default options $self->_set_default_options(); # CONFIGURE FROM ARGUMENTS # ------------------------- # return unless we have arguments return undef unless @_; # grab the argument list my %args = Astro::Catalog::_normalize_hash(@_); # Grab the allowed options my %allow = $self->_get_allowed_options(); # Loop over the supplied arguments. If they correspond to # a method, run it, if they correspond to an option, set it for my $key (keys %args) { my $lckey = lc($key); if ($self->can($lckey)) { $self->$lckey( $args{$key} ); } elsif (exists $allow{$lckey}) { # set the option explcitly $self->_set_query_options( $lckey => $args{$key} ); } else { #warnings::warnif("Unrecognized option: $key. Ignoring it."); } } } # T I M E A T T H E B A R --------------------------------------------
sub _set_query_options { my $self = shift; my %newopt = @_; my %allow = $self->_get_allowed_options(); for my $newkey (keys %newopt) { if (!exists $allow{$newkey}) { warnings::warnif("Option $newkey not supported by catalog ". ref($self)."\n"); next; } # set the option $self->{OPTIONS}->{$newkey} = $newopt{$newkey}; } return; }
sub _get_allowed_options { return ( ra => 'ra', dec => 'dec', object => 'object', radmax => 'radmax', radmin => 'radmin', width => 'width', height => 'height', magbright => 'magbright', magfaint => 'magfaint', sort => 'sort', nout => 'nout', ); }
sub _get_supported_accessor_options { return ( ra => 'ra', dec => 'dec', faint => 'magfaint', bright => 'magbright', radius => 'radmax', target => 'object', sort => 'sort', number => 'nout', format => 'format', ); }
sub _get_default_options { croak "get_default_options must be subclassed"; }
sub _set_default_options { my $self = shift; # get the defaults my %defaults = $self->_get_default_options(); # set them $self->_set_query_options( %defaults ); return; }
sub _dump_raw { my $self = shift; # split the BUFFER into an array my @portable = split( /\n/,$self->{BUFFER}); chomp @portable; return @portable; }
sub _set_raw { my $self = shift; $self->{BUFFER} = shift; }
sub _dump_options { my $self = shift; return $self->query_options; }
sub _parse_query { croak "Query parsing is not generic. Please write one\n"; }
sub _translate_options { my $self = shift; my %outhash; my %allow = $self->_get_allowed_options(); my %one_one = $self->_translate_one_to_one(); foreach my $key ( keys %allow ) { # Need to translate them... my $cvtmethod = "_from_" . $key; my ($outkey, $outvalue); if ($self->can($cvtmethod)) { ($outkey, $outvalue) = $self->$cvtmethod(); } else { # This is the one-to-one mapping section # issue a warning if the method has not been declared # as supporting that simply mapping warnings::warnif("Unable to find translation for key $key. Assuming 1 to 1 mapping.\n") unless exists $one_one{$key}; # Translate the key and copy the value $outkey = $allow{$key}; $outvalue = $self->query_options($key); } $outhash{$outkey} = $outvalue; } return %outhash; }
sub _translate_one_to_one { # convert to a hash-list return map { $_, undef }(qw/ object radmax radmin magfaint magbright nout format /); } # RA and Dec replace spaces with pluses and + sign with special code sub _from_ra { my $self = shift; my $ra = $self->query_options("ra"); my %allow = $self->_get_allowed_options(); # Must replace spaces with + $ra =~ s/\s/\+/g if defined $ra; return ($allow{ra},$ra); } sub _from_dec { my $self = shift; my $dec = $self->query_options("dec"); my %allow = $self->_get_allowed_options(); if (defined $dec) { # Must replace + with %2B $dec =~ s/\+/%2B/g; # Must replace spaces with + $dec =~ s/\s/\+/g; } return ($allow{dec},$dec); } sub _from_sort { my $self = shift; my $key = "sort"; # case insensitive conversion my $value = uc($self->query_options($key)); my $sort; # pick an option if( $value eq "RA" ) { # sort by RA $sort = "ra"; } elsif ( $value eq "DEC" ) { # sort by Dec $sort = "dec"; } elsif ( $value eq "RMAG" ) { # sort by R magnitude $sort = "mr"; } elsif ( $value eq "BMAG" ) { # sort by B magnitude $sort = "mb"; } elsif ( $value eq "DIST" ) { # sort by distance from field centre $sort = "d"; } elsif ( $value eq "POS" ) { # sort by position angle to field centre $sort = "pos"; } else { # in case there are no valid options sort by RA warnings::warnif("Unknown sort type [$value]: using ra"); $sort = "ra"; } my %allow = $self->_get_allowed_options(); return ($allow{$key}, $sort); } # This is a template methdo that can be extended. This one # implements a one to one mapping #sub _from_XXX { # my $self = shift; # my $key = "XXX"; # my $value = $self->query_options($key); # my %allow = $self->_get_allowed_options(); # return ($allow{$key}, $value); #}
# L A S T O R D E R S ------------------------------------------------------ 1;