line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Astro::Catalog::Query::MPC; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
=head1 NAME |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
Astro::Catalog::Query::MPC - A query request to the Minor Planet Center's |
6
|
|
|
|
|
|
|
Minor Planet Checker. |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
=head1 SYNOPSIS |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
$mpc = new Astro::Catalog::Query::MPC( RA => $ra, |
11
|
|
|
|
|
|
|
Dec => $dec, |
12
|
|
|
|
|
|
|
Year => $year, |
13
|
|
|
|
|
|
|
Month => $month, |
14
|
|
|
|
|
|
|
Day => $day, |
15
|
|
|
|
|
|
|
Radmax => $radius, |
16
|
|
|
|
|
|
|
Limit => $limit, |
17
|
|
|
|
|
|
|
ObsCode => $obscode, |
18
|
|
|
|
|
|
|
); |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
my $catalog = $mpc->querydb(); |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
=head1 DESCRIPTION |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
This module provides an object-oriented interface to the Minor Planet |
25
|
|
|
|
|
|
|
Center's Minor Planet Checker webform available at |
26
|
|
|
|
|
|
|
http://scully.harvard.edu/~cgi/CheckMP. It stores information about |
27
|
|
|
|
|
|
|
asteroids found in a search radius at a specific epoch in an |
28
|
|
|
|
|
|
|
C object. |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
The object will by default pick up the proxy information from the HTTP_PROXY |
31
|
|
|
|
|
|
|
and NO_PROXY environment variables. See the LWP::UserAgent documentation |
32
|
|
|
|
|
|
|
for details. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
See L for the catalog-independent methods. |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
=cut |
37
|
|
|
|
|
|
|
|
38
|
1
|
|
|
1
|
|
8742204
|
use 5.006; |
|
1
|
|
|
|
|
10
|
|
|
1
|
|
|
|
|
83
|
|
39
|
1
|
|
|
1
|
|
22
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
99
|
|
40
|
1
|
|
|
1
|
|
88
|
use warnings; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
122
|
|
41
|
1
|
|
|
1
|
|
5
|
use base qw/ Astro::Catalog::Transport::REST /; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
884
|
|
42
|
|
|
|
|
|
|
use vars qw/ $VERSION /; |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
use File::Spec; |
45
|
|
|
|
|
|
|
use Time::Piece ':override'; |
46
|
|
|
|
|
|
|
use Carp; |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
use Astro::Catalog; |
49
|
|
|
|
|
|
|
use Astro::Catalog::Star; |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
use Astro::Flux; |
52
|
|
|
|
|
|
|
use Astro::Fluxes; |
53
|
|
|
|
|
|
|
use Number::Uncertainty; |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
$VERSION = "4.31"; |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=head1 REVISION |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
$Id: MPC.pm,v 1.2 2005/06/16 01:57:35 aa Exp $ |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
=begin __PRIVATE_METHODS__ |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=head2 Private Methods |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
These methods are for internal use only. |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=over 4 |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=item B<_default_remote_host> |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
Defines the default remote host to be scully.harvard.edu. |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=cut |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
sub _default_remote_host { |
76
|
|
|
|
|
|
|
return "scully.harvard.edu"; |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
=item B<_default_url_path> |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
Defines the default URL path to be ~cgi/MPCheck.COM?. |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=cut |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
sub _default_url_path { |
86
|
|
|
|
|
|
|
return "~cgi/MPCheck.COM?"; |
87
|
|
|
|
|
|
|
} |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
=item B<_get_allowed_options> |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
Returns a hash with key being the internal options supported |
92
|
|
|
|
|
|
|
by this subclass, and values being the key name actually requred |
93
|
|
|
|
|
|
|
by the remote system (and to be included in the query). |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
=cut |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
sub _get_allowed_options { |
98
|
|
|
|
|
|
|
my $self = shift; |
99
|
|
|
|
|
|
|
return ( |
100
|
|
|
|
|
|
|
ra => 'ra', |
101
|
|
|
|
|
|
|
dec => 'decl', |
102
|
|
|
|
|
|
|
year => 'year', |
103
|
|
|
|
|
|
|
month => 'month', |
104
|
|
|
|
|
|
|
day => 'day', |
105
|
|
|
|
|
|
|
limit => 'limit', |
106
|
|
|
|
|
|
|
obscode => 'oc', |
107
|
|
|
|
|
|
|
which => 'which', |
108
|
|
|
|
|
|
|
mpcsort => 'sort', |
109
|
|
|
|
|
|
|
mot => 'mot', |
110
|
|
|
|
|
|
|
tmot => 'tmot', |
111
|
|
|
|
|
|
|
needed => 'needed', |
112
|
|
|
|
|
|
|
ps => 'ps', |
113
|
|
|
|
|
|
|
type => 'type', |
114
|
|
|
|
|
|
|
radmax => 'radius', |
115
|
|
|
|
|
|
|
textarea => 'TextArea', |
116
|
|
|
|
|
|
|
); |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
=item B<_get_default_options> |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
Get the default query state. |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
=cut |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
sub _get_default_options { |
126
|
|
|
|
|
|
|
my $time = gmtime; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
my $day = sprintf( "%.2f",$time->mday + ( $time->hour / 24 ) + ( $time->min / 1440 ) + ( $time->sec / 86400 ) ); |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
return ( |
131
|
|
|
|
|
|
|
# Hidden and constant options |
132
|
|
|
|
|
|
|
which => 'pos', |
133
|
|
|
|
|
|
|
mpcsort => 'd', |
134
|
|
|
|
|
|
|
mot => 'h', |
135
|
|
|
|
|
|
|
tmot => 's', |
136
|
|
|
|
|
|
|
needed => 'f', |
137
|
|
|
|
|
|
|
ps => 'n', |
138
|
|
|
|
|
|
|
type => 'p', |
139
|
|
|
|
|
|
|
textarea => '', |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
# Target information |
142
|
|
|
|
|
|
|
ra => undef, |
143
|
|
|
|
|
|
|
dec => undef, |
144
|
|
|
|
|
|
|
year => $time->year, |
145
|
|
|
|
|
|
|
month => $time->mon, |
146
|
|
|
|
|
|
|
day => $day, |
147
|
|
|
|
|
|
|
obscode => 500, |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
# Limits |
150
|
|
|
|
|
|
|
radmax => 15, |
151
|
|
|
|
|
|
|
limit => 20.0, |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
); |
154
|
|
|
|
|
|
|
} |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
=item B<_parse_query> |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
Private function used to parse the results returned in an MPC query. |
159
|
|
|
|
|
|
|
Should not be called directly. Instead, use the querydb() accessor |
160
|
|
|
|
|
|
|
method to make and parse the results. |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
=cut |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
sub _parse_query { |
165
|
|
|
|
|
|
|
my $self = shift; |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
# Get a local copy of the current BUFFER. |
168
|
|
|
|
|
|
|
my @buffer = split( /\n/, $self->{BUFFER} ); |
169
|
|
|
|
|
|
|
chomp @buffer; |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
# Create an Astro::Catalog object to hold the search results. |
172
|
|
|
|
|
|
|
my $catalog = new Astro::Catalog(); |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
# Create a temporary object to hold stars. |
175
|
|
|
|
|
|
|
my $star; |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
my ( $line, $counter ); |
178
|
|
|
|
|
|
|
my ( $epoch ); |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
# Loop around the returned buffer and stuff the contents into |
181
|
|
|
|
|
|
|
# star objects. |
182
|
|
|
|
|
|
|
foreach $line ( 0 ... $#buffer ) { |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
# Get the limiting magnitude, field center, radius, and epoch. |
185
|
|
|
|
|
|
|
if( $buffer[$line] =~ /^The following objects/ ) { |
186
|
|
|
|
|
|
|
$buffer[$line] =~ /\V\<\/i\> = ([0-9\.]+), were found in the ([0-9\.]+)-arcminute region around R.A. = ([0-9\. ]+), Decl. = ([\-+0-9\. ]+) \(J2000.0\) on (\d{4}) (\d{2}) ([0-9\.]+)/; |
187
|
|
|
|
|
|
|
my $limit = $1; |
188
|
|
|
|
|
|
|
my $radius = $2; |
189
|
|
|
|
|
|
|
my $ra = $3; |
190
|
|
|
|
|
|
|
my $dec = $4; |
191
|
|
|
|
|
|
|
my $year = $5; |
192
|
|
|
|
|
|
|
my $month = $6; |
193
|
|
|
|
|
|
|
my $day = $7; |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
my $hour = int ( ( $day - int( $day ) ) * 24 ); |
196
|
|
|
|
|
|
|
my $minute = int( ( ( ( $day - int( $day ) ) * 24 ) - $hour ) * 60 ); |
197
|
|
|
|
|
|
|
my $second = int( ( ( ( ( ( $day - int( $day ) ) * 24 ) - $hour ) * 60 ) - $minute ) * 60 ); |
198
|
|
|
|
|
|
|
$day = int($day); |
199
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
my $t = Time::Piece->strptime( "$year $month $day $hour $minute $second", |
201
|
|
|
|
|
|
|
"%Y %m %d %H %M %S" ); |
202
|
|
|
|
|
|
|
$epoch = $t->year + ( $t->yday / 365.24 ); |
203
|
|
|
|
|
|
|
} |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
if( $buffer[$line] =~ "" ) { |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
# We're now in the list of asteroids. Loop through until we |
208
|
|
|
|
|
|
|
# hit . |
209
|
|
|
|
|
|
|
$counter = $line + 4; |
210
|
|
|
|
|
|
|
until( $buffer[$counter] =~ "" ) { |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
my( $name, $ra, $dec, $vmag, $raoff, $decoff, $pm_ra, $pm_dec, $orbit, $comment ) = unpack("A24A11A10A6A7A7A7A7A6A*", $buffer[$counter]); |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
if( defined( $ra ) ) { |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
$star = new Astro::Catalog::Star(); |
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
$name =~ s/^\s+//; |
219
|
|
|
|
|
|
|
$star->id( $name ); |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
$vmag =~ s/^\s+//; |
222
|
|
|
|
|
|
|
#my %vmag = ( V => $vmag ); |
223
|
|
|
|
|
|
|
#$star->magnitudes( \%vmag ); |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
$star->fluxes( new Astro::Fluxes( new Astro::Flux( |
226
|
|
|
|
|
|
|
new Number::Uncertainty( Value => $vmag ), |
227
|
|
|
|
|
|
|
'mag', "V" ))); |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
$comment =~ s/^\s+//; |
230
|
|
|
|
|
|
|
$star->comment( $comment ); |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
# Deal with the coordinates. RA and Dec are almost in the |
233
|
|
|
|
|
|
|
# right format (need to replace separating spaces with colons). |
234
|
|
|
|
|
|
|
$ra =~ s/^\s+//; |
235
|
|
|
|
|
|
|
$ra =~ s/ /:/g; |
236
|
|
|
|
|
|
|
$dec =~ s/^\s+//; |
237
|
|
|
|
|
|
|
$dec =~ s/ /:/g; |
238
|
|
|
|
|
|
|
|
239
|
|
|
|
|
|
|
my $coords = new Astro::Coords( name => $name, |
240
|
|
|
|
|
|
|
ra => $ra, |
241
|
|
|
|
|
|
|
dec => $dec, |
242
|
|
|
|
|
|
|
type => 'J2000', |
243
|
|
|
|
|
|
|
epoch => $epoch, |
244
|
|
|
|
|
|
|
); |
245
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
$star->coords( $coords ); |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
# Push the star onto the catalog. |
249
|
|
|
|
|
|
|
$catalog->pushstar( $star ); |
250
|
|
|
|
|
|
|
|
251
|
|
|
|
|
|
|
} |
252
|
|
|
|
|
|
|
$counter++; |
253
|
|
|
|
|
|
|
} |
254
|
|
|
|
|
|
|
$line = $counter |
255
|
|
|
|
|
|
|
} |
256
|
|
|
|
|
|
|
} |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
return $catalog; |
259
|
|
|
|
|
|
|
} |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
=back |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
=head2 Translation Methods |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
The query options stored internally in the object are not necessarily |
266
|
|
|
|
|
|
|
the form required for a query to a remote server. Methods for converting |
267
|
|
|
|
|
|
|
from the internal representation to the external query format are |
268
|
|
|
|
|
|
|
provided in the form of _from_$opt. ie: |
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
($outkey, $outvalue) = $q->_from_ra(); |
271
|
|
|
|
|
|
|
($outkey, $outvalue) = $q->_from_object(); |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
The base class only includes one to one mappings. |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
=over 4 |
276
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
=item B<_translate_one_to_one> |
278
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
Return a list of internal options (as defined in C<_get_allowed_options>) |
280
|
|
|
|
|
|
|
that are known to support a one-to-one mapping of the internal value |
281
|
|
|
|
|
|
|
to the external value. |
282
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
%one = $q->_translate_one_to_one(); |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
Returns a hash with keys and no values (this makes it easy to |
286
|
|
|
|
|
|
|
check for the option). |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
This method also returns the values from the parent class. |
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
=cut |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
sub _translate_one_to_one { |
293
|
|
|
|
|
|
|
my $self = shift; |
294
|
|
|
|
|
|
|
# convert to a hash-list |
295
|
|
|
|
|
|
|
return ($self->SUPER::_translate_one_to_one, |
296
|
|
|
|
|
|
|
map { $_, undef }(qw/ year month day obscode |
297
|
|
|
|
|
|
|
ra dec radius limit |
298
|
|
|
|
|
|
|
which mot tmot mpcsort |
299
|
|
|
|
|
|
|
needed ps type textarea |
300
|
|
|
|
|
|
|
/) |
301
|
|
|
|
|
|
|
); |
302
|
|
|
|
|
|
|
} |
303
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
=back |
305
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
=end __PRIVATE_METHODS__ |
307
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
=head1 COPYRIGHT |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
Copyright (C) 2004 Particle Physics and Astronomy Research |
311
|
|
|
|
|
|
|
Council. All Rights Reserved. |
312
|
|
|
|
|
|
|
|
313
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or |
314
|
|
|
|
|
|
|
modify it under the terms of the GNU Public License. |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
=head1 AUTHORS |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
Brad Cavanagh Eb.cavanagh@jach.hawaii.eduE |
319
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
=cut |
321
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
1; |