miriad 4.1.0.12 → 4.1.0.14
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.
- data/Rakefile +2 -2
- data/ext/miriad_ruby.i +22 -6
- data/ext/miriad_wrap.c +25 -9
- data/lib/miriad.rb +188 -40
- metadata +2 -2
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: Rakefile
|
1
|
+
# $Id: Rakefile 33 2009-03-17 21:30:46Z davidm $
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'rake/gempackagetask'
|
@@ -14,7 +14,7 @@ run_swig unless test ?e, 'ext/miriad_wrap.c'
|
|
14
14
|
spec = Gem::Specification.new do |s|
|
15
15
|
# Basics
|
16
16
|
s.name = 'miriad'
|
17
|
-
s.version = '4.1.0.
|
17
|
+
s.version = '4.1.0.14'
|
18
18
|
s.summary = 'Ruby interface to MIRIAD'
|
19
19
|
s.description = <<-EOS
|
20
20
|
The MIRIAD-Ruby package...
|
data/ext/miriad_ruby.i
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* $Id: miriad_ruby.i
|
2
|
+
* $Id: miriad_ruby.i 33 2009-03-17 21:30:46Z davidm $
|
3
3
|
*
|
4
4
|
* Ruby specific typemaps for MIRIAD Swig wrapper
|
5
5
|
*/
|
@@ -7,6 +7,22 @@
|
|
7
7
|
#if defined SWIGRUBY
|
8
8
|
|
9
9
|
%{
|
10
|
+
#ifndef RARRAY_LEN
|
11
|
+
#define RARRAY_LEN(a) (RARRAY(a)->len)
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#ifndef RARRAY_PTR
|
15
|
+
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
|
16
|
+
#endif
|
17
|
+
|
18
|
+
#ifndef RSTRING_LEN
|
19
|
+
#define RSTRING_LEN(s) (RSTRING(s)->len)
|
20
|
+
#endif
|
21
|
+
|
22
|
+
#ifndef RSTRING_PTR
|
23
|
+
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
24
|
+
#endif
|
25
|
+
|
10
26
|
VALUE mirlib_eWrappedMirlibError;
|
11
27
|
%}
|
12
28
|
|
@@ -53,7 +69,7 @@ VALUE mirlib_eWrappedMirlibError;
|
|
53
69
|
// Store or convert doubles to Ruby Objects
|
54
70
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
55
71
|
// TODO Is this legit?
|
56
|
-
|
72
|
+
RFLOAT_VALUE(ptr[i]) = $1[i];
|
57
73
|
} else {
|
58
74
|
ptr[i] = rb_float_new($1[i]);
|
59
75
|
}
|
@@ -99,7 +115,7 @@ VALUE mirlib_eWrappedMirlibError;
|
|
99
115
|
// Store or convert doubles to Ruby Objects
|
100
116
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
101
117
|
// TODO Is this legit?
|
102
|
-
|
118
|
+
RFLOAT_VALUE(ptr[i]) = $1[i];
|
103
119
|
} else {
|
104
120
|
ptr[i] = rb_float_new($1[i]);
|
105
121
|
}
|
@@ -242,7 +258,7 @@ PUTVRX_TYPEMAP(NA_DFLOAT,double,NUM2DBL);
|
|
242
258
|
// putvr typemap.
|
243
259
|
%typemap(in) (int type) {
|
244
260
|
if(TYPE($input) == T_STRING) {
|
245
|
-
$1 = (int)((
|
261
|
+
$1 = (int)((RSTRING_PTR($input))[0]);
|
246
262
|
} else {
|
247
263
|
$1 = NUM2INT($input);
|
248
264
|
}
|
@@ -288,8 +304,8 @@ PUTVRX_TYPEMAP(NA_DFLOAT,double,NUM2DBL);
|
|
288
304
|
// Make sure we have a string!
|
289
305
|
VALUE val = rb_ary_entry(vinput3,0);
|
290
306
|
Check_Type(val, T_STRING);
|
291
|
-
$1 =
|
292
|
-
$2 =
|
307
|
+
$1 = RSTRING_PTR(val);
|
308
|
+
$2 = RSTRING_LEN(val);
|
293
309
|
}
|
294
310
|
break;
|
295
311
|
default:
|
data/ext/miriad_wrap.c
CHANGED
@@ -1791,6 +1791,22 @@ typedef struct {
|
|
1791
1791
|
} uvio;
|
1792
1792
|
|
1793
1793
|
|
1794
|
+
#ifndef RARRAY_LEN
|
1795
|
+
#define RARRAY_LEN(a) (RARRAY(a)->len)
|
1796
|
+
#endif
|
1797
|
+
|
1798
|
+
#ifndef RARRAY_PTR
|
1799
|
+
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
|
1800
|
+
#endif
|
1801
|
+
|
1802
|
+
#ifndef RSTRING_LEN
|
1803
|
+
#define RSTRING_LEN(s) (RSTRING(s)->len)
|
1804
|
+
#endif
|
1805
|
+
|
1806
|
+
#ifndef RSTRING_PTR
|
1807
|
+
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
1808
|
+
#endif
|
1809
|
+
|
1794
1810
|
VALUE mirlib_eWrappedMirlibError;
|
1795
1811
|
|
1796
1812
|
|
@@ -2518,7 +2534,7 @@ _wrap_Uvio_putvr(int argc, VALUE *argv, VALUE self) {
|
|
2518
2534
|
if (argc > 2) {
|
2519
2535
|
{
|
2520
2536
|
if(TYPE(argv[2]) == T_STRING) {
|
2521
|
-
arg5 = (int)((
|
2537
|
+
arg5 = (int)((RSTRING_PTR(argv[2]))[0]);
|
2522
2538
|
} else {
|
2523
2539
|
arg5 = NUM2INT(argv[2]);
|
2524
2540
|
}
|
@@ -2562,8 +2578,8 @@ _wrap_Uvio_putvr(int argc, VALUE *argv, VALUE self) {
|
|
2562
2578
|
// Make sure we have a string!
|
2563
2579
|
VALUE val = rb_ary_entry(vinput3,0);
|
2564
2580
|
Check_Type(val, T_STRING);
|
2565
|
-
arg3 =
|
2566
|
-
arg4 =
|
2581
|
+
arg3 = RSTRING_PTR(val);
|
2582
|
+
arg4 = RSTRING_LEN(val);
|
2567
2583
|
}
|
2568
2584
|
break;
|
2569
2585
|
default:
|
@@ -2717,7 +2733,7 @@ _wrap_Uvio_write(int argc, VALUE *argv, VALUE self) {
|
|
2717
2733
|
// Store or convert doubles to Ruby Objects
|
2718
2734
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
2719
2735
|
// TODO Is this legit?
|
2720
|
-
|
2736
|
+
RFLOAT_VALUE(ptr[i]) = arg2[i];
|
2721
2737
|
} else {
|
2722
2738
|
ptr[i] = rb_float_new(arg2[i]);
|
2723
2739
|
}
|
@@ -2736,7 +2752,7 @@ _wrap_Uvio_write(int argc, VALUE *argv, VALUE self) {
|
|
2736
2752
|
// Store or convert doubles to Ruby Objects
|
2737
2753
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
2738
2754
|
// TODO Is this legit?
|
2739
|
-
|
2755
|
+
RFLOAT_VALUE(ptr[i]) = arg3[i];
|
2740
2756
|
} else {
|
2741
2757
|
ptr[i] = rb_float_new(arg3[i]);
|
2742
2758
|
}
|
@@ -2838,7 +2854,7 @@ _wrap_Uvio_wwrite(int argc, VALUE *argv, VALUE self) {
|
|
2838
2854
|
// Store or convert doubles to Ruby Objects
|
2839
2855
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
2840
2856
|
// TODO Is this legit?
|
2841
|
-
|
2857
|
+
RFLOAT_VALUE(ptr[i]) = arg2[i];
|
2842
2858
|
} else {
|
2843
2859
|
ptr[i] = rb_float_new(arg2[i]);
|
2844
2860
|
}
|
@@ -3057,7 +3073,7 @@ _wrap_Uvio_uvread(int argc, VALUE *argv, VALUE self) {
|
|
3057
3073
|
// Store or convert doubles to Ruby Objects
|
3058
3074
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
3059
3075
|
// TODO Is this legit?
|
3060
|
-
|
3076
|
+
RFLOAT_VALUE(ptr[i]) = arg2[i];
|
3061
3077
|
} else {
|
3062
3078
|
ptr[i] = rb_float_new(arg2[i]);
|
3063
3079
|
}
|
@@ -3076,7 +3092,7 @@ _wrap_Uvio_uvread(int argc, VALUE *argv, VALUE self) {
|
|
3076
3092
|
// Store or convert doubles to Ruby Objects
|
3077
3093
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
3078
3094
|
// TODO Is this legit?
|
3079
|
-
|
3095
|
+
RFLOAT_VALUE(ptr[i]) = arg3[i];
|
3080
3096
|
} else {
|
3081
3097
|
ptr[i] = rb_float_new(arg3[i]);
|
3082
3098
|
}
|
@@ -3186,7 +3202,7 @@ _wrap_Uvio_uvwread(int argc, VALUE *argv, VALUE self) {
|
|
3186
3202
|
// Store or convert doubles to Ruby Objects
|
3187
3203
|
if(TYPE(ptr[i]) == T_FLOAT) {
|
3188
3204
|
// TODO Is this legit?
|
3189
|
-
|
3205
|
+
RFLOAT_VALUE(ptr[i]) = arg2[i];
|
3190
3206
|
} else {
|
3191
3207
|
ptr[i] = rb_float_new(arg2[i]);
|
3192
3208
|
}
|
data/lib/miriad.rb
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# astronomy related methods to Ruby classes.
|
8
8
|
#
|
9
9
|
#--
|
10
|
-
# $Id: miriad.rb
|
10
|
+
# $Id: miriad.rb 33 2009-03-17 21:30:46Z davidm $
|
11
11
|
#++
|
12
12
|
|
13
13
|
require 'rbconfig'
|
@@ -27,45 +27,47 @@ Math::const_set :CKMS, 299792.458 unless Math::const_defined? :CKMS
|
|
27
27
|
module Math
|
28
28
|
# Convert possibly non-integer degrees +fr+ to [degrees, minutes, seconds]
|
29
29
|
# where degrees and minutes are integers.
|
30
|
-
def
|
30
|
+
def d_to_dms(fr)
|
31
31
|
sign = fr <=> 0
|
32
32
|
fr *= sign
|
33
33
|
d = fr.to_i; fr %= 1; fr *= 60
|
34
34
|
m = fr.to_i; fr %= 1; fr *= 60
|
35
35
|
return d*sign, m, fr
|
36
36
|
end
|
37
|
+
module_function :d_to_dms
|
37
38
|
|
38
39
|
# Convert possibly non-integer hours +fr+ to [hours, minutes, seconds]
|
39
40
|
# where hours and minutes are integers.
|
40
|
-
def
|
41
|
+
def h_to_hms(fr); d_to_dms(fr); end; module_function :h_to_hms
|
41
42
|
|
42
43
|
# Convert degrees, minutes, seconds to possibly non-integer degrees.
|
43
44
|
# Missing arguments are assumed to be 0.
|
44
|
-
def
|
45
|
+
def dms_to_d(*args)
|
45
46
|
d = 0.to_r
|
46
47
|
d += args.shift unless args.empty?
|
47
|
-
sign = d
|
48
|
+
sign = d < 0 ? -1 : 1
|
48
49
|
d += args.shift * Rational(sign,60) unless args.empty?
|
49
50
|
d += args.shift * Rational(sign,3600) unless args.empty?
|
50
51
|
return d
|
51
52
|
end
|
53
|
+
module_function :dms_to_d
|
52
54
|
|
53
55
|
# Convert hours, minutes, seconds to possibly non-integer hours.
|
54
56
|
# Missing arguments are assumed to be 0.
|
55
|
-
def
|
57
|
+
def hms_to_h(*args); dms_to_d(*args); end
|
56
58
|
|
57
59
|
# Convert degrees to radians
|
58
|
-
def
|
60
|
+
def d2r(d) d*PI/180; end; module_function :d2r
|
59
61
|
# Convert radians to degrees
|
60
|
-
def
|
62
|
+
def r2d(r) r*180/PI; end; module_function :r2d
|
61
63
|
# Convert hours to radians
|
62
|
-
def
|
64
|
+
def h2r(h) h*PI/12; end; module_function :h2r
|
63
65
|
# Convert radians to hours
|
64
|
-
def
|
66
|
+
def r2h(r) r*12/PI; end; module_function :r2h
|
65
67
|
# Convert degrees to hours
|
66
|
-
def
|
68
|
+
def d2h(d) d/15.0; end; module_function :d2h
|
67
69
|
# Convert hours to degrees
|
68
|
-
def
|
70
|
+
def h2d(h) h*15.0; end; module_function :h2d
|
69
71
|
end
|
70
72
|
|
71
73
|
# The MIRIAD package adds angle conversion and angle formatting methods to
|
@@ -329,26 +331,75 @@ module Miriad
|
|
329
331
|
# -8:: 'YX' (Linear YX)
|
330
332
|
POLMAP = a_lookup_table
|
331
333
|
|
332
|
-
# call-seq:
|
334
|
+
# call-seq:
|
335
|
+
# Miriad.dir2hadec(obsra, obsdec, lst) -> [ha, obsdec]
|
336
|
+
# Miriad.dir2hadec(obsra, obsdec, lst, <tt>:radec</tt>) -> [ha, obsdec]
|
337
|
+
# Miriad.dir2hadec(az, el, latitude, <tt>:azel</tt>) -> [ha, obsdec]
|
338
|
+
#
|
339
|
+
# Compute the hour angle +ha+ and apparent declination +obsdec+ of the
|
340
|
+
# direction given by +obsra+ and +obsdec+ at local apparent sidereal time
|
341
|
+
# +lst+ or +az+ and +el+ at the given +latitude+.
|
342
|
+
#
|
343
|
+
# +obsra+, +obsdec+, +lst+ (i.e. right ascension and declination in the
|
344
|
+
# current epoch) at the local apparent sidereal time +lst+) if type is
|
345
|
+
# <tt>:radec</tt> (or not specified).
|
346
|
+
#
|
347
|
+
# +az+, +el+, +latitude+ (i.e. azimuth and elevation at latitude) if
|
348
|
+
# type is <tt>:azel</tt>.
|
349
|
+
#
|
350
|
+
# +obsra+, +obsdec+, +lst+, +az+, +el+, +latitude+ should be given in
|
351
|
+
# radians.
|
352
|
+
def dir2hadec(azra, eldec, latlst, type=:radec)
|
353
|
+
if type == :azel
|
354
|
+
latlst = String(ENV['LATITUDE']).dms_to_d.d2r unless latlst
|
355
|
+
n, e, u = azel2neu(azra, eldec) # az, el
|
356
|
+
x, y, z = neu2xyz(n, e, u, latlst) # n, e, u, lat
|
357
|
+
ha = Math.atan2(-y, x)
|
358
|
+
dec = Math.atan2(z, Math.hypot(x, y))
|
359
|
+
elsif type == :radec
|
360
|
+
ha = latlst - azra # lst - ra
|
361
|
+
dec = eldec
|
362
|
+
else
|
363
|
+
raise ArgumentError, "invalid type (#{type.inspect})"
|
364
|
+
end
|
365
|
+
[ha, dec]
|
366
|
+
end
|
367
|
+
module_function :dir2hadec
|
368
|
+
|
369
|
+
# call-seq:
|
370
|
+
# Miriad.xyz2uvw(xyz1, xyz2, obsra, obsdec, lst) -> [u, v, w]
|
371
|
+
# Miriad.xyz2uvw(xyz1, xyz2, obsra, obsdec, lst, <tt>:radec</tt>) -> [u, v, w]
|
372
|
+
# Miriad.xyz2uvw(xyz1, xyz2, az, el, latitude, <tt>:azel</tt>) -> [u, v, w]
|
333
373
|
#
|
334
374
|
# Compute the [u,v,w] projection of a baseline with endpoints <tt>xyz1</tt>
|
335
|
-
# and <tt>xyz2</tt>
|
336
|
-
#
|
337
|
-
# sidereal time +lst+. <tt>xyz1</tt> and <tt>xyz2</tt> are three element
|
375
|
+
# and <tt>xyz2</tt>
|
376
|
+
# <tt>xyz1</tt> and <tt>xyz2</tt> are three element
|
338
377
|
# arrays containing equitorial coordinates of the baseline endpoints, and
|
339
|
-
# +obsra+, +obsdec+, and +lst+ are all in radians
|
378
|
+
# +obsra+, +obsdec+, and +lst+ are all in radians in the direction of:
|
379
|
+
#
|
380
|
+
#
|
381
|
+
# +obsra+, +obsdec+, +lst+ (i.e. right ascension and declination in the
|
382
|
+
# current epoch) at the local apparent sidereal time +lst+) if
|
383
|
+
# type is <tt>:radec</tt> (or not specified).
|
384
|
+
#
|
385
|
+
# +az+, +el+, +latitude+ (i.e. azimuth and elevation at latitude) if
|
386
|
+
# +type+ is <tt>:azel</tt>.
|
387
|
+
#
|
388
|
+
# +obsra+, +obsdec+, +lst+, +az+, +el+, +latitude+ should be given in
|
389
|
+
# radians.
|
340
390
|
#
|
341
|
-
#
|
391
|
+
# Much of the body of this method was transcribed from the MIRIAD source file
|
342
392
|
# <tt>uvcal.for</tt>.
|
343
|
-
def
|
393
|
+
def xyz2uvw(xyz1, xyz2, azra, eldec, latlst, type=:radec)
|
344
394
|
x1,y1,z1 = xyz1
|
345
395
|
x2,y2,z2 = xyz2
|
346
396
|
|
347
|
-
ha =
|
397
|
+
ha, dec = dir2hadec(azra, eldec, latlst, type)
|
398
|
+
|
348
399
|
sinha = Math.sin(ha)
|
349
400
|
cosha = Math.cos(ha)
|
350
|
-
sind = Math.sin(
|
351
|
-
cosd = Math.cos(
|
401
|
+
sind = Math.sin(dec)
|
402
|
+
cosd = Math.cos(dec)
|
352
403
|
|
353
404
|
bxx = x2 - x1
|
354
405
|
byy = y2 - y1
|
@@ -360,6 +411,7 @@ module Miriad
|
|
360
411
|
|
361
412
|
[u,v,w]
|
362
413
|
end
|
414
|
+
module_function :xyz2uvw
|
363
415
|
|
364
416
|
# call-seq:
|
365
417
|
# Miriad.neu2xyz(n, e, u, latitude) -> [x, y, z]
|
@@ -372,8 +424,8 @@ module Miriad
|
|
372
424
|
# Output coordinates will be in the same units as the input coordinates.
|
373
425
|
#
|
374
426
|
# See also Miriad.xyz2neu
|
375
|
-
def
|
376
|
-
n, e, u, latitude, extra = args.flatten
|
427
|
+
def neu2xyz(*args)
|
428
|
+
n, e, u, latitude, extra = args.flatten
|
377
429
|
latitude ||= ENV.fetch('LATITUDE','0.0').dms_to_d.d2r
|
378
430
|
|
379
431
|
sinlat = Math.sin(latitude)
|
@@ -384,11 +436,14 @@ module Miriad
|
|
384
436
|
n * coslat + u * sinlat
|
385
437
|
]
|
386
438
|
end
|
439
|
+
module_function :neu2xyz
|
387
440
|
|
388
441
|
# :stopdoc:
|
442
|
+
alias :xyz2neu :neu2xyz
|
389
443
|
class << self
|
390
444
|
alias :xyz2neu :neu2xyz
|
391
445
|
end
|
446
|
+
|
392
447
|
# :startdoc:
|
393
448
|
# RDoc xyz2neu as a method rather than an alias
|
394
449
|
if false
|
@@ -412,9 +467,50 @@ module Miriad
|
|
412
467
|
n * coslat + u * sinlat
|
413
468
|
]
|
414
469
|
end
|
470
|
+
end # RDoc hack
|
471
|
+
|
472
|
+
# call-seq: Miriad.azel2neu(azimuth, elevation) -> [n, e, u]
|
473
|
+
#
|
474
|
+
# Compute northing +n+, easting +e+, and up +u+ from +azimuth+ and
|
475
|
+
# +elevation+ at a unit distance (i.e. the length of the returned [n, e, u]
|
476
|
+
# vector will be 1). +azimuth+ and +elevation+ should be in radians.
|
477
|
+
def azel2neu(az, el)
|
478
|
+
cosel = Math.cos(el)
|
479
|
+
n = cosel*Math.cos(az)
|
480
|
+
e = cosel*Math.sin(az)
|
481
|
+
u = Math.sin(el)
|
482
|
+
[n, e, u]
|
483
|
+
end
|
484
|
+
module_function :azel2neu
|
485
|
+
|
486
|
+
# call-seq: Miriad.neu2azel(n, e, u) -> [azimuth, elevation]
|
487
|
+
#
|
488
|
+
# Compute the +azimuth+ and +elevation+ for the given northing +n+, easting
|
489
|
+
# +e+, and up +u+. The returned +azimuth+ and +elevation+ will be in
|
490
|
+
# radians.
|
491
|
+
def neu2azel(n, e, u)
|
492
|
+
az = Math.atan2(e,n)
|
493
|
+
ne = Math.hypot(n,e)
|
494
|
+
el = Math.atan2(u,ne)
|
495
|
+
[az, el]
|
415
496
|
end
|
497
|
+
module_function :neu2azel
|
416
498
|
|
417
|
-
# call-seq:
|
499
|
+
# call-seq:
|
500
|
+
# Miriad.azeldelay(+neu+, +az+, +el+) -> +delay+
|
501
|
+
# Miriad.azeldelay(+n+, +e+, +u+, +az+, +el+) -> +delay+
|
502
|
+
#
|
503
|
+
# Computes the delay in the direction given by +az+ and +el+ seen by a
|
504
|
+
# baseline given in N, E, U topocentric coordinates (either as a three
|
505
|
+
# element +neu+ array or as individual parameters).
|
506
|
+
def azeldelay(*args)
|
507
|
+
bn, be, bu, az, el = args.flatten
|
508
|
+
sn, se, su = azel2neu(az, el)
|
509
|
+
bn*sn + be*se + bu*su
|
510
|
+
end
|
511
|
+
module_function :azeldelay
|
512
|
+
|
513
|
+
# call-seq: Miriad.radec2azel(obsra, obsdec, lst, latitude) -> [azimuth, elevation]
|
418
514
|
#
|
419
515
|
# Compute +azimuth+ and +elevation+ from +obsra+, +obsdec+, +lst+,
|
420
516
|
# +latitude+.
|
@@ -439,7 +535,7 @@ module Miriad
|
|
439
535
|
#
|
440
536
|
# The body of this method was transcribed from the miriad source file
|
441
537
|
# <tt>ephem.for</tt> originally created by Bob Sault.
|
442
|
-
def
|
538
|
+
def radec2azel(obsra, obsdec, lst, latitude=String(ENV['LATITUDE']).dms_to_d.d2r)
|
443
539
|
ha = lst - obsra
|
444
540
|
cosha = Math.cos(ha)
|
445
541
|
sinha = Math.sin(ha)
|
@@ -454,26 +550,71 @@ module Miriad
|
|
454
550
|
|
455
551
|
[az, el]
|
456
552
|
end
|
553
|
+
module_function :radec2azel
|
554
|
+
|
555
|
+
alias :azel :radec2azel
|
556
|
+
class << self
|
557
|
+
alias :azel :radec2azel
|
558
|
+
end
|
559
|
+
|
560
|
+
# call-seq: Miriad.azel2radec(azimuth, elevation, lst, latitude) -> [ra, dec]
|
561
|
+
#
|
562
|
+
# Compute the apparent +ra+ and +dec+ (in current epoch) from +azimuth+,
|
563
|
+
# +elevation+, +lst+, and +latitude+.
|
564
|
+
#
|
565
|
+
# NOTE: This calculation is based on a spherical model for the earth, and
|
566
|
+
# does not include any atmospheric effects (e.g. refraction).
|
567
|
+
#
|
568
|
+
# Input:
|
569
|
+
#
|
570
|
+
# +azimuth+:: Azimuth from north (radians).
|
571
|
+
# +elevation+:: Elevation from horizon (radians).
|
572
|
+
# +lst+:: Local sidereal time (radians).
|
573
|
+
# +latitude+:: Observatory geodetic latitude (radians). If not given, the
|
574
|
+
# value from <tt>ENV['LATITUDE']</tt> (which should be in
|
575
|
+
# degrees in <tt>dd:mm:ss.sss</tt> or <tt>dd.ddd</tt> format)
|
576
|
+
# will be used.
|
577
|
+
#
|
578
|
+
# Output:
|
579
|
+
#
|
580
|
+
# +ra+:: Apparent RA of the source of interest (radians).
|
581
|
+
# +dec+:: Apparent DEC of the source of interest (radians).
|
582
|
+
def azel2radec(az, el, lst, latitude=String(ENV['LATITUDE']).dms_to_d.d2r)
|
583
|
+
x, y, z = Miriad.neu2xyz(azel2neu(az, el), latitude)
|
584
|
+
ha = Math.atan2(-y, x)
|
585
|
+
ra = (lst - ha) % (2*Math::PI)
|
586
|
+
dec = Math.atan2(z, Math.hypot(x, y))
|
587
|
+
[ra, dec]
|
588
|
+
end
|
589
|
+
module_function :azel2radec
|
457
590
|
|
458
|
-
# call-seq:
|
591
|
+
# call-seq:
|
592
|
+
# Miriad.fringe_rate(bx, by, freq, obsra, obsdec, lst)
|
593
|
+
# Miriad.fringe_rate(bx, by, freq, obsra, obsdec, lst, <tt>:radec</tt>)
|
594
|
+
# Miriad.fringe_rate(bx, by, freq, az, el, latitude, <tt>:azel</tt>)
|
595
|
+
#
|
596
|
+
# Computes the Earth rotation synthesis fringe rate at sky frequency +freq+
|
597
|
+
# for a source in the direction given by either +obsra+ and +obsdec+ at local
|
598
|
+
# sidereal time +lst+ or +az+ and +el+ at +latitude+ as seen by a baseline
|
599
|
+
# with X and Y equitorial components +bx+ and +by+.
|
459
600
|
#
|
460
|
-
#
|
461
|
-
#
|
462
|
-
# by a baseline with X and Y equitorial components +bx+ and +by+.
|
601
|
+
# +obsra+, +obsdec+, +lst+, +az+, +el+, +latitude+ should be given in
|
602
|
+
# radians.
|
463
603
|
#
|
464
604
|
# The units of the result depends on the the units of the inputs. To get
|
465
605
|
# turns per second (i.e. Hz), +bx+ and +by+ should be in nanoseconds and
|
466
606
|
# +freq+ should be in GHz (alternatively, +bx+ and +by+ in seconds and +freq+
|
467
607
|
# in Hz). To get radians per second, multiply +freq+ by 2*Math::PI. To get
|
468
608
|
# degrees per second, multiply +freq+ by 360.
|
469
|
-
def
|
470
|
-
ha =
|
609
|
+
def fringe_rate(bx, by, freq, azra, eldec, latlst, type=:radec)
|
610
|
+
ha, obsdec = dir2hadec(azra, eldec, latlst, type)
|
471
611
|
cosha = Math.cos(ha)
|
472
612
|
sinha = Math.sin(ha)
|
473
613
|
cosd = Math.cos(obsdec)
|
474
614
|
|
475
615
|
-freq * DateTime::OMEGA * (bx*sinha + by*cosha) * cosd
|
476
616
|
end
|
617
|
+
module_function :fringe_rate
|
477
618
|
|
478
619
|
# call-seq: Miriad.parang(obsra, obsdec, lst, latitude) -> parallactic_angle
|
479
620
|
#
|
@@ -496,13 +637,14 @@ module Miriad
|
|
496
637
|
#
|
497
638
|
# The body of this method was transcribed from the miriad source file
|
498
639
|
# <tt>ephem.for</tt> originally created by Bob Sault.
|
499
|
-
def
|
640
|
+
def parang(obsra, obsdec, lst, latitude=String(ENV['LATITUDE']).dms_to_d.d2r)
|
500
641
|
ha = lst - obsra
|
501
642
|
sinq = Math.cos(latitude) * Math.sin(ha)
|
502
643
|
cosq = Math.sin(latitude) * Math.cos(obsdec) -
|
503
644
|
Math.cos(latitude) * Math.sin(obsdec) * Math.cos(ha)
|
504
645
|
Math.atan2(sinq, cosq)
|
505
646
|
end
|
647
|
+
module_function :parang
|
506
648
|
|
507
649
|
# call-seq: Miriad.precess(ra, dec, to_jd, from_jd) -> [ra, dec]
|
508
650
|
#
|
@@ -532,7 +674,7 @@ module Miriad
|
|
532
674
|
#
|
533
675
|
# The body of this method was transcribed from the miriad source file
|
534
676
|
# <tt>ephem.for</tt> originally created by Bob Sault.
|
535
|
-
def
|
677
|
+
def precess(ra, dec, to_jd=DateTime.now.ajd, from_jd=DateTime::J2000.ajd)
|
536
678
|
t = (from_jd - 2451545)/36525
|
537
679
|
m = Math::PI/180 * (1.2812323 + (0.0003879 + 0.0000101*t)*t)*t
|
538
680
|
n = Math::PI/180 * (0.5567530 - (0.0001185 + 0.0000116*t)*t)*t
|
@@ -557,46 +699,51 @@ module Miriad
|
|
557
699
|
|
558
700
|
[ra, dec]
|
559
701
|
end
|
702
|
+
module_function :precess
|
560
703
|
|
561
704
|
# call-seq: Miriad.basstr(baseline, format='%d-%d') -> "A1-A2"
|
562
705
|
#
|
563
706
|
# Format a MIRIAD baseline number as a String according to +format+.
|
564
|
-
def
|
707
|
+
def basstr(baseline, format='%d-%d')
|
565
708
|
baseline = baseline.to_i
|
566
709
|
format % basant(baseline)
|
567
710
|
end
|
711
|
+
module_function :basstr
|
568
712
|
|
569
713
|
# call-seq: Miriad.basant(baseline) -> [a1, a2]
|
570
714
|
#
|
571
715
|
# Convert a MIRIAD baseline number into two antenna numbers.
|
572
|
-
def
|
716
|
+
def basant(baseline)
|
573
717
|
baseline = baseline.to_i
|
574
718
|
[baseline/256, baseline%256]
|
575
719
|
end
|
720
|
+
module_function :basant
|
576
721
|
|
577
722
|
# call-seq: Miriad.antbas(a1, a2) -> baseline_number
|
578
723
|
#
|
579
724
|
# Convert two antenna numbers into a MIRIAD baseline number
|
580
|
-
def
|
725
|
+
def antbas(a1,a2)
|
581
726
|
a1, a2 = a2, a1 if a2 < a1
|
582
727
|
a1.to_i*256 + a2.to_i
|
583
728
|
end
|
729
|
+
module_function :antbas
|
584
730
|
|
585
731
|
# call-seq: Miriad.basidx(a1, a2, n) -> baseline_index
|
586
732
|
#
|
587
733
|
# Convert two antenna numbers, <tt>a1</tt> and <tt>a2</tt>, into a baseline
|
588
734
|
# index (NOT a MIRIAD baseline number) using +n+ as the maximum antenna
|
589
735
|
# number.
|
590
|
-
def
|
736
|
+
def basidx(a1,a2,n)
|
591
737
|
a1, a2 = a2, a1 if a2 < a1
|
592
738
|
return a1 + ((2*n+1)*(a2-a1) - (a2-a1)**2) / 2
|
593
739
|
end
|
740
|
+
module_function :basidx
|
594
741
|
|
595
742
|
# call-seq: Miriad.idxbas(baseline_index, n) -> [a1, a2]
|
596
743
|
#
|
597
744
|
# Convert a baseline index (NOT a MIRIAD baseline number) +i+ into two
|
598
745
|
# antenna numbers using +n+ as the maximum antenna number.
|
599
|
-
def
|
746
|
+
def idxbas(i,n)
|
600
747
|
b = -(2*n+1)
|
601
748
|
ac = 2*i
|
602
749
|
r = Math.sqrt(b**2-4*ac)
|
@@ -605,6 +752,7 @@ module Miriad
|
|
605
752
|
a2 = a1 + d
|
606
753
|
[a1, a2]
|
607
754
|
end
|
755
|
+
module_function :idxbas
|
608
756
|
|
609
757
|
# The Visibility class holds preamble, visdata, and flags for one integration
|
610
758
|
# on one baseline. It also provides convenience methods to query and access
|
@@ -893,7 +1041,7 @@ module Miriad
|
|
893
1041
|
# Format the current value of the _baseline_ uv variable as a String
|
894
1042
|
# according to +format+.
|
895
1043
|
def basstr(format='%d-%d')
|
896
|
-
format % basant
|
1044
|
+
format % basant
|
897
1045
|
end
|
898
1046
|
|
899
1047
|
# call-seq: basant -> [ant1, ant2]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: miriad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.0.
|
4
|
+
version: 4.1.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David MacMahon
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-18 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|