wcs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|