wcs 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +35 -0
- data/COPYING +339 -0
- data/Gemfile +4 -0
- data/README.md +77 -0
- data/Rakefile +1 -0
- data/ext/depend +2 -0
- data/ext/extconf.rb +12 -0
- data/ext/wcs.i +578 -0
- data/ext/wcs_h.i +178 -0
- data/ext/wcs_wrap.c +11289 -0
- data/lib/wcs/version.rb +3 -0
- data/libdoc.rb +484 -0
- data/setup.rb +1585 -0
- data/spec/wcs_spec.rb +621 -0
- data/test.rb +112 -0
- data/wcs.gemspec +36 -0
- metadata +108 -0
data/spec/wcs_spec.rb
ADDED
@@ -0,0 +1,621 @@
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../ext'
|
2
|
+
require "wcs"
|
3
|
+
|
4
|
+
def float_close(x,y,epsilon=Float::EPSILON)
|
5
|
+
if Array===x && Array===y
|
6
|
+
if x.size != y.size
|
7
|
+
false
|
8
|
+
end
|
9
|
+
x.size.times.all? do |i|
|
10
|
+
float_close(x[i],y[i],epsilon)
|
11
|
+
end
|
12
|
+
elsif Array===x || Array===y
|
13
|
+
false
|
14
|
+
elsif Numeric===x && Numeric===y
|
15
|
+
if Float===x || Float===y
|
16
|
+
(y-x).abs <= (x.abs+y.abs)*epsilon
|
17
|
+
else
|
18
|
+
x==y
|
19
|
+
end
|
20
|
+
else
|
21
|
+
x==y
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
RSpec::Matchers.define :be_close_to do |y|
|
26
|
+
match do |x|
|
27
|
+
float_close(x,y,1e-14)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
describe "Wcs::WorldCoor" do
|
34
|
+
|
35
|
+
cra = 0 # Center right ascension in degrees
|
36
|
+
cdec = 0 # Center declination in degrees
|
37
|
+
specpix = 1 # Number of arcseconds per pixel
|
38
|
+
xrpix = 1 # Reference pixel X coordinate
|
39
|
+
yrpix = 1 # Reference pixel X coordinate
|
40
|
+
nxpix = 100 # Number of pixels along x-axis
|
41
|
+
nypix = 100 # Number of pixels along y-axis
|
42
|
+
rotate = 0 # Rotation angle (clockwise positive) in degrees
|
43
|
+
equinox = 2000 # Equinox of coordinates, 1950 and 2000 supported
|
44
|
+
epoch = 2000
|
45
|
+
proj = "TAN" # Projection
|
46
|
+
|
47
|
+
describe Wcs::WorldCoor.new(cra,cdec,specpix,xrpix,yrpix,nxpix,nypix,rotate,equinox,epoch,proj) do
|
48
|
+
its(:class){should == Wcs::WorldCoor}
|
49
|
+
end
|
50
|
+
|
51
|
+
naxis1 = 100 # /* Number of pixels along x-axis */
|
52
|
+
naxis2 = 100 # /* Number of pixels along y-axis */
|
53
|
+
ctype1 = "RA--TAN" # /* FITS WCS projection for axis 1 */
|
54
|
+
ctype2 = "DEC-TAN" # /* FITS WCS projection for axis 2 */
|
55
|
+
crpix1 = 0 # /* Reference pixel coordinates */
|
56
|
+
crpix2 = 0 # /* Reference pixel coordinates */
|
57
|
+
crval1 = 0 # /* Coordinate at reference pixel in degrees */
|
58
|
+
crval2 = 0 # /* Coordinate at reference pixel in degrees */
|
59
|
+
cd = nil # /* Rotation matrix, used if not NULL */
|
60
|
+
cdelt1 = 0.1 # /* scale in degrees/pixel, if cd is NULL */
|
61
|
+
cdelt2 = 0.1 # /* scale in degrees/pixel, if cd is NULL */
|
62
|
+
crota = 0 # /* Rotation angle in degrees, if cd is NULL */
|
63
|
+
equinox = 2000 # /* Equinox of coordinates, 1950 and 2000 supported */
|
64
|
+
epoch = 2000 # /* Epoch of coordinates, for FK4/FK5 conversion */
|
65
|
+
|
66
|
+
describe Wcs::WorldCoor.new(naxis1, naxis2, ctype1, ctype2,
|
67
|
+
crpix1, crpix2, crval1, crval2,
|
68
|
+
cd, cdelt1, cdelt2, crota, equinox, epoch) do
|
69
|
+
its(:class){should == Wcs::WorldCoor}
|
70
|
+
end
|
71
|
+
|
72
|
+
hstr="
|
73
|
+
SIMPLE = T
|
74
|
+
BITPIX = -64
|
75
|
+
NAXIS = 2
|
76
|
+
NAXIS1 = 10000
|
77
|
+
NAXIS2 = 10000
|
78
|
+
CTYPE1 = 'RA---TAN'
|
79
|
+
CTYPE2 = 'DEC--TAN'
|
80
|
+
EQUINOX = 2000
|
81
|
+
CRVAL1 = 10.685497001
|
82
|
+
CRVAL2 = 41.270525148
|
83
|
+
CDELT1 = -0.000277780
|
84
|
+
CDELT2 = 0.000277780
|
85
|
+
CRPIX1 = 5000.0000
|
86
|
+
CRPIX2 = 5000.0000
|
87
|
+
CROTA2 = 0.0
|
88
|
+
END
|
89
|
+
"
|
90
|
+
hstr = hstr.split(/\n/).map{|x| x+" "*(80-x.size)}.join("")
|
91
|
+
|
92
|
+
describe Wcs::WorldCoor.new(hstr) do
|
93
|
+
its(:class){should == Wcs::WorldCoor}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
describe "Wcs::WorldCoor" do
|
99
|
+
|
100
|
+
before{
|
101
|
+
naxis1 = 100 # /* Number of pixels along x-axis */
|
102
|
+
naxis2 = 100 # /* Number of pixels along y-axis */
|
103
|
+
ctype1 = "RA--TAN" # /* FITS WCS projection for axis 1 */
|
104
|
+
ctype2 = "DEC-TAN" # /* FITS WCS projection for axis 2 */
|
105
|
+
crpix1 = 0 # /* Reference pixel coordinates */
|
106
|
+
crpix2 = 0 # /* Reference pixel coordinates */
|
107
|
+
crval1 = 0 # /* Coordinate at reference pixel in degrees */
|
108
|
+
crval2 = 0 # /* Coordinate at reference pixel in degrees */
|
109
|
+
cd = nil # /* Rotation matrix, used if not NULL */
|
110
|
+
cdelt1 = 0.1 # /* scale in degrees/pixel, if cd is NULL */
|
111
|
+
cdelt2 = 0.1 # /* scale in degrees/pixel, if cd is NULL */
|
112
|
+
crota = 0 # /* Rotation angle in degrees, if cd is NULL */
|
113
|
+
equinox = 2000 # /* Equinox of coordinates, 1950 and 2000 supported */
|
114
|
+
epoch = 2000 # /* Epoch of coordinates, for FK4/FK5 conversion */
|
115
|
+
|
116
|
+
@wcs = Wcs::WorldCoor.new(naxis1, naxis2, ctype1, ctype2,
|
117
|
+
crpix1, crpix2, crval1, crval2,
|
118
|
+
cd, cdelt1, cdelt2, crota, equinox, epoch)
|
119
|
+
}
|
120
|
+
|
121
|
+
it {@wcs.class.should == Wcs::WorldCoor}
|
122
|
+
it {@wcs.wcs2pix(0.5,0.5).should be_close_to [5.000126927791313, 5.000317324553201, 0]}
|
123
|
+
it {@wcs.pix2wcs(50,50).should be_close_to [4.987365288755012, 4.968577292595944]}
|
124
|
+
|
125
|
+
# Set projection type from header CTYPEs
|
126
|
+
#
|
127
|
+
# @param [String] ctype1 FITS WCS projection for axis 1
|
128
|
+
# @param [String] ctype2 FITS WCS projection for axis 2
|
129
|
+
# @return [Integer]
|
130
|
+
ctype1='TAN'
|
131
|
+
ctype2='TAN'
|
132
|
+
it {@wcs.wcstype(ctype1,ctype2).should == 0}
|
133
|
+
|
134
|
+
# @return [Bool] Returns 1 if wcs structure set, else 0
|
135
|
+
it {@wcs.iswcs.should == true}
|
136
|
+
|
137
|
+
# @return [Bool] Returns 0 if wcs structure set, else 1
|
138
|
+
it {@wcs.nowcs.should == false}
|
139
|
+
|
140
|
+
# Convert pixel coordinates to World Coordinate string
|
141
|
+
#
|
142
|
+
# @param [Float] xpix Image horizontal coordinate in pixels
|
143
|
+
# @param [Float] ypix Image vertical coordinate in pixels
|
144
|
+
# @return [String] World coordinate string
|
145
|
+
xpix = 10
|
146
|
+
ypix = 10
|
147
|
+
it {@wcs.pix2wcst(xpix,ypix).should == "00:03:59.976 +00:59:59.09 FK5"}
|
148
|
+
|
149
|
+
# Convert pixel coordinates to World Coordinates
|
150
|
+
#
|
151
|
+
# @param [Float] xpix Image horizontal coordinate in pixels
|
152
|
+
# @param [Float] ypix Image vertical coordinate in pixels
|
153
|
+
# @return [[xpos,ypos]] RA and Dec in degrees
|
154
|
+
it {@wcs.pix2wcs(xpix,ypix).should == [0.9998984794143875, 0.9997462518566833]}
|
155
|
+
|
156
|
+
# Convert World Coordinates to pixel coordinates
|
157
|
+
#
|
158
|
+
# @param [Float] xpos Longitude/Right Ascension in degrees
|
159
|
+
# @param [Float] ypos Latitude/Declination in degrees
|
160
|
+
# @param [String] coorsys Coordinate system (FK4, FK5, B1950, J2000, GALACTIC, ECLIPTIC)
|
161
|
+
# @return [[xpix,ypix,offscl]]
|
162
|
+
# * xpix: Image horizontal coordinate in pixels
|
163
|
+
# * ypix: Image vertical coordinate in pixels
|
164
|
+
# * offscl: 0 if within bounds, else off scale
|
165
|
+
xpos = 1.0
|
166
|
+
ypos = 1.0
|
167
|
+
coorsys = 'J2000'
|
168
|
+
it {@wcs.wcsc2pix(xpos,ypos,coorsys).should be_close_to [10.001015515136944, 10.002538950267457, 0]}
|
169
|
+
|
170
|
+
# Convert World Coordinates to pixel coordinates
|
171
|
+
#
|
172
|
+
# @param [Float] xpos Longitude/Right Ascension in degrees
|
173
|
+
# @param [Float] ypos Latitude/Declination in degrees
|
174
|
+
# @return [[xpix,ypix,offscl]]
|
175
|
+
# * xpix: Image horizontal coordinate in pixels
|
176
|
+
# * ypix: Image vertical coordinate in pixels
|
177
|
+
# * offscl: 0 if within bounds, else off scale
|
178
|
+
it {@wcs.wcs2pix(xpos,ypos).should be_close_to [10.001015515136944, 10.002538950267457, 0]}
|
179
|
+
|
180
|
+
# Change center of WCS
|
181
|
+
#
|
182
|
+
# @param [Float] cra New center right ascension in degrees
|
183
|
+
# @param [Float] cdec New center declination in degrees
|
184
|
+
# @param [String] coorsys FK4 or FK5 coordinates (1950 or 2000)
|
185
|
+
# @return [nil]
|
186
|
+
cra = 1.0
|
187
|
+
cdec = 1.0
|
188
|
+
coorsys = 'FK5'
|
189
|
+
it {@wcs.wcsshift(cra,cdec,coorsys).should == nil}
|
190
|
+
|
191
|
+
# Return RA and Dec of image center, size in degrees
|
192
|
+
#
|
193
|
+
# @return [[ra,dec,width,height]]
|
194
|
+
# * ra: Right ascension of image center (deg) (returned)
|
195
|
+
# * dec: Declination of image center (deg) (returned)
|
196
|
+
# * width: Width in degrees (returned)
|
197
|
+
# * height: Height in degrees (returned)
|
198
|
+
it {@wcs.wcsfull.should == [5.036983632308005, 5.017631465225092, 9.861328265404987, 9.861328461681406]}
|
199
|
+
|
200
|
+
# Print the image center and size in WCS units
|
201
|
+
it {@wcs.wcscent.should == nil}
|
202
|
+
|
203
|
+
# Return image center and size in RA and Dec
|
204
|
+
#
|
205
|
+
# @return [[cra,cdec,ora,odec]]
|
206
|
+
# * cra: Right ascension of image center (deg) (returned)
|
207
|
+
# * cdec: Declination of image center (deg) (returned)
|
208
|
+
# * dra: Half-width in right ascension (deg) (returned)
|
209
|
+
# * ddec: Half-width in declination (deg) (returned)
|
210
|
+
it {@wcs.wcssize.should == [5.036983632308005, 5.017631465225092, 4.949631960155275, 4.930664230840703]}
|
211
|
+
|
212
|
+
# Return min and max RA and Dec of image in degrees
|
213
|
+
#
|
214
|
+
# @return [[ra1,ra2,dec1,dec1]]
|
215
|
+
# * ra1: Min. right ascension of image (deg) (returned)
|
216
|
+
# * ra2: Max. right ascension of image (deg) (returned)
|
217
|
+
# * dec1: Min. declination of image (deg) (returned)
|
218
|
+
# * dec2: Max. declination of image (deg) (returned)
|
219
|
+
it {@wcs.wcsrange.should == [0.09999989846104272, 9.900277248989845, 0.09851075234944665, 9.900262468395615]}
|
220
|
+
|
221
|
+
# Set scaling and rotation from CD matrix
|
222
|
+
#
|
223
|
+
# @param [Array] cd CD matrix, (2x2 array) ignored if NULL
|
224
|
+
# @return [nil]
|
225
|
+
cd = [1,0,0,1]
|
226
|
+
it {@wcs.wcscdset(cd).should == nil}
|
227
|
+
|
228
|
+
# set scaling, rotation from CDELTi, CROTA2
|
229
|
+
#
|
230
|
+
# @param [Float] cdelt1 degrees/pixel in first axis (or both axes)
|
231
|
+
# @param [Float] cdelt2 degrees/pixel in second axis if nonzero
|
232
|
+
# @param [Float] crota Rotation counterclockwise in degrees
|
233
|
+
# @return [nil]
|
234
|
+
cdelt1 = 0.001
|
235
|
+
cdelt2 = 0.001
|
236
|
+
crota = 0
|
237
|
+
it {@wcs.wcsdeltset(cdelt1,cdelt2,crota).should == nil}
|
238
|
+
|
239
|
+
# set scaling, rotation from CDELTs and PC matrix
|
240
|
+
#
|
241
|
+
# @param [Float] cdelt1 degrees/pixel in first axis (or both axes)
|
242
|
+
# @param [Float] cdelt2 degrees/pixel in second axis if nonzero
|
243
|
+
# @param [Array] pc Rotation matrix, ignored if NULL
|
244
|
+
pc = nil
|
245
|
+
it {@wcs.wcspcset(cdelt1,cdelt2,pc).should == nil}
|
246
|
+
|
247
|
+
# @return [String] name of image coordinate system
|
248
|
+
it {@wcs.getradecsys.should == 'FK5'}
|
249
|
+
|
250
|
+
# Set output coordinate system for pix2wcs
|
251
|
+
#
|
252
|
+
# @param [String] coorsys Coordinate system (B1950, J2000, etc)
|
253
|
+
# @return [nil]
|
254
|
+
coorsys = 'J2000'
|
255
|
+
it {@wcs.wcsoutinit(coorsys).should == nil}
|
256
|
+
|
257
|
+
# @return [String] Return current output coordinate system
|
258
|
+
it {@wcs.getwcsout.should == 'FK5'}
|
259
|
+
|
260
|
+
# Set input coordinate system for wcs2pix
|
261
|
+
#
|
262
|
+
# @param [String] coorsys Coordinate system (B1950, J2000, etc)
|
263
|
+
# @return [nil]
|
264
|
+
it {@wcs.wcsininit(coorsys).should == nil}
|
265
|
+
|
266
|
+
# @return [String] Return current input coordinate system
|
267
|
+
it {@wcs.getwcsin.should == 'FK5'}
|
268
|
+
|
269
|
+
# Set WCS coordinate output format
|
270
|
+
#
|
271
|
+
# @param [Integer] degout 1= degrees, 0= hh:mm:ss dd:mm:ss
|
272
|
+
# @return [Integer]
|
273
|
+
degout = 1
|
274
|
+
it {@wcs.setwcsdeg(degout).should == 0}
|
275
|
+
|
276
|
+
# Set or get number of output decimal places
|
277
|
+
#
|
278
|
+
# @param [Integer] ndec Number of decimal places in output string. if < 0, return current ndec unchanged
|
279
|
+
ndec = 2
|
280
|
+
it {@wcs.wcsndec(ndec).should == 2}
|
281
|
+
|
282
|
+
# Change WCS using arguments
|
283
|
+
#
|
284
|
+
# @param [Float] crpix1 Horizontal reference pixel
|
285
|
+
# @param [Float] crpix2 Vertical reference pixel
|
286
|
+
# @param [Float] crval1 Reference pixel horizontal coordinate in degrees
|
287
|
+
# @param [Float] crval2 Reference pixel vertical coordinate in degrees
|
288
|
+
# @param [Float] cdelt1 Horizontal scale in degrees/pixel, ignored if cd is not NULL
|
289
|
+
# @param [Float] cdelt2 Vertical scale in degrees/pixel, ignored if cd is not NULL
|
290
|
+
# @param [Float] crota Rotation angle in degrees, ignored if cd is not NULL
|
291
|
+
# @param [Array] cd Rotation matrix, used if not NULL
|
292
|
+
# @return [Integer]
|
293
|
+
|
294
|
+
crpix1 = 0 # /* Reference pixel coordinates */
|
295
|
+
crpix2 = 0 # /* Reference pixel coordinates */
|
296
|
+
crval1 = 0 # /* Coordinate at reference pixel in degrees */
|
297
|
+
crval2 = 0 # /* Coordinate at reference pixel in degrees */
|
298
|
+
cd = nil # /* Rotation matrix, used if not NULL */
|
299
|
+
cdelt1 = 0.1 # /* scale in degrees/pixel, if cd is NULL */
|
300
|
+
cdelt2 = 0.1 # /* scale in degrees/pixel, if cd is NULL */
|
301
|
+
crota = 0 # /* Rotation angle in degrees, if cd is NULL */
|
302
|
+
|
303
|
+
it {@wcs.wcsreset(crpix1,crpix2,crval1,crval2,cdelt1,cdelt2,crota,cd).should == 0}
|
304
|
+
|
305
|
+
# Change equinox of reference pixel coordinates in WCS
|
306
|
+
#
|
307
|
+
# @param [Float] equinox Desired equinox as fractional year
|
308
|
+
# @return [nil]
|
309
|
+
equinox = 2000
|
310
|
+
it {@wcs.wcseqset(equinox).should == nil}
|
311
|
+
|
312
|
+
# Set pix2wcst() mode for LINEAR coordinates
|
313
|
+
#
|
314
|
+
# @param [Integer] mode 0: x y linear, 1: x units x units, 2: x y linear units
|
315
|
+
# @return [Integer]
|
316
|
+
mode = 0
|
317
|
+
it {@wcs.setwcslin(mode).should == nil}
|
318
|
+
|
319
|
+
# Return coordinate in third dimension
|
320
|
+
#
|
321
|
+
# @return [Integer]
|
322
|
+
it {@wcs.wcszout.should == 0}
|
323
|
+
end
|
324
|
+
|
325
|
+
|
326
|
+
describe "Wcs" do
|
327
|
+
alpha = 0
|
328
|
+
delta = 0
|
329
|
+
describe Wcs.wcscon(Wcs::J2000,Wcs::GALACTIC,0,0,alpha,delta,2000) do
|
330
|
+
it{should be_close_to [96.33726964987589, -60.188551749437046]}
|
331
|
+
end
|
332
|
+
|
333
|
+
|
334
|
+
# Compute angular distance between 2 sky positions
|
335
|
+
#
|
336
|
+
# @param [Float] ra1 First longitude/right ascension in degrees
|
337
|
+
# @param [Float] dec1 First latitude/declination in degrees
|
338
|
+
# @param [Float] ra2 Second longitude/right ascension in degrees
|
339
|
+
# @param [Float] dec2 Second latitude/declination in degrees
|
340
|
+
# @return [Float]
|
341
|
+
ra1 = 0
|
342
|
+
dec1 = 0
|
343
|
+
ra2 = 1
|
344
|
+
dec2 = 1
|
345
|
+
describe Wcs.wcsdist(ra1,dec1,ra2,dec2) do
|
346
|
+
it{should be_close_to 1.414177660951948}
|
347
|
+
end
|
348
|
+
|
349
|
+
# Compute angular distance between 2 sky positions
|
350
|
+
#
|
351
|
+
# @param [Float] ra1 First longitude/right ascension in degrees
|
352
|
+
# @param [Float] dec1 First latitude/declination in degrees
|
353
|
+
# @param [Float] ra2 Second longitude/right ascension in degrees
|
354
|
+
# @param [Float] dec2 Second latitude/declination in degrees
|
355
|
+
# @return [Float]
|
356
|
+
describe Wcs.wcsdiff(ra1,dec1,ra2,dec2) do
|
357
|
+
it{should be_close_to 1.4142404881141812}
|
358
|
+
end
|
359
|
+
|
360
|
+
# Set WCS error message for later printing
|
361
|
+
#
|
362
|
+
# @param [String] errmsg Error mesage < 80 char
|
363
|
+
# @return [String]
|
364
|
+
errmsg = "test message"
|
365
|
+
describe Wcs.setwcserr(errmsg) do
|
366
|
+
it{should == ""}
|
367
|
+
end
|
368
|
+
|
369
|
+
# Print WCS error message to stderr
|
370
|
+
# @return [nil]
|
371
|
+
describe Wcs.wcserr do
|
372
|
+
it{should == ""}
|
373
|
+
end
|
374
|
+
|
375
|
+
# Set flag to use AIPS WCS instead of WCSLIB
|
376
|
+
#
|
377
|
+
# @param [Integer] oldwcs 1 for AIPS WCS subroutines, else WCSLIB
|
378
|
+
# @return [String]
|
379
|
+
oldwcs = 0
|
380
|
+
describe Wcs.setdefwcs(oldwcs) do
|
381
|
+
it{should ==""}
|
382
|
+
end
|
383
|
+
|
384
|
+
# Return flag for AIPS WCS set by setdefwcs
|
385
|
+
# @return [Integer]
|
386
|
+
describe Wcs.getdefwcs do
|
387
|
+
it{should == 0}
|
388
|
+
end
|
389
|
+
|
390
|
+
# Set third dimension for cube projections
|
391
|
+
#
|
392
|
+
# @param [Integer] izpix Set coordinate in third dimension (face)
|
393
|
+
# @return [Integer]
|
394
|
+
izpix = 4
|
395
|
+
describe Wcs.wcszin(izpix) do
|
396
|
+
it{should == 4}
|
397
|
+
end
|
398
|
+
|
399
|
+
# Set filename for WCS error message
|
400
|
+
#
|
401
|
+
# @param [String] filename FITS or IRAF file name
|
402
|
+
# @return [String]
|
403
|
+
filename = 'test.dat'
|
404
|
+
describe Wcs.setwcsfile(filename) do
|
405
|
+
it{should == ''}
|
406
|
+
end
|
407
|
+
|
408
|
+
|
409
|
+
# Save output coordinate system
|
410
|
+
#
|
411
|
+
# @param [String] wcscoor coordinate system (J2000, B1950, galactic)
|
412
|
+
# @return [String]
|
413
|
+
wcscoor = 'J2000'
|
414
|
+
describe Wcs.savewcscoor(wcscoor) do
|
415
|
+
it{should == ''}
|
416
|
+
end
|
417
|
+
|
418
|
+
# Return output coordinate system
|
419
|
+
# @return [String]
|
420
|
+
describe Wcs.getwcscoor do
|
421
|
+
it{should == 'J2000'}
|
422
|
+
end
|
423
|
+
|
424
|
+
# Convert from coordinate system sys1 to coordinate system sys2, converting
|
425
|
+
# proper motions, too, and adding them if an epoch is specified
|
426
|
+
#
|
427
|
+
# @param [Integer] sys1 Input coordinate system (J2000, B1950, ECLIPTIC, GALACTIC
|
428
|
+
# @param [Integer] sys2 Output coordinate system (J2000, B1950, ECLIPTIC, G ALACTIC
|
429
|
+
# @param [Float] eq1 Input equinox (default of sys1 if 0.0)
|
430
|
+
# @param [Float] eq2 Output equinox (default of sys2 if 0.0)
|
431
|
+
# @param [Float] ep1 Input Besselian epoch in years
|
432
|
+
# @param [Float] ep2 Output Besselian epoch in years
|
433
|
+
# @param [Float] dtheta Longitude or right ascension in degrees in sys1
|
434
|
+
# @param [Float] dphi Latitude or declination in degrees in sys1
|
435
|
+
# @param [Float] ptheta Longitude or right ascension proper motion in deg/year in sys1
|
436
|
+
# @param [Float] pphi Latitude or declination proper motion in deg/year
|
437
|
+
# @param [Float] px Parallax in arcseconds
|
438
|
+
# @param [Float] rv Radial velocity in km/sec
|
439
|
+
# @return [[dtheta,dphi,ptheta,pphi,px,rv]]
|
440
|
+
# * dtheta: Longitude or right ascension in degrees in sys1
|
441
|
+
# * dphi: Latitude or declination in degrees in sys1
|
442
|
+
# * ptheta: Longitude or right ascension proper motion in deg/year in sys1
|
443
|
+
# * pphi: Latitude or declination proper motion in deg/year
|
444
|
+
# * px: Parallax in arcseconds
|
445
|
+
# * rv: Radial velocity in km/sec
|
446
|
+
sys1 = Wcs::J2000
|
447
|
+
sys2 = Wcs::GALACTIC
|
448
|
+
eq1 = 0
|
449
|
+
eq2 = 0
|
450
|
+
ep1 = 2000
|
451
|
+
ep2 = 2000
|
452
|
+
dtheta = 0
|
453
|
+
dphi = 0
|
454
|
+
ptheta = 0
|
455
|
+
pphi = 0
|
456
|
+
px = 0
|
457
|
+
rv = 0
|
458
|
+
describe Wcs.wcsconv(sys1,sys2,eq1,eq2,ep1,ep2,dtheta,dphi,ptheta,pphi,px,rv) do
|
459
|
+
it{should be_close_to [96.33726964987589, -60.188551749437046, 0.0, 0.0, 0.0, 0.0]}
|
460
|
+
# This function is defined in C
|
461
|
+
end
|
462
|
+
|
463
|
+
# Convert from coordinate system sys1 to coordinate system sys2, converting
|
464
|
+
# proper motions, too, and adding them if an epoch is specified
|
465
|
+
#
|
466
|
+
# @param [Integer] sys1 Input coordinate system (J2000, B1950, ECLIPTIC, GALACTIC
|
467
|
+
# @param [Integer] sys2 Output coordinate system (J2000, B1950, ECLIPTIC, GALACTIC
|
468
|
+
# @param [Float] eq1 Input equinox (default of sys1 if 0.0)
|
469
|
+
# @param [Float] eq2 Output equinox (default of sys2 if 0.0)
|
470
|
+
# @param [Float] ep1 Input Besselian epoch in years (for proper motion)
|
471
|
+
# @param [Float] ep2 Output Besselian epoch in years (for proper motion)
|
472
|
+
# @param [Float] dtheta Longitude or right ascension in degrees
|
473
|
+
# @param [Float] dphi Latitude or declination in degrees
|
474
|
+
# @param [Float] ptheta Longitude or right ascension proper motion in RA degrees/yea
|
475
|
+
# @param [Float] pphi Latitude or declination proper motion in Dec degrees/year
|
476
|
+
# @return [[dtheta,dphi,ptheta,pphi]]
|
477
|
+
# * dtheta: Longitude or right ascension in degrees
|
478
|
+
# * dphi: Latitude or declination in degrees
|
479
|
+
# * ptheta: Longitude or right ascension proper motion in RA degrees/yea
|
480
|
+
# * pphi: Latitude or declination proper motion in Dec degrees/year
|
481
|
+
sys1 = Wcs::J2000
|
482
|
+
sys2 = Wcs::GALACTIC
|
483
|
+
eq1 = 0
|
484
|
+
eq2 = 0
|
485
|
+
ep1 = 0
|
486
|
+
ep2 = 0
|
487
|
+
dtheta = 0
|
488
|
+
dphi = 0
|
489
|
+
ptheta = 0
|
490
|
+
pphi = 0
|
491
|
+
describe Wcs.wcsconp(sys1,sys2,eq1,eq2,ep1,ep2,dtheta,dphi,ptheta,pphi) do
|
492
|
+
it{should be_close_to [96.33726964987589, -60.188551749437046, 0.0, 0.0]}
|
493
|
+
end
|
494
|
+
|
495
|
+
# Convert between coordinate systems and equinoxes
|
496
|
+
#
|
497
|
+
# @param [Integer] sys1 Input coordinate system (J2000, B1950, ECLIPTIC, GALACTIC
|
498
|
+
# @param [Integer] sys2 Output coordinate system (J2000, B1950, ECLIPTIC, G ALACTIC
|
499
|
+
# @param [Float] eq1 Input equinox (default of sys1 if 0.0)
|
500
|
+
# @param [Float] eq2 Output equinox (default of sys2 if 0.0)
|
501
|
+
# @param [Float] dtheta Longitude or right ascension in degrees
|
502
|
+
# @param [Float] dphi Latitude or declination in degrees
|
503
|
+
# @param [Float] epoch Besselian epoch in years
|
504
|
+
# @return [[dtheta,dphi]]
|
505
|
+
# * dtheta: Longitude or right ascension in degrees
|
506
|
+
# * dphi: Latitude or declination in degrees
|
507
|
+
sys1 = Wcs::J2000
|
508
|
+
sys2 = Wcs::GALACTIC
|
509
|
+
eq1 = 0
|
510
|
+
eq2 = 0
|
511
|
+
dtheta = 0
|
512
|
+
dphi = 0
|
513
|
+
epoch = 2000
|
514
|
+
describe Wcs.wcscon(sys1,sys2,eq1,eq2,dtheta,dphi,epoch) do
|
515
|
+
it{should be_close_to [96.33726964987589, -60.188551749437046]}
|
516
|
+
end
|
517
|
+
|
518
|
+
# Convert B1950(FK4) to J2000(FK5) coordinates
|
519
|
+
#
|
520
|
+
# @param [Float] ra Right ascension in degrees (B1950 in, J2000 out)
|
521
|
+
# @param [Float] dec Declination in degrees (B1950 in, J2000 out)
|
522
|
+
# @param [Float] epoch Besselian epoch in years
|
523
|
+
# @return [[ra,dec]]
|
524
|
+
ra = 0
|
525
|
+
dec = 0
|
526
|
+
epoch = 2000
|
527
|
+
describe Wcs.fk425e(ra,dec,epoch) do
|
528
|
+
it{should be_close_to [0.6407243227035837, 0.2783490290365543]}
|
529
|
+
end
|
530
|
+
|
531
|
+
# Convert J2000(FK5) to B1950(FK4) coordinates
|
532
|
+
#
|
533
|
+
# @param [Float] ra Right ascension in degrees (J2000 in, B1950 out)
|
534
|
+
# @param [Float] dec Declination in degrees (J2000 in, B1950 out)
|
535
|
+
# @param [Float] epoch Besselian epoch in years
|
536
|
+
# @return [[ra,dec]]
|
537
|
+
ra = 0
|
538
|
+
dec = 0
|
539
|
+
epoch = 2000
|
540
|
+
describe Wcs.fk524e(ra,dec,epoch) do
|
541
|
+
it{should be_close_to [359.3592746342251, -0.27834947215423617]}
|
542
|
+
end
|
543
|
+
|
544
|
+
# Return code for coordinate system in string
|
545
|
+
#
|
546
|
+
# @param [String] coorsys Coordinate system (B1950, J2000, etc)
|
547
|
+
# @return [Integer]
|
548
|
+
coorsys = 'J2000'
|
549
|
+
describe Wcs.wcscsys(coorsys) do
|
550
|
+
it{should == 1}
|
551
|
+
end
|
552
|
+
|
553
|
+
# Set equinox from string
|
554
|
+
#
|
555
|
+
# @param [String] wcstring_in Coordinate system (B1950, J2000, etc)
|
556
|
+
# @return [Float] return 0.0 if not obvious
|
557
|
+
wcstring_in = 'J2000'
|
558
|
+
describe Wcs.wcsceq(wcstring_in) do
|
559
|
+
it{should == 2000}
|
560
|
+
end
|
561
|
+
|
562
|
+
# Set coordinate system type string from system and equinox
|
563
|
+
#
|
564
|
+
# @param [Integer] syswcs Coordinate system code
|
565
|
+
# @param [Float] equinox Equinox of coordinate system
|
566
|
+
# @param [Float] epoch Epoch of coordinate system
|
567
|
+
# @return [String] Coordinate system string (returned)
|
568
|
+
syswcs = Wcs::J2000
|
569
|
+
equinox = 2000
|
570
|
+
epoch = 2000
|
571
|
+
describe Wcs.wcscstr(syswcs,equinox,epoch) do
|
572
|
+
it{should == "J2000"}
|
573
|
+
end
|
574
|
+
|
575
|
+
# Convert RA and Dec in degrees and distance to vector
|
576
|
+
#
|
577
|
+
# @param [Float] ra Right ascension in degrees
|
578
|
+
# @param [Float] dec Declination in degrees
|
579
|
+
# @param [Float] r Distance to object in same units as pos
|
580
|
+
# @return [[x,y,z]] x,y,z geocentric equatorial position of object
|
581
|
+
ra = 0
|
582
|
+
dec = 0
|
583
|
+
r = 1
|
584
|
+
describe Wcs.d2v3(ra,dec,r) do
|
585
|
+
it{should be_close_to [1,0,0]}
|
586
|
+
end
|
587
|
+
|
588
|
+
# Convert RA and Dec in radians and distance to vector
|
589
|
+
#
|
590
|
+
# @param [Float] ra Right ascension in radians
|
591
|
+
# @param [Float] dec Declination in radians
|
592
|
+
# @param [Float] r Distance to object in same units as pos
|
593
|
+
# @return [[x,y,z]] x,y,z geocentric equatorial position of object
|
594
|
+
describe Wcs.s2v3(ra,dec,r) do
|
595
|
+
it{should be_close_to [1,0,0]}
|
596
|
+
end
|
597
|
+
|
598
|
+
# Convert vector to RA and Dec in degrees and distance
|
599
|
+
#
|
600
|
+
# @param [Array] pos x,y,z geocentric equatorial position of object
|
601
|
+
# @return [[ra,dec,r]]
|
602
|
+
# * ra: Right ascension in degrees (returned)
|
603
|
+
# * dec: Declination in degrees (returned)
|
604
|
+
# * r: Distance to object in same units as pos (returned)
|
605
|
+
pos = [1.0,1.0,1.0]
|
606
|
+
describe Wcs.v2d3(pos) do
|
607
|
+
it{should be_close_to [45.0, 35.264389682754654, 1.7320508075688772]}
|
608
|
+
end
|
609
|
+
|
610
|
+
# Convert vector to RA and Dec in radians and distance
|
611
|
+
#
|
612
|
+
# @param [Array] pos x,y,z geocentric equatorial position of object
|
613
|
+
# @return [[ra,dec,r]]
|
614
|
+
# * ra: Right ascension in radians (returned)
|
615
|
+
# * dec: Declination in radians (returned)
|
616
|
+
# * r: Distance to object in same units as pos (returned)
|
617
|
+
describe Wcs.v2s3(pos) do
|
618
|
+
it{should be_close_to [0.7853981633974483, 0.6154797086703873, 1.7320508075688772]}
|
619
|
+
end
|
620
|
+
|
621
|
+
end
|