line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Astro::WaveBand; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
=head1 NAME |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
Astro::WaveBand - Transparently work in waveband, wavelength or filter |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=head1 SYNOPSIS |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
use Astro::WaveBand; |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
$w = new Astro::WaveBand( Filter => $filter ); |
12
|
|
|
|
|
|
|
$w = new Astro::WaveBand( Wavelength => $wavelength ); |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
$w = new Astro::WaveBand( Wavelength => $wavelength, |
15
|
|
|
|
|
|
|
Instrument => 'CGS4' ); |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
$filter = $w->filter; |
18
|
|
|
|
|
|
|
$wave = $w->wavelength; |
19
|
|
|
|
|
|
|
$band = $w->waveband; # radio, xray, submm |
20
|
|
|
|
|
|
|
$freq = $w->frequency; |
21
|
|
|
|
|
|
|
$wnum = $w->wavenumber; |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
$natural= $w->natural; |
24
|
|
|
|
|
|
|
$natural = "$w"; |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
$w->natural_unit("wavelength"); |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
if( $w1 > $w2 ) { ... } |
29
|
|
|
|
|
|
|
if( $w1 == $w2 ) { ... } |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
=head1 DESCRIPTION |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
Class to transparently deal with the conversion between filters, |
34
|
|
|
|
|
|
|
wavelength, frequency and other methods of specifying a location |
35
|
|
|
|
|
|
|
in the electro-magentic spectrum. |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
The class tries to determine the natural form of the numbers such that |
38
|
|
|
|
|
|
|
a request for a summary of the object when it contains 2.2 microns |
39
|
|
|
|
|
|
|
would return the filter name but would return the wavelength if it was |
40
|
|
|
|
|
|
|
not a standard filter. In ambiguous cases an instrument name is |
41
|
|
|
|
|
|
|
required to decide what to return. In really ambiguous cases the user |
42
|
|
|
|
|
|
|
can specify the unit in which to display the numbers on |
43
|
|
|
|
|
|
|
stringification. |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
Used mainly as a way of storing a single number in a database table |
46
|
|
|
|
|
|
|
but using logic to determine the number that an observer is most likely |
47
|
|
|
|
|
|
|
to understand. |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
Numerical comparison operators can be used to compare two C |
50
|
|
|
|
|
|
|
objects. When checking equality, the "natural" and "instrument" methods are |
51
|
|
|
|
|
|
|
used, so if two C objects return the same value from those |
52
|
|
|
|
|
|
|
methods, they are considered to be equal. When checking other comparisons |
53
|
|
|
|
|
|
|
such as greater than, the wavelength is used. |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=cut |
56
|
|
|
|
|
|
|
|
57
|
1
|
|
|
1
|
|
26930
|
use 5.006; |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
49
|
|
58
|
1
|
|
|
1
|
|
7
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
43
|
|
59
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
8
|
|
|
1
|
|
|
|
|
36
|
|
60
|
1
|
|
|
1
|
|
7
|
use Carp; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
121
|
|
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
# Register an Astro::WaveBand warning category |
63
|
1
|
|
|
1
|
|
6
|
use warnings::register; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
254
|
|
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
# CVS version: $Revision$ |
66
|
|
|
|
|
|
|
our $VERSION = 0.09; |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
# Overloading |
69
|
1
|
|
|
|
|
8
|
use overload '""' => "natural", |
70
|
|
|
|
|
|
|
'==' => "equals", |
71
|
|
|
|
|
|
|
'!=' => "not_equals", |
72
|
|
|
|
|
|
|
'<=>' => "compare", |
73
|
1
|
|
|
1
|
|
2174
|
'fallback' => 1; |
|
1
|
|
|
|
|
1216
|
|
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
# Constants |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
# Speed of light in m/s |
78
|
1
|
|
|
1
|
|
128
|
use constant CLIGHT => 299792458; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
3475
|
|
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
# list of instruments specific to a telescope |
81
|
|
|
|
|
|
|
my %TELESCOPE = ( |
82
|
|
|
|
|
|
|
UKIRT => [ "IRCAM", "UFTI", "UIST", "MICHELLE", "WFCAM" ], |
83
|
|
|
|
|
|
|
JCMT => [ "SCUBA", "RXA3", "RXA3M", "RXB3", "RXW", "DAS" ] ); |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
# Continuum Filters are keyed by instrument |
86
|
|
|
|
|
|
|
# although if an instrument is not specified the filters |
87
|
|
|
|
|
|
|
# hash will be searched for a match if none is available in |
88
|
|
|
|
|
|
|
# GENERIC |
89
|
|
|
|
|
|
|
my %FILTERS = ( |
90
|
|
|
|
|
|
|
GENERIC => { |
91
|
|
|
|
|
|
|
U => 0.365, |
92
|
|
|
|
|
|
|
B => 0.44, |
93
|
|
|
|
|
|
|
V => 0.55, |
94
|
|
|
|
|
|
|
R => 0.70, |
95
|
|
|
|
|
|
|
I => 0.90, |
96
|
|
|
|
|
|
|
J => 1.25, |
97
|
|
|
|
|
|
|
H => 1.65, |
98
|
|
|
|
|
|
|
K => 2.2, |
99
|
|
|
|
|
|
|
L => 3.45, |
100
|
|
|
|
|
|
|
M => 4.7, |
101
|
|
|
|
|
|
|
N =>10.2, |
102
|
|
|
|
|
|
|
Q =>20.0, |
103
|
|
|
|
|
|
|
up => 0.355, |
104
|
|
|
|
|
|
|
gp => 0.470, |
105
|
|
|
|
|
|
|
rp => 0.620, |
106
|
|
|
|
|
|
|
ip => 0.750, |
107
|
|
|
|
|
|
|
zp => 0.880, |
108
|
|
|
|
|
|
|
Pu => 0.355, |
109
|
|
|
|
|
|
|
Pg => 0.470, |
110
|
|
|
|
|
|
|
Pr => 0.620, |
111
|
|
|
|
|
|
|
Pi => 0.750, |
112
|
|
|
|
|
|
|
Pz => 0.880, |
113
|
|
|
|
|
|
|
Y => 1.020, # this will get incorrectly classed as infrared |
114
|
|
|
|
|
|
|
w => 0.608, |
115
|
|
|
|
|
|
|
SO => 0.600, |
116
|
|
|
|
|
|
|
}, |
117
|
|
|
|
|
|
|
WFCAM => { |
118
|
|
|
|
|
|
|
"Z" => 0.83, |
119
|
|
|
|
|
|
|
"Y" => 0.97, |
120
|
|
|
|
|
|
|
"J" => 1.17, |
121
|
|
|
|
|
|
|
"H" => 1.49, |
122
|
|
|
|
|
|
|
"K" => 2.03, |
123
|
|
|
|
|
|
|
"1-0S1" => 2.111, |
124
|
|
|
|
|
|
|
"BGamma"=> 2.155, |
125
|
|
|
|
|
|
|
"1.205nbJ" => 1.205, |
126
|
|
|
|
|
|
|
"1.619nbH" => 1.619, |
127
|
|
|
|
|
|
|
"1.644FeII" => 1.631, |
128
|
|
|
|
|
|
|
"Blank" => 0, |
129
|
|
|
|
|
|
|
}, |
130
|
|
|
|
|
|
|
IRCAM => { |
131
|
|
|
|
|
|
|
"J98" => "1.250" , |
132
|
|
|
|
|
|
|
"H98" => "1.635" , |
133
|
|
|
|
|
|
|
"K98" => "2.150" , |
134
|
|
|
|
|
|
|
"Lp98" => "3.6" , |
135
|
|
|
|
|
|
|
"Mp98" => "4.800" , |
136
|
|
|
|
|
|
|
"2.1c" => "2.100" , |
137
|
|
|
|
|
|
|
"2.122S1" => "2.122" , |
138
|
|
|
|
|
|
|
"BrG" => "2.0" , |
139
|
|
|
|
|
|
|
"2.2c" => "2.200" , |
140
|
|
|
|
|
|
|
"2.248S1" => "2.248" , |
141
|
|
|
|
|
|
|
"3.6nbLp" => "3.6" , |
142
|
|
|
|
|
|
|
"4.0c" => "4.000" , |
143
|
|
|
|
|
|
|
"BrA" => "4.0" , |
144
|
|
|
|
|
|
|
"Ice" => "3.1" , |
145
|
|
|
|
|
|
|
"Dust" => "3.28" , |
146
|
|
|
|
|
|
|
"3.4nbL" => "3.4" , |
147
|
|
|
|
|
|
|
"3.5mbL" => "3.5" , |
148
|
|
|
|
|
|
|
}, |
149
|
|
|
|
|
|
|
UFTI => { |
150
|
|
|
|
|
|
|
"Y_MK" => "1.022", |
151
|
|
|
|
|
|
|
"I" => "0.9" , |
152
|
|
|
|
|
|
|
"Z" => "1.033", |
153
|
|
|
|
|
|
|
"J98" => "1.250", |
154
|
|
|
|
|
|
|
"H98" => "1.635", |
155
|
|
|
|
|
|
|
"K98" => "2.150", |
156
|
|
|
|
|
|
|
"Kprime" =>"2.120", |
157
|
|
|
|
|
|
|
"1.644" => "1.644", |
158
|
|
|
|
|
|
|
'1.69CH4_l' => '1.690', |
159
|
|
|
|
|
|
|
"1.57" => "1.57" , |
160
|
|
|
|
|
|
|
"2.122" => "2.122", |
161
|
|
|
|
|
|
|
"2.122MK" => "2.122", |
162
|
|
|
|
|
|
|
"BrG" => "2.166", |
163
|
|
|
|
|
|
|
"BrGz" => "2.173", |
164
|
|
|
|
|
|
|
"2.248S(1)" => "2.248", |
165
|
|
|
|
|
|
|
"2.27" => "2.270", |
166
|
|
|
|
|
|
|
"Blank" => "-2.222",# -ve version of OT wavelength |
167
|
|
|
|
|
|
|
"Mask" => "-2.32", # ditto |
168
|
|
|
|
|
|
|
}, |
169
|
|
|
|
|
|
|
UIST => { |
170
|
|
|
|
|
|
|
# "K-target" => 1.64, # old |
171
|
|
|
|
|
|
|
"Y_MK" => 1.022, |
172
|
|
|
|
|
|
|
"ZMK" => 1.033, |
173
|
|
|
|
|
|
|
"Hartmann" => 1.64, |
174
|
|
|
|
|
|
|
"J98" => 1.25, |
175
|
|
|
|
|
|
|
"H98" => 1.64, |
176
|
|
|
|
|
|
|
"1.57" => 1.573, |
177
|
|
|
|
|
|
|
"1.66" => 1.664, # old |
178
|
|
|
|
|
|
|
"1.58CH4_s" => 1.604, |
179
|
|
|
|
|
|
|
"1.69CH4_l" => 1.674, |
180
|
|
|
|
|
|
|
"1.644Fe" => 1.643, # |
181
|
|
|
|
|
|
|
"K98" => 2.20, |
182
|
|
|
|
|
|
|
"Kshort" => 2.159, |
183
|
|
|
|
|
|
|
"Klong" => 2.227, |
184
|
|
|
|
|
|
|
"2.122S(1)" => 2.121, # |
185
|
|
|
|
|
|
|
"2.122MK" => 2.127, |
186
|
|
|
|
|
|
|
"2.248S(1)" => 2.248, |
187
|
|
|
|
|
|
|
"2.248MK" => 2.263, |
188
|
|
|
|
|
|
|
"BrG" => 2.166, |
189
|
|
|
|
|
|
|
"2.27" => 2.274, |
190
|
|
|
|
|
|
|
"2.32CO" => 2.324, # old |
191
|
|
|
|
|
|
|
"2.42CO" => 2.425, |
192
|
|
|
|
|
|
|
"3.05ice" => 3.048, |
193
|
|
|
|
|
|
|
"Dust" => 3.278, |
194
|
|
|
|
|
|
|
"3.30PAH" => 3.286, |
195
|
|
|
|
|
|
|
"3.4nbL" => 3.415, |
196
|
|
|
|
|
|
|
"3.5mbL" => 3.489, |
197
|
|
|
|
|
|
|
"3.6nbLp" => 3.593, |
198
|
|
|
|
|
|
|
"3.99" => 3.990, |
199
|
|
|
|
|
|
|
"BrA" => 4.053, |
200
|
|
|
|
|
|
|
"Lp98" => 3.77, |
201
|
|
|
|
|
|
|
"Mp98" => 4.69, |
202
|
|
|
|
|
|
|
}, |
203
|
|
|
|
|
|
|
MICHELLE => { |
204
|
|
|
|
|
|
|
"F105B53" => 10.5, |
205
|
|
|
|
|
|
|
"F79B10" => 7.9, |
206
|
|
|
|
|
|
|
"F88B10" => 8.8, |
207
|
|
|
|
|
|
|
"F97B10" => 9.7, |
208
|
|
|
|
|
|
|
"F103B10" => 10.3, |
209
|
|
|
|
|
|
|
"F116B9" => 11.6, |
210
|
|
|
|
|
|
|
"F125B9" => 12.5, |
211
|
|
|
|
|
|
|
"F107B4" => 10.7, |
212
|
|
|
|
|
|
|
"F122B3" => 12.2, |
213
|
|
|
|
|
|
|
"F128B2" => 12.8, |
214
|
|
|
|
|
|
|
"F209B42" => 20.9, |
215
|
|
|
|
|
|
|
"F185B9" => 18.5, |
216
|
|
|
|
|
|
|
"NBlock" => 10.6, |
217
|
|
|
|
|
|
|
"QBlock" => 20.9, |
218
|
|
|
|
|
|
|
"F22B15" => 2.2, |
219
|
|
|
|
|
|
|
"F34B9" => 3.4, |
220
|
|
|
|
|
|
|
"F47B5" => 4.7, |
221
|
|
|
|
|
|
|
}, |
222
|
|
|
|
|
|
|
SCUBA => { |
223
|
|
|
|
|
|
|
"850W" => 863, |
224
|
|
|
|
|
|
|
"450W" => 443, |
225
|
|
|
|
|
|
|
"450N" => 442, |
226
|
|
|
|
|
|
|
"850N" => 862, |
227
|
|
|
|
|
|
|
"750N" => 741, |
228
|
|
|
|
|
|
|
"350N" => 344, |
229
|
|
|
|
|
|
|
"P2000" => 2000, |
230
|
|
|
|
|
|
|
"P1350" => 1350, |
231
|
|
|
|
|
|
|
"P1100" => 1100, |
232
|
|
|
|
|
|
|
# This is a kluge until the class can |
233
|
|
|
|
|
|
|
# be extended to support multiple wavelength |
234
|
|
|
|
|
|
|
# instruments. |
235
|
|
|
|
|
|
|
"850S:PHOT" => 1100, |
236
|
|
|
|
|
|
|
"450W:850W" => 443, |
237
|
|
|
|
|
|
|
"450N:850N" => 442, |
238
|
|
|
|
|
|
|
"350N:750N" => 344, |
239
|
|
|
|
|
|
|
}, |
240
|
|
|
|
|
|
|
'SCUBA-2' => { |
241
|
|
|
|
|
|
|
850 => 863, # guesses |
242
|
|
|
|
|
|
|
450 => 445, |
243
|
|
|
|
|
|
|
}, |
244
|
|
|
|
|
|
|
); |
245
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
# Instruments that have natural units |
247
|
|
|
|
|
|
|
my %NATURAL = ( |
248
|
|
|
|
|
|
|
WFCAM => 'filter', |
249
|
|
|
|
|
|
|
CGS4 => 'wavelength', |
250
|
|
|
|
|
|
|
SCUBA => 'filter', |
251
|
|
|
|
|
|
|
'SCUBA-2' => 'filter', |
252
|
|
|
|
|
|
|
UFTI => 'filter', |
253
|
|
|
|
|
|
|
IRCAM => 'filter', |
254
|
|
|
|
|
|
|
MICHELLE => 'filter', |
255
|
|
|
|
|
|
|
ACSIS => 'frequency', |
256
|
|
|
|
|
|
|
DAS => 'frequency', |
257
|
|
|
|
|
|
|
RXA3 => 'frequency', |
258
|
|
|
|
|
|
|
RXA3M => 'frequency', |
259
|
|
|
|
|
|
|
RXB3 => 'frequency', |
260
|
|
|
|
|
|
|
RXW => 'frequency', |
261
|
|
|
|
|
|
|
RXWB => 'frequency', |
262
|
|
|
|
|
|
|
RXWC => 'frequency', |
263
|
|
|
|
|
|
|
RXWD => 'frequency', |
264
|
|
|
|
|
|
|
RXWD2 => 'frequency', |
265
|
|
|
|
|
|
|
HARP => 'frequency', |
266
|
|
|
|
|
|
|
UIST => 'filter', |
267
|
|
|
|
|
|
|
); |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
=head1 METHODS |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
=head2 Constructor |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
=over 4 |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
=item B |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
Create a new instance of an C object. |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
$w = new Astro::WaveBand( Filter => $filter ); |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
Allowed keys for constructor are one of: |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
Filter - filter name |
285
|
|
|
|
|
|
|
Wavelength - wavelength in microns |
286
|
|
|
|
|
|
|
Frequency - frequency in Hertz |
287
|
|
|
|
|
|
|
Wavenumber - wavenumber in cm^-1 |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
plus optionally: |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
Instrument - name of associated instrument |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
In the future there may be a C key to allow the units to be |
294
|
|
|
|
|
|
|
supplied in alternative forms. |
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
If a mandatory key is missing or there is more than one |
297
|
|
|
|
|
|
|
mandatory key the constructor will fail and return C. |
298
|
|
|
|
|
|
|
Additionally a warning (of class C) will |
299
|
|
|
|
|
|
|
be issued. |
300
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
=cut |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
sub new { |
304
|
28
|
|
|
28
|
1
|
15535
|
my $proto = shift; |
305
|
28
|
|
33
|
|
|
162
|
my $class = ref($proto) || $proto; |
306
|
|
|
|
|
|
|
|
307
|
28
|
|
|
|
|
93
|
my %args = @_; |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
# Check the hash contains one of the following |
310
|
28
|
|
|
|
|
79
|
my @keys = qw/ Filter Wavelength Frequency Wavenumber /; |
311
|
28
|
|
|
|
|
45
|
my $found = 0; |
312
|
28
|
|
|
|
|
53
|
for my $key (@keys) { |
313
|
112
|
100
|
|
|
|
270
|
$found++ if exists $args{$key}; |
314
|
|
|
|
|
|
|
} |
315
|
|
|
|
|
|
|
|
316
|
28
|
100
|
|
|
|
99
|
if ($found == 0) { |
|
|
100
|
|
|
|
|
|
317
|
2
|
50
|
|
|
|
126
|
warnings::warn("Missing a mandatory key") |
318
|
|
|
|
|
|
|
if warnings::enabled(); |
319
|
2
|
|
|
|
|
7
|
return undef; |
320
|
|
|
|
|
|
|
} elsif ($found > 1) { |
321
|
1
|
50
|
|
|
|
111
|
warnings::warn("More than one mandatory key") |
322
|
|
|
|
|
|
|
if warnings::enabled(); |
323
|
1
|
|
|
|
|
5
|
return undef; |
324
|
|
|
|
|
|
|
} |
325
|
|
|
|
|
|
|
|
326
|
25
|
|
|
|
|
120
|
my $w = bless { Cache => {} }, $class; |
327
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
# Now insert the information into the object |
329
|
|
|
|
|
|
|
# Do Instrument first since we may need it to convert |
330
|
|
|
|
|
|
|
# filter to wavelength |
331
|
25
|
100
|
|
|
|
64
|
if (exists $args{Instrument}) { |
332
|
18
|
|
|
|
|
45
|
$w->instrument( $args{Instrument}); |
333
|
|
|
|
|
|
|
} |
334
|
|
|
|
|
|
|
|
335
|
25
|
|
|
|
|
67
|
for my $key (keys %args) { |
336
|
43
|
|
|
|
|
65
|
my $method = lc($key); |
337
|
43
|
100
|
|
|
|
123
|
next if $method eq 'instrument'; |
338
|
25
|
50
|
|
|
|
109
|
if ($w->can($method)) { |
339
|
25
|
|
|
|
|
64
|
$w->$method( $args{$key}); |
340
|
|
|
|
|
|
|
} |
341
|
|
|
|
|
|
|
} |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
# We are now done so just return the object |
344
|
25
|
|
|
|
|
99
|
return $w; |
345
|
|
|
|
|
|
|
} |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=back |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
=head2 Accessor methods |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
All the accessor methods associated with conversions will |
352
|
|
|
|
|
|
|
automatically convert to the correct format on demand and will cache |
353
|
|
|
|
|
|
|
it for later. If a new value is provided all caches will be cleared. |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
All input values are converted to microns internally (since a |
356
|
|
|
|
|
|
|
single base unit should be chosen to simplify internal conversions). |
357
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
=over 4 |
359
|
|
|
|
|
|
|
|
360
|
|
|
|
|
|
|
=item B |
361
|
|
|
|
|
|
|
|
362
|
|
|
|
|
|
|
Wavelength in microns. |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
$wav = $w->wavelength; |
365
|
|
|
|
|
|
|
$w->wavelength(450.0); |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
=cut |
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
sub wavelength { |
370
|
54
|
|
|
54
|
1
|
13629
|
my $self = shift; |
371
|
54
|
100
|
|
|
|
119
|
if (@_) { |
372
|
8
|
|
|
|
|
12
|
my $value = shift; |
373
|
8
|
|
|
|
|
20
|
$self->_store_in_cache('wavelength' => $value); |
374
|
|
|
|
|
|
|
} else { |
375
|
46
|
|
|
|
|
116
|
return $self->_fetch_from_cache( 'wavelength' ); |
376
|
|
|
|
|
|
|
} |
377
|
8
|
|
|
|
|
16
|
return; |
378
|
|
|
|
|
|
|
} |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
=item B |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
Frequency in Hertz. |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
$frequency = $w->frequency; |
385
|
|
|
|
|
|
|
$w->frequency(345E9); |
386
|
|
|
|
|
|
|
|
387
|
|
|
|
|
|
|
=cut |
388
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
sub frequency { |
390
|
8
|
|
|
8
|
1
|
1933
|
my $self = shift; |
391
|
8
|
100
|
|
|
|
22
|
if (@_) { |
392
|
3
|
|
|
|
|
7
|
my $value = shift; |
393
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
# store value and wavelength in cache |
395
|
3
|
|
|
|
|
9
|
$self->_cache_value_and_wav( 'frequency', $value); |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
} else { |
398
|
|
|
|
|
|
|
# Read value from the cache |
399
|
5
|
|
|
|
|
17
|
return $self->_read_value_with_convert( "frequency" ); |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
} |
402
|
|
|
|
|
|
|
|
403
|
3
|
|
|
|
|
10
|
return; |
404
|
|
|
|
|
|
|
} |
405
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=item B |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
Wavenumber (reciprocal of wavelength) in inverse centimetres. |
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
$value = $w->wavenumber; |
411
|
|
|
|
|
|
|
$w->wavenumber(1500); |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
=cut |
414
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
sub wavenumber { |
416
|
11
|
|
|
11
|
1
|
6801
|
my $self = shift; |
417
|
11
|
100
|
|
|
|
39
|
if (@_) { |
418
|
1
|
|
|
|
|
2
|
my $value = shift; |
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
# store value and wavelength in cache |
421
|
1
|
|
|
|
|
5
|
$self->_cache_value_and_wav( 'wavenumber', $value); |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
} else { |
424
|
|
|
|
|
|
|
# Read value from the cache |
425
|
10
|
|
|
|
|
31
|
return $self->_read_value_with_convert( "wavenumber" ); |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
} |
428
|
|
|
|
|
|
|
|
429
|
1
|
|
|
|
|
3
|
return; |
430
|
|
|
|
|
|
|
} |
431
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
=item B |
433
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
Set or retrieve filter name. |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
Returns C if the filter can not be determined. If the filter |
437
|
|
|
|
|
|
|
name can not be translated to a wavelength it will not be possible |
438
|
|
|
|
|
|
|
to do any conversions to other forms. |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
=cut |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
sub filter { |
443
|
55
|
|
|
55
|
1
|
22933
|
my $self = shift; |
444
|
55
|
100
|
|
|
|
123
|
if (@_) { |
445
|
13
|
|
|
|
|
21
|
my $value = shift; |
446
|
|
|
|
|
|
|
|
447
|
|
|
|
|
|
|
# store value and wavelength in cache |
448
|
13
|
|
|
|
|
35
|
$self->_cache_value_and_wav( 'filter', $value); |
449
|
|
|
|
|
|
|
|
450
|
|
|
|
|
|
|
} else { |
451
|
|
|
|
|
|
|
# Read value from the cache |
452
|
42
|
|
|
|
|
104
|
return $self->_read_value_with_convert( "filter" ); |
453
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
} |
455
|
|
|
|
|
|
|
|
456
|
13
|
|
|
|
|
32
|
return; |
457
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
} |
459
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
=item B |
462
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
Name of associated instrument. |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
$inst = $w->instrument; |
466
|
|
|
|
|
|
|
$w->instrument( 'SCUBA' ); |
467
|
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
Used to aid in the choice of natural unit. |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
=cut |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
sub instrument { |
473
|
81
|
|
|
81
|
1
|
94
|
my $self = shift; |
474
|
81
|
100
|
|
|
|
158
|
if (@_) { $self->{Instrument} = uc(shift); } |
|
18
|
|
|
|
|
98
|
|
475
|
81
|
|
|
|
|
206
|
return $self->{Instrument}; |
476
|
|
|
|
|
|
|
} |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
=item B |
479
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
Override the natural unit to be used for stringification. If this |
481
|
|
|
|
|
|
|
value is not set the class will determine the unit of choice by |
482
|
|
|
|
|
|
|
looking at the instrument name and then by taking an informed guess. |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
$w->natural_unit('filter'); |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
=cut |
487
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
sub natural_unit { |
489
|
26
|
|
|
26
|
1
|
29
|
my $self = shift; |
490
|
26
|
50
|
|
|
|
77
|
if (@_) { $self->{NaturalUnit} = shift; } |
|
0
|
|
|
|
|
0
|
|
491
|
26
|
|
|
|
|
59
|
return $self->{NaturalUnit}; |
492
|
|
|
|
|
|
|
} |
493
|
|
|
|
|
|
|
|
494
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
=back |
496
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
=head2 General Methods |
498
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
=over 4 |
500
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
=item B |
502
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
Return the name of the waveband associated with the object. |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
Returns C if none can be determined. |
506
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
$band = $w->waveband; |
508
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
=cut |
510
|
|
|
|
|
|
|
|
511
|
|
|
|
|
|
|
sub waveband { |
512
|
19
|
|
|
19
|
1
|
12556
|
my $self = shift; |
513
|
|
|
|
|
|
|
|
514
|
19
|
|
|
|
|
58
|
my $lambda = $self->wavelength; |
515
|
19
|
50
|
|
|
|
47
|
return undef unless defined $lambda; |
516
|
|
|
|
|
|
|
|
517
|
19
|
|
|
|
|
23
|
my $band; |
518
|
19
|
100
|
33
|
|
|
254
|
if ($lambda >= 10000 ) { # > 1cm |
|
|
50
|
66
|
|
|
|
|
|
|
100
|
66
|
|
|
|
|
|
|
100
|
33
|
|
|
|
|
|
|
50
|
0
|
|
|
|
|
|
|
0
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
519
|
1
|
|
|
|
|
2
|
$band = 'radio'; |
520
|
|
|
|
|
|
|
} elsif ($lambda < 10000 and $lambda >= 1000) { |
521
|
0
|
|
|
|
|
0
|
$band = 'mm'; |
522
|
|
|
|
|
|
|
} elsif ($lambda < 1000 and $lambda >= 100) { |
523
|
3
|
|
|
|
|
5
|
$band = 'submm'; |
524
|
|
|
|
|
|
|
} elsif ($lambda < 100 and $lambda >= 1) { |
525
|
11
|
|
|
|
|
18
|
$band = 'infrared'; |
526
|
|
|
|
|
|
|
} elsif ($lambda < 1 and $lambda >= 0.3) { |
527
|
4
|
|
|
|
|
9
|
$band = 'optical'; |
528
|
|
|
|
|
|
|
} elsif ($lambda < 0.3 and $lambda >= 0.01) { |
529
|
0
|
|
|
|
|
0
|
$band = 'ultraviolet'; |
530
|
|
|
|
|
|
|
} elsif ($lambda < 0.01 and $lambda >= 0.00001) { |
531
|
0
|
|
|
|
|
0
|
$band = 'x-ray'; |
532
|
|
|
|
|
|
|
} elsif ($lambda < 0.00001) { |
533
|
0
|
|
|
|
|
0
|
$band = 'gamma-ray'; |
534
|
|
|
|
|
|
|
} |
535
|
|
|
|
|
|
|
|
536
|
19
|
|
|
|
|
51
|
return $band; |
537
|
|
|
|
|
|
|
} |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
=item B |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
Return the contents of the object in its most natural form. For |
542
|
|
|
|
|
|
|
example, with UFTI the filter name will be returned whereas with ACSIS |
543
|
|
|
|
|
|
|
the frequency will be returned. The choice of unit is chosen using |
544
|
|
|
|
|
|
|
the supplied default unit (see C) or the instrument name. |
545
|
|
|
|
|
|
|
If none of these is specified filter will be used and if no match is |
546
|
|
|
|
|
|
|
present wavelength in microns. |
547
|
|
|
|
|
|
|
|
548
|
|
|
|
|
|
|
$value = $w->natural; |
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
Returns C if the value can not be determined. |
551
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
This method is called automatically when the object is stringified. |
553
|
|
|
|
|
|
|
Note that you will not know the unit that was chosen a priori. |
554
|
|
|
|
|
|
|
|
555
|
|
|
|
|
|
|
=cut |
556
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
sub natural { |
558
|
26
|
|
|
26
|
1
|
12146
|
my $self = shift; |
559
|
|
|
|
|
|
|
|
560
|
|
|
|
|
|
|
# First see if the default unit is set |
561
|
26
|
|
|
|
|
62
|
my $unit = $self->natural_unit; |
562
|
|
|
|
|
|
|
|
563
|
26
|
50
|
|
|
|
57
|
unless (defined $unit) { |
564
|
|
|
|
|
|
|
# Check the instrument |
565
|
26
|
|
|
|
|
60
|
my $inst = $self->instrument; |
566
|
26
|
100
|
66
|
|
|
130
|
if ($inst and exists $NATURAL{$inst}) { |
567
|
18
|
|
|
|
|
36
|
$unit = $NATURAL{$inst}; |
568
|
|
|
|
|
|
|
} |
569
|
|
|
|
|
|
|
} |
570
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
# Guess at filter if we have no choice |
572
|
26
|
100
|
|
|
|
61
|
$unit = 'filter' unless defined $unit; |
573
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
# retrieve the value |
575
|
26
|
|
|
|
|
31
|
my $value; |
576
|
26
|
50
|
|
|
|
102
|
if ($self->can($unit)) { |
577
|
26
|
|
|
|
|
53
|
$value = $self->$unit(); |
578
|
|
|
|
|
|
|
} |
579
|
|
|
|
|
|
|
|
580
|
|
|
|
|
|
|
# All else fails... try wavelength |
581
|
26
|
100
|
|
|
|
67
|
$value = $self->wavelength() unless defined $value; |
582
|
|
|
|
|
|
|
|
583
|
26
|
|
|
|
|
73
|
return $value; |
584
|
|
|
|
|
|
|
} |
585
|
|
|
|
|
|
|
|
586
|
|
|
|
|
|
|
=item B |
587
|
|
|
|
|
|
|
|
588
|
|
|
|
|
|
|
Compares two C objects. |
589
|
|
|
|
|
|
|
|
590
|
|
|
|
|
|
|
if( $wb1->compare( $wb2 ) ) { ... } |
591
|
|
|
|
|
|
|
|
592
|
|
|
|
|
|
|
This method will return -1 if, in the above example, $wb1 is of |
593
|
|
|
|
|
|
|
a shorter wavelength than $wb2, 0 if the wavelengths are equal, |
594
|
|
|
|
|
|
|
and +1 if $wb1 is of a longer wavelength than $wb2. Please note |
595
|
|
|
|
|
|
|
that for strict waveband equality the C method should be |
596
|
|
|
|
|
|
|
used, as that method uses the C method to check if two |
597
|
|
|
|
|
|
|
wavebands are identical. |
598
|
|
|
|
|
|
|
|
599
|
|
|
|
|
|
|
This method is overloaded with the standard numerical comparison |
600
|
|
|
|
|
|
|
operators, so to check if one waveband is shorter than another |
601
|
|
|
|
|
|
|
you would do |
602
|
|
|
|
|
|
|
|
603
|
|
|
|
|
|
|
if( $wb1 < $wb2 ) { ... } |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
and it will work as you expect. This method does not overload |
606
|
|
|
|
|
|
|
the == operator; see the C method for that. |
607
|
|
|
|
|
|
|
|
608
|
|
|
|
|
|
|
=cut |
609
|
|
|
|
|
|
|
|
610
|
|
|
|
|
|
|
sub compare { |
611
|
2
|
|
|
2
|
1
|
6
|
my ( $object1, $object2, $was_reversed ) = @_; |
612
|
2
|
50
|
|
|
|
9
|
( $object1, $object2 ) = ( $object2, $object1 ) if $was_reversed; |
613
|
|
|
|
|
|
|
|
614
|
2
|
|
|
|
|
8
|
return $object1->wavelength <=> $object2->wavelength; |
615
|
|
|
|
|
|
|
} |
616
|
|
|
|
|
|
|
|
617
|
|
|
|
|
|
|
=item B |
618
|
|
|
|
|
|
|
|
619
|
|
|
|
|
|
|
Compares two C objects for equality. |
620
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
if( $wb1->equals( $wb2 ) ) { ... } |
622
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
This method will return 1 if, in the above example, both |
624
|
|
|
|
|
|
|
C objects return the same value from the |
625
|
|
|
|
|
|
|
C method AND for the C method (if it |
626
|
|
|
|
|
|
|
is defined for both objects) , and 0 of they return different values. |
627
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
This method is overloaded using the == operator, so |
629
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
if( $wb1 == $wb2 ) { ... } |
631
|
|
|
|
|
|
|
|
632
|
|
|
|
|
|
|
is functionally the same as the first example. |
633
|
|
|
|
|
|
|
|
634
|
|
|
|
|
|
|
=cut |
635
|
|
|
|
|
|
|
|
636
|
|
|
|
|
|
|
sub equals { |
637
|
3
|
|
|
3
|
1
|
9
|
my $self = shift; |
638
|
3
|
|
|
|
|
5
|
my $comp = shift; |
639
|
|
|
|
|
|
|
|
640
|
3
|
100
|
66
|
|
|
7
|
if( defined( $self->instrument ) && defined( $comp->instrument ) ) { |
641
|
1
|
|
33
|
|
|
4
|
return ( ( $self->natural eq $comp->natural ) && |
642
|
|
|
|
|
|
|
( $self->instrument eq $comp->instrument ) ); |
643
|
|
|
|
|
|
|
} else { |
644
|
2
|
|
|
|
|
6
|
return ( $self->natural eq $comp->natural ); |
645
|
|
|
|
|
|
|
} |
646
|
|
|
|
|
|
|
} |
647
|
|
|
|
|
|
|
|
648
|
|
|
|
|
|
|
=item B |
649
|
|
|
|
|
|
|
|
650
|
|
|
|
|
|
|
Compares two C objects for inequality. |
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
if( $wb1->not_equals( $wb2 ) ) { ... } |
653
|
|
|
|
|
|
|
|
654
|
|
|
|
|
|
|
This method will return 1 if, in the above example, either the |
655
|
|
|
|
|
|
|
C method or the C method return different |
656
|
|
|
|
|
|
|
values. If the instrument is undefined for either object, then |
657
|
|
|
|
|
|
|
the C method will be used. |
658
|
|
|
|
|
|
|
|
659
|
|
|
|
|
|
|
This method is overloaded using the != operator, so |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
if( $wb1 != $wb2 ) { ... } |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
is functionally the same as the first example. |
664
|
|
|
|
|
|
|
|
665
|
|
|
|
|
|
|
=cut |
666
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
sub not_equals { |
668
|
1
|
|
|
1
|
1
|
7
|
my $self = shift; |
669
|
1
|
|
|
|
|
2
|
my $comp = shift; |
670
|
|
|
|
|
|
|
|
671
|
1
|
50
|
33
|
|
|
3
|
if( ! defined( $self->instrument ) || ! defined( $comp->instrument ) ) { |
672
|
0
|
|
|
|
|
0
|
return ( $self->natural ne $comp->natural ); |
673
|
|
|
|
|
|
|
} else { |
674
|
1
|
|
33
|
|
|
4
|
return ( ( $self->natural ne $comp->natural ) || |
675
|
|
|
|
|
|
|
( $self->instrument ne $comp->instrument ) ); |
676
|
|
|
|
|
|
|
} |
677
|
|
|
|
|
|
|
} |
678
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
=back |
680
|
|
|
|
|
|
|
|
681
|
|
|
|
|
|
|
=begin __PRIVATE_METHODS__ |
682
|
|
|
|
|
|
|
|
683
|
|
|
|
|
|
|
=head2 Private Methods |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
=over 4 |
686
|
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
=item B<_cache> |
688
|
|
|
|
|
|
|
|
689
|
|
|
|
|
|
|
Retrieve the hash reference associated with the cache (in a scalar |
690
|
|
|
|
|
|
|
context) or the contents of the hash (in a list context). |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
$ref = $w->cache; |
693
|
|
|
|
|
|
|
%cache = $w->cache; |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
=cut |
696
|
|
|
|
|
|
|
|
697
|
|
|
|
|
|
|
sub _cache { |
698
|
169
|
|
|
169
|
|
199
|
my $self = shift; |
699
|
169
|
50
|
|
|
|
294
|
if (wantarray) { |
700
|
0
|
|
|
|
|
0
|
return %{ $self->{Cache} }; |
|
0
|
|
|
|
|
0
|
|
701
|
|
|
|
|
|
|
} else { |
702
|
169
|
|
|
|
|
363
|
return $self->{Cache}; |
703
|
|
|
|
|
|
|
} |
704
|
|
|
|
|
|
|
} |
705
|
|
|
|
|
|
|
|
706
|
|
|
|
|
|
|
=item B<_store_in_cache> |
707
|
|
|
|
|
|
|
|
708
|
|
|
|
|
|
|
Store values in the cache associated with particular types. |
709
|
|
|
|
|
|
|
|
710
|
|
|
|
|
|
|
$w->_store_in_cache( "filter" => "K", |
711
|
|
|
|
|
|
|
"frequency" => 1.4E14, |
712
|
|
|
|
|
|
|
); |
713
|
|
|
|
|
|
|
|
714
|
|
|
|
|
|
|
If the cache already contains a value for this entry the cache |
715
|
|
|
|
|
|
|
is cleared prior to storing it (unless it contains the same value) |
716
|
|
|
|
|
|
|
on the assumption that the cache is no longer consistent. |
717
|
|
|
|
|
|
|
|
718
|
|
|
|
|
|
|
More than one key can be supplied. All keys are tested for prior |
719
|
|
|
|
|
|
|
existence before inserting the new ones. |
720
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
=cut |
722
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
sub _store_in_cache { |
724
|
41
|
|
|
41
|
|
51
|
my $self = shift; |
725
|
41
|
|
|
|
|
104
|
my %entries = @_; |
726
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
# Get the cache |
728
|
41
|
|
|
|
|
71
|
my $cache = $self->_cache; |
729
|
|
|
|
|
|
|
|
730
|
|
|
|
|
|
|
# First check to see whether we have any entries in the |
731
|
|
|
|
|
|
|
# cache that clash |
732
|
41
|
|
|
|
|
145
|
for my $key (keys %entries) { |
733
|
|
|
|
|
|
|
|
734
|
|
|
|
|
|
|
# No worries if it is not there |
735
|
58
|
50
|
|
|
|
192
|
next unless exists $cache->{$key}; |
736
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
# Check to see if the value is the same as is already present |
738
|
|
|
|
|
|
|
# Use a string comparison for filter |
739
|
0
|
0
|
|
|
|
0
|
if ($key eq 'filter') { |
740
|
0
|
0
|
|
|
|
0
|
next if $cache->{$key} eq $entries{$key}; |
741
|
|
|
|
|
|
|
} else { |
742
|
|
|
|
|
|
|
# Number |
743
|
0
|
0
|
|
|
|
0
|
next if $cache->{$key} == $entries{$key}; |
744
|
|
|
|
|
|
|
} |
745
|
|
|
|
|
|
|
|
746
|
|
|
|
|
|
|
# Now we have a key that exists but its value is |
747
|
|
|
|
|
|
|
# different. Clear the cache and exit the loop. |
748
|
|
|
|
|
|
|
# This means the loop never really reaches the end |
749
|
|
|
|
|
|
|
# of the block... |
750
|
0
|
|
|
|
|
0
|
$self->_clear_cache; |
751
|
|
|
|
|
|
|
|
752
|
0
|
|
|
|
|
0
|
last; |
753
|
|
|
|
|
|
|
} |
754
|
|
|
|
|
|
|
|
755
|
|
|
|
|
|
|
# Now insert the values |
756
|
41
|
|
|
|
|
94
|
for my $key (keys %entries) { |
757
|
58
|
|
|
|
|
145
|
$cache->{$key} = $entries{$key}; |
758
|
|
|
|
|
|
|
} |
759
|
|
|
|
|
|
|
|
760
|
|
|
|
|
|
|
# finished |
761
|
41
|
|
|
|
|
96
|
return; |
762
|
|
|
|
|
|
|
} |
763
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
=item B<_clear_cache> |
765
|
|
|
|
|
|
|
|
766
|
|
|
|
|
|
|
Empty the cache. |
767
|
|
|
|
|
|
|
|
768
|
|
|
|
|
|
|
=cut |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
sub _clear_cache { |
771
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
772
|
0
|
|
|
|
|
0
|
%{ $self->_cache } = (); |
|
0
|
|
|
|
|
0
|
|
773
|
0
|
|
|
|
|
0
|
return; |
774
|
|
|
|
|
|
|
} |
775
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
=item B<_fetch_from_cache> |
777
|
|
|
|
|
|
|
|
778
|
|
|
|
|
|
|
Retrieve an item from the cache. Returns C if the item is |
779
|
|
|
|
|
|
|
not stored in the cache. |
780
|
|
|
|
|
|
|
|
781
|
|
|
|
|
|
|
$filter = $w->_fetch_from_cache( "filter" ); |
782
|
|
|
|
|
|
|
|
783
|
|
|
|
|
|
|
Could be combined into a single method with C<_store_in_cache> but |
784
|
|
|
|
|
|
|
separated for simplicity. |
785
|
|
|
|
|
|
|
|
786
|
|
|
|
|
|
|
=cut |
787
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
sub _fetch_from_cache { |
789
|
128
|
|
|
128
|
|
153
|
my $self = shift; |
790
|
128
|
50
|
|
|
|
275
|
return undef unless @_; |
791
|
|
|
|
|
|
|
|
792
|
128
|
|
|
|
|
148
|
my $key = shift; |
793
|
128
|
50
|
|
|
|
242
|
return undef unless $key; |
794
|
128
|
|
|
|
|
154
|
$key = lc($key); # level playing field |
795
|
|
|
|
|
|
|
|
796
|
|
|
|
|
|
|
# Return the value from the cache if it exists |
797
|
128
|
|
|
|
|
230
|
my $cache = $self->_cache; |
798
|
128
|
100
|
|
|
|
492
|
return $cache->{$key} if exists $cache->{$key}; |
799
|
|
|
|
|
|
|
|
800
|
25
|
|
|
|
|
40
|
return undef; |
801
|
|
|
|
|
|
|
} |
802
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
=item B<_cache_value_and_wav> |
804
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
Cache the supplied value, converting it to the internal format |
806
|
|
|
|
|
|
|
if necessary. |
807
|
|
|
|
|
|
|
|
808
|
|
|
|
|
|
|
$w->_cache_value_and_wav( 'frequency', $frequency ); |
809
|
|
|
|
|
|
|
|
810
|
|
|
|
|
|
|
If the wavelength can not be determind the cache is cleared |
811
|
|
|
|
|
|
|
and the supplied value is inserted (but without wavelength |
812
|
|
|
|
|
|
|
information).. |
813
|
|
|
|
|
|
|
|
814
|
|
|
|
|
|
|
=cut |
815
|
|
|
|
|
|
|
|
816
|
|
|
|
|
|
|
sub _cache_value_and_wav { |
817
|
17
|
|
|
17
|
|
22
|
my $self = shift; |
818
|
|
|
|
|
|
|
|
819
|
17
|
|
|
|
|
29
|
my $category = shift; |
820
|
17
|
|
|
|
|
21
|
my $value = shift; |
821
|
17
|
50
|
|
|
|
38
|
return unless defined $value; |
822
|
|
|
|
|
|
|
|
823
|
|
|
|
|
|
|
# Convert to the internal format (wavelength) |
824
|
17
|
|
|
|
|
54
|
my $internal = $self->_convert_from( $category, $value ); |
825
|
|
|
|
|
|
|
|
826
|
|
|
|
|
|
|
# Store all defined values into cache |
827
|
17
|
|
|
|
|
22
|
my %store; |
828
|
17
|
|
|
|
|
33
|
$store{$category} = $value; |
829
|
17
|
50
|
|
|
|
50
|
$store{wavelength} = $internal if defined $internal; |
830
|
|
|
|
|
|
|
|
831
|
|
|
|
|
|
|
# Clear cache if wavelength is not to be supplied |
832
|
17
|
50
|
|
|
|
33
|
$self->_clear_cache() unless defined $internal; |
833
|
|
|
|
|
|
|
|
834
|
17
|
|
|
|
|
55
|
$self->_store_in_cache( %store ); |
835
|
|
|
|
|
|
|
|
836
|
17
|
|
|
|
|
40
|
return; |
837
|
|
|
|
|
|
|
} |
838
|
|
|
|
|
|
|
|
839
|
|
|
|
|
|
|
=item B<_read_value_with_convert> |
840
|
|
|
|
|
|
|
|
841
|
|
|
|
|
|
|
Read a value from the cache, converting it to the required units |
842
|
|
|
|
|
|
|
as necessary. |
843
|
|
|
|
|
|
|
|
844
|
|
|
|
|
|
|
$value = $w->_read_value_with_convert( 'frequency' ); |
845
|
|
|
|
|
|
|
|
846
|
|
|
|
|
|
|
Returns C if no value has been stored in the object. |
847
|
|
|
|
|
|
|
|
848
|
|
|
|
|
|
|
=cut |
849
|
|
|
|
|
|
|
|
850
|
|
|
|
|
|
|
sub _read_value_with_convert { |
851
|
57
|
|
|
57
|
|
92
|
my $self = shift; |
852
|
57
|
|
|
|
|
92
|
my $category = lc(shift); |
853
|
|
|
|
|
|
|
|
854
|
57
|
|
|
|
|
137
|
my $value = $self->_fetch_from_cache( $category ); |
855
|
|
|
|
|
|
|
|
856
|
|
|
|
|
|
|
# Convert it if necessary |
857
|
57
|
100
|
|
|
|
111
|
unless ($value) { |
858
|
|
|
|
|
|
|
|
859
|
|
|
|
|
|
|
# Convert it from the default value (if set) |
860
|
25
|
|
|
|
|
58
|
$value = $self->_convert_to( $category ); |
861
|
|
|
|
|
|
|
|
862
|
|
|
|
|
|
|
# Cache it if necessary |
863
|
25
|
100
|
|
|
|
76
|
$self->_store_in_cache( $category => $value ) |
864
|
|
|
|
|
|
|
if $value; |
865
|
|
|
|
|
|
|
} |
866
|
|
|
|
|
|
|
|
867
|
57
|
|
|
|
|
147
|
return $value; |
868
|
|
|
|
|
|
|
} |
869
|
|
|
|
|
|
|
|
870
|
|
|
|
|
|
|
=item B<_convert_to> |
871
|
|
|
|
|
|
|
|
872
|
|
|
|
|
|
|
Convert the value stored internally as the default format to the |
873
|
|
|
|
|
|
|
required format. This simplifies the conversion routines since |
874
|
|
|
|
|
|
|
there is only a single format to convert from and to. |
875
|
|
|
|
|
|
|
|
876
|
|
|
|
|
|
|
$value = $w->_convert_to( 'frequency' ); |
877
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
Returns the converted value or undef on error. The internal format |
879
|
|
|
|
|
|
|
(wavelength) is read directly from the cache. |
880
|
|
|
|
|
|
|
|
881
|
|
|
|
|
|
|
=cut |
882
|
|
|
|
|
|
|
|
883
|
|
|
|
|
|
|
sub _convert_to { |
884
|
25
|
|
|
25
|
|
29
|
my $self = shift; |
885
|
25
|
|
|
|
|
34
|
my $category = shift; |
886
|
|
|
|
|
|
|
|
887
|
25
|
|
|
|
|
39
|
my $lambda = $self->_fetch_from_cache( 'wavelength' ); |
888
|
25
|
50
|
|
|
|
91
|
return undef unless defined $lambda; |
889
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
# Check all types |
891
|
25
|
|
|
|
|
24
|
my $output; |
892
|
25
|
50
|
|
|
|
112
|
if ($category eq 'wavelength') { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
893
|
0
|
|
|
|
|
0
|
$output = $lambda; |
894
|
|
|
|
|
|
|
} elsif ($category eq 'frequency') { |
895
|
|
|
|
|
|
|
# Microns |
896
|
2
|
|
|
|
|
7
|
$output = CLIGHT / ( $lambda * 1.0E-6); |
897
|
|
|
|
|
|
|
} elsif ($category eq 'wavenumber') { |
898
|
|
|
|
|
|
|
# Inverse cm |
899
|
9
|
|
|
|
|
24
|
$output = 1.0 / ( $lambda / 10_000); |
900
|
|
|
|
|
|
|
} elsif ($category eq 'filter') { |
901
|
|
|
|
|
|
|
|
902
|
|
|
|
|
|
|
# This is slightly harder since we know the value but |
903
|
|
|
|
|
|
|
# not the key. Go through each hash looking for a matching |
904
|
|
|
|
|
|
|
# key. If we know the instrument we start looking there |
905
|
|
|
|
|
|
|
# Else we have to look through GENERIC followed by all the |
906
|
|
|
|
|
|
|
# remaining instruments |
907
|
|
|
|
|
|
|
|
908
|
14
|
|
|
|
|
29
|
my $instrument = $self->instrument; |
909
|
14
|
|
|
|
|
69
|
my @search = ('GENERIC', keys %FILTERS); |
910
|
14
|
100
|
|
|
|
44
|
unshift(@search, $instrument) if defined $instrument; |
911
|
|
|
|
|
|
|
|
912
|
|
|
|
|
|
|
# There will be a precision issue here so we convert |
913
|
|
|
|
|
|
|
# the base wavelegnth to use 8 significant figures |
914
|
14
|
|
|
|
|
116
|
$lambda = sprintf("%8e", $lambda); |
915
|
|
|
|
|
|
|
|
916
|
14
|
|
|
|
|
29
|
OUTER: foreach my $inst (@search) { |
917
|
91
|
100
|
|
|
|
199
|
next unless exists $FILTERS{$inst}; |
918
|
88
|
|
|
|
|
116
|
my $hash = $FILTERS{$inst}; |
919
|
88
|
|
|
|
|
88
|
for my $key (keys %{ $hash }) { |
|
88
|
|
|
|
|
409
|
|
920
|
|
|
|
|
|
|
# Make sure we use the same rounding scheme on the values |
921
|
|
|
|
|
|
|
# returned from the hash, so we don't have to worry about |
922
|
|
|
|
|
|
|
# rounding issues fouling things up (like saying 8.3e-1 != |
923
|
|
|
|
|
|
|
# 0.83). |
924
|
1508
|
100
|
|
|
|
5754
|
if (sprintf("%8e", $hash->{$key} ) eq $lambda) { |
925
|
5
|
|
|
|
|
10
|
$output = $key; |
926
|
5
|
|
|
|
|
35
|
last OUTER; |
927
|
|
|
|
|
|
|
} |
928
|
|
|
|
|
|
|
} |
929
|
|
|
|
|
|
|
} |
930
|
|
|
|
|
|
|
} |
931
|
|
|
|
|
|
|
|
932
|
25
|
|
|
|
|
58
|
return $output; |
933
|
|
|
|
|
|
|
} |
934
|
|
|
|
|
|
|
|
935
|
|
|
|
|
|
|
=item B<_convert_from> |
936
|
|
|
|
|
|
|
|
937
|
|
|
|
|
|
|
Convert from the supplied values to the internal format (wavelength). |
938
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
$value = $w->_convert_from( 'frequency', $frequency ); |
940
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
Returns the converted value. Returns C if the conversion |
942
|
|
|
|
|
|
|
is not possible. |
943
|
|
|
|
|
|
|
|
944
|
|
|
|
|
|
|
=cut |
945
|
|
|
|
|
|
|
|
946
|
|
|
|
|
|
|
sub _convert_from { |
947
|
17
|
|
|
17
|
|
26
|
my $self = shift; |
948
|
|
|
|
|
|
|
|
949
|
17
|
|
|
|
|
27
|
my $category = lc(shift); |
950
|
17
|
|
|
|
|
24
|
my $value = shift; |
951
|
17
|
50
|
|
|
|
37
|
return undef unless defined $value; |
952
|
|
|
|
|
|
|
|
953
|
|
|
|
|
|
|
# Go through each type |
954
|
17
|
|
|
|
|
19
|
my $output; |
955
|
17
|
50
|
|
|
|
110
|
if ($category eq 'wavelength') { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
956
|
0
|
|
|
|
|
0
|
$output = $value; |
957
|
|
|
|
|
|
|
} elsif ($category eq 'frequency') { |
958
|
|
|
|
|
|
|
|
959
|
|
|
|
|
|
|
# Convert frequency to wavelength |
960
|
|
|
|
|
|
|
# converting from metres to microns |
961
|
3
|
|
|
|
|
8
|
$output = CLIGHT / ($value * 1.0E-6); |
962
|
|
|
|
|
|
|
|
963
|
|
|
|
|
|
|
} elsif ($category eq 'wavenumber') { |
964
|
|
|
|
|
|
|
# 1 / cm then convert cm to microns |
965
|
1
|
|
|
|
|
6
|
$output = (1.0 / $value) * 10_000; |
966
|
|
|
|
|
|
|
|
967
|
|
|
|
|
|
|
} elsif ($category eq 'filter') { |
968
|
|
|
|
|
|
|
# Convert filter to wavelength |
969
|
|
|
|
|
|
|
# Need to walk through %FILTERS first for a |
970
|
|
|
|
|
|
|
# instrument match and then for a generic match |
971
|
13
|
|
|
|
|
21
|
my $instrument = $self->instrument; |
972
|
13
|
|
|
|
|
26
|
my @search = ('GENERIC'); |
973
|
13
|
100
|
|
|
|
36
|
unshift(@search, $instrument) if defined $instrument; |
974
|
|
|
|
|
|
|
|
975
|
13
|
|
|
|
|
18
|
foreach my $name (@search) { |
976
|
|
|
|
|
|
|
|
977
|
|
|
|
|
|
|
# First look for a match in %FILTERS |
978
|
13
|
50
|
|
|
|
34
|
if (exists $FILTERS{$name}) { |
979
|
|
|
|
|
|
|
# Now look for the filter itself |
980
|
13
|
50
|
|
|
|
47
|
if (exists $FILTERS{$name}{$value}) { |
981
|
13
|
|
|
|
|
26
|
$output = $FILTERS{$name}{$value}; |
982
|
13
|
|
|
|
|
26
|
last; |
983
|
|
|
|
|
|
|
} |
984
|
|
|
|
|
|
|
} |
985
|
|
|
|
|
|
|
} |
986
|
|
|
|
|
|
|
} |
987
|
|
|
|
|
|
|
|
988
|
17
|
|
|
|
|
38
|
return $output; |
989
|
|
|
|
|
|
|
} |
990
|
|
|
|
|
|
|
|
991
|
|
|
|
|
|
|
=back |
992
|
|
|
|
|
|
|
|
993
|
|
|
|
|
|
|
=end __PRIVATE_METHODS__ |
994
|
|
|
|
|
|
|
|
995
|
|
|
|
|
|
|
=head2 Static functions |
996
|
|
|
|
|
|
|
|
997
|
|
|
|
|
|
|
These functions enable the user to obtain an overview of |
998
|
|
|
|
|
|
|
the supported filter, instrument and telescope combinations. |
999
|
|
|
|
|
|
|
|
1000
|
|
|
|
|
|
|
=over 4 |
1001
|
|
|
|
|
|
|
|
1002
|
|
|
|
|
|
|
=item B |
1003
|
|
|
|
|
|
|
|
1004
|
|
|
|
|
|
|
Returns true if the a particular instrument has a particular filter, |
1005
|
|
|
|
|
|
|
otherwise returns C, e.g. |
1006
|
|
|
|
|
|
|
|
1007
|
|
|
|
|
|
|
if( Astro::WaveBand::has_filter( UIST => "Kprime" ) { |
1008
|
|
|
|
|
|
|
... |
1009
|
|
|
|
|
|
|
} |
1010
|
|
|
|
|
|
|
|
1011
|
|
|
|
|
|
|
if you pass a hash containing multiple instrument combinations, |
1012
|
|
|
|
|
|
|
all must be valid or the method will return undef. |
1013
|
|
|
|
|
|
|
|
1014
|
|
|
|
|
|
|
=cut |
1015
|
|
|
|
|
|
|
|
1016
|
|
|
|
|
|
|
sub has_filter { |
1017
|
4
|
50
|
|
4
|
1
|
796
|
return undef unless @_; |
1018
|
|
|
|
|
|
|
|
1019
|
|
|
|
|
|
|
# grab instrument and filter list |
1020
|
4
|
|
|
|
|
12
|
my %list = @_; |
1021
|
|
|
|
|
|
|
|
1022
|
4
|
|
|
|
|
6
|
my $counter = 0; |
1023
|
4
|
|
|
|
|
15
|
foreach my $key ( sort keys %list ) { |
1024
|
|
|
|
|
|
|
# if the filter exists in the filter list for that instrument, |
1025
|
|
|
|
|
|
|
# increment the counter |
1026
|
6
|
100
|
|
|
|
26
|
$counter++ if exists $FILTERS{$key}{$list{$key}}; |
1027
|
|
|
|
|
|
|
} |
1028
|
|
|
|
|
|
|
|
1029
|
|
|
|
|
|
|
# if the counter is the same size as the input list then all conditons |
1030
|
|
|
|
|
|
|
# have been proved to be true... |
1031
|
4
|
100
|
|
|
|
17
|
return undef unless scalar(keys %list) == $counter; |
1032
|
2
|
|
|
|
|
8
|
return 1; |
1033
|
|
|
|
|
|
|
} |
1034
|
|
|
|
|
|
|
|
1035
|
|
|
|
|
|
|
=item B |
1036
|
|
|
|
|
|
|
|
1037
|
|
|
|
|
|
|
Returns true if the a particular instrument exists for a particular |
1038
|
|
|
|
|
|
|
telescope, otherwise returns C, e.g. |
1039
|
|
|
|
|
|
|
|
1040
|
|
|
|
|
|
|
if( Astro::WaveBand::has_instrument( UKIRT => "UIST" ) { |
1041
|
|
|
|
|
|
|
... |
1042
|
|
|
|
|
|
|
} |
1043
|
|
|
|
|
|
|
|
1044
|
|
|
|
|
|
|
if you pass a hash containing multiple instrument combinations, |
1045
|
|
|
|
|
|
|
all must be valid or the method will return undef. |
1046
|
|
|
|
|
|
|
|
1047
|
|
|
|
|
|
|
=cut |
1048
|
|
|
|
|
|
|
|
1049
|
|
|
|
|
|
|
sub has_instrument { |
1050
|
2
|
50
|
|
2
|
1
|
6
|
return undef unless @_; |
1051
|
|
|
|
|
|
|
|
1052
|
|
|
|
|
|
|
# grab instrument and filter list |
1053
|
2
|
|
|
|
|
6
|
my %list = @_; |
1054
|
|
|
|
|
|
|
|
1055
|
2
|
|
|
|
|
3
|
my $counter = 0; |
1056
|
2
|
|
|
|
|
5
|
foreach my $key ( sort keys %list ) { |
1057
|
|
|
|
|
|
|
# if the filter exists in the filter list for that instrument, |
1058
|
|
|
|
|
|
|
# increment the counter |
1059
|
2
|
|
|
|
|
3
|
for my $i ( 0 ... $#{$TELESCOPE{$key}} ) { |
|
2
|
|
|
|
|
7
|
|
1060
|
8
|
100
|
|
|
|
22
|
if ( $TELESCOPE{$key}->[$i] eq $list{$key} ) { |
1061
|
1
|
|
|
|
|
2
|
$counter++; |
1062
|
1
|
|
|
|
|
3
|
last; |
1063
|
|
|
|
|
|
|
} |
1064
|
|
|
|
|
|
|
} |
1065
|
|
|
|
|
|
|
} |
1066
|
|
|
|
|
|
|
|
1067
|
|
|
|
|
|
|
# if the counter is the same size as the input list then all conditons |
1068
|
|
|
|
|
|
|
# have been proved to be true... |
1069
|
2
|
100
|
|
|
|
9
|
return undef unless scalar(keys %list) == $counter; |
1070
|
1
|
|
|
|
|
4
|
return 1; |
1071
|
|
|
|
|
|
|
} |
1072
|
|
|
|
|
|
|
|
1073
|
|
|
|
|
|
|
|
1074
|
|
|
|
|
|
|
=item B |
1075
|
|
|
|
|
|
|
|
1076
|
|
|
|
|
|
|
Returns true if the a particular telescope and filter combination is |
1077
|
|
|
|
|
|
|
avaialable, otherwise returns C, e.g. |
1078
|
|
|
|
|
|
|
|
1079
|
|
|
|
|
|
|
if( Astro::WaveBand::is_observable( UKIRT => 'Kprime' ) { |
1080
|
|
|
|
|
|
|
... |
1081
|
|
|
|
|
|
|
} |
1082
|
|
|
|
|
|
|
|
1083
|
|
|
|
|
|
|
=cut |
1084
|
|
|
|
|
|
|
|
1085
|
|
|
|
|
|
|
sub is_observable { |
1086
|
|
|
|
|
|
|
#my $self = shift; |
1087
|
3
|
50
|
|
3
|
1
|
10
|
return undef unless @_; |
1088
|
|
|
|
|
|
|
|
1089
|
|
|
|
|
|
|
# grab instrument and filter list |
1090
|
3
|
|
|
|
|
8
|
my %list = @_; |
1091
|
|
|
|
|
|
|
|
1092
|
3
|
|
|
|
|
4
|
my $counter = 0; |
1093
|
3
|
|
|
|
|
9
|
foreach my $key ( sort keys %list ) { |
1094
|
|
|
|
|
|
|
# if the filter exists in the filter list for that instrument, |
1095
|
|
|
|
|
|
|
# increment the counter |
1096
|
|
|
|
|
|
|
#print "TELESCOPE $key\n"; |
1097
|
3
|
|
|
|
|
3
|
for my $i ( 0 ... $#{$TELESCOPE{$key}} ) { |
|
3
|
|
|
|
|
14
|
|
1098
|
|
|
|
|
|
|
|
1099
|
|
|
|
|
|
|
#print " INSTRUMENT ${$TELESCOPE{$key}}[$i]\n"; |
1100
|
|
|
|
|
|
|
#print " \$list{\$key} = $list{$key}\n"; |
1101
|
8
|
|
|
|
|
8
|
my $instrument = ${$TELESCOPE{$key}}[$i]; |
|
8
|
|
|
|
|
13
|
|
1102
|
|
|
|
|
|
|
|
1103
|
8
|
100
|
|
|
|
8
|
if ( ${$FILTERS{$instrument}}{$list{$key}} ) { |
|
8
|
|
|
|
|
27
|
|
1104
|
2
|
|
|
|
|
2
|
$counter++; |
1105
|
|
|
|
|
|
|
#print "$counter: $key\n"; |
1106
|
|
|
|
|
|
|
#print " $list{$key}, $instrument, $list{$key}, ". |
1107
|
|
|
|
|
|
|
# "${$FILTERS{${$TELESCOPE{$key}}[$i]}}{$list{$key}}\n"; |
1108
|
2
|
|
|
|
|
6
|
last; |
1109
|
|
|
|
|
|
|
} |
1110
|
|
|
|
|
|
|
} |
1111
|
|
|
|
|
|
|
} |
1112
|
|
|
|
|
|
|
|
1113
|
|
|
|
|
|
|
# if the counter is the same size as the input list then all conditons |
1114
|
|
|
|
|
|
|
# have been proved to be true... |
1115
|
3
|
100
|
|
|
|
12
|
return undef unless scalar(keys %list) == $counter; |
1116
|
2
|
|
|
|
|
7
|
return 1; |
1117
|
|
|
|
|
|
|
} |
1118
|
|
|
|
|
|
|
|
1119
|
|
|
|
|
|
|
=back |
1120
|
|
|
|
|
|
|
|
1121
|
|
|
|
|
|
|
=head1 BUGS |
1122
|
|
|
|
|
|
|
|
1123
|
|
|
|
|
|
|
Does not automatically convert metres to microns and GHz to Hz etc. |
1124
|
|
|
|
|
|
|
|
1125
|
|
|
|
|
|
|
Can not handle filters that correspond to multiple wavelengths. |
1126
|
|
|
|
|
|
|
Currently SCUBA is the main issue. With a 450:850 filter this class |
1127
|
|
|
|
|
|
|
always returns the shortest wavelength (since that is the wavelength |
1128
|
|
|
|
|
|
|
that affects scheduling the most). |
1129
|
|
|
|
|
|
|
|
1130
|
|
|
|
|
|
|
Should handle velocities and redshifts in order to disambiguate rest |
1131
|
|
|
|
|
|
|
frequencies and observed frequencies. Would also be nice if the class |
1132
|
|
|
|
|
|
|
could accept a molecule and transition, allowing the natural unit |
1133
|
|
|
|
|
|
|
to appear as something like: "CO 3-2 @ 30km/s LSR radio". |
1134
|
|
|
|
|
|
|
|
1135
|
|
|
|
|
|
|
=head1 AUTHORS |
1136
|
|
|
|
|
|
|
|
1137
|
|
|
|
|
|
|
Tim Jenness Et.jenness@jach.hawaii.eduE |
1138
|
|
|
|
|
|
|
Alasdair Allan Eaa@astro.ex.ac.ukE |
1139
|
|
|
|
|
|
|
Tim Lister Etlister@lcogt.netE |
1140
|
|
|
|
|
|
|
|
1141
|
|
|
|
|
|
|
=head1 COPYRIGHT |
1142
|
|
|
|
|
|
|
|
1143
|
|
|
|
|
|
|
Copyright (C) 2001-2003 Particle Physics and Astronomy Research Council. |
1144
|
|
|
|
|
|
|
All Rights Reserved. |
1145
|
|
|
|
|
|
|
|
1146
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify |
1147
|
|
|
|
|
|
|
it under the same terms as Perl itself. |
1148
|
|
|
|
|
|
|
|
1149
|
|
|
|
|
|
|
=cut |
1150
|
|
|
|
|
|
|
|
1151
|
|
|
|
|
|
|
1; |