Python接口到望远镜指向机器C库。
项目描述
Python接口到TPM C库
** 开发已停止 **
PyTPM是望远镜指向机器 (TPM) 库的Python接口。TPM是由Jeffrey W Percival编写的C库,用于在几个天体坐标系之间进行坐标转换。
TPM的设计目标是将其集成到望远镜控制系统。为了实现这一目标,TPM提供了对坐标转换过程中进行的计算的控制。其中一些计算必须频繁执行,例如与时间相关的计算。其他计算只需每晚执行一次,例如章动和岁差矩阵。TPM允许用户选择要执行的确切计算。这使用户能够控制计算负载,这在望远镜控制系统中非常重要。TPM C库被KPNO WIYN天文台和WHAM项目使用。
PyTPM不是一个完整的天体测量学包。目标是提供从Python访问TPM C代码的方法。可以使用《cite>pytpm.tpm子模块直接访问TPM机制。子模块《cite>pytpm.convert有几个方便的函数,可用于执行坐标转换。这对于大多数计算足够了,但不是所有计算。在尝试使用《cite>pytpm.tpm模块之前,应先阅读《a href="http://www.sal.wisc.edu/~jwp/astro/tpm/tpm.html" rel="nofollow">TPM手册。该手册位于源代码存储库中,也包含在PyTPM文档中。
Python接口的TPM C代码是用Cython编写的。
安装PyTPM
PyTPM需要以下软件:
Python 2.6、2.7或3.2。
GCC。
Distribute软件包。
用于运行测试的Nose。
Cython,仅在需要重新生成Cython输出时。
要构建文档,需要Sphinx和numpydoc Sphinx扩展。
PyTPM已在Ubuntu 10.10和11.04上进行了测试。
安装
如果您没有Distribute,则安装它。然后执行以下操作之一:
pip或easy_install
安装pip,然后运行pip install pytpm。
如果可用的话,easy_install pytpm也将起作用。Distribute包含easy_install。pip本身可以使用命令easy_install pip安装。
或者
手动安装。
从项目的pypi页面下载发行版。然后运行python setup.py install。使用–prefix <dest>或–user参数更改安装位置。
使用这两种方法,都可以使用virtualenv和virtualenvwrapper。这些工具可以轻松安装和维护Python包。
要运行测试和构建文档,必须遵循手动安装方法。运行python setup.py test,然后运行python setup.py install。要构建文档,在doc目录中运行make html。
示例
详细文档可在http://phn.github.com/pytpm找到。HTML格式的文档也可以从项目的pypi页面下载。ReST格式的文档位于发行版的doc目录中。
PyTPM可以用来将给定天体坐标系统中的位置和速度转换成另一个系统。这方面的示例在源代码库的examples文件夹中,也包含在HTML文档中。
在使用pytpm.tpm模块之前,应阅读TPM手册。手册也位于源代码库和HTML文档中。
以下示例中,将M100的坐标在不同系统之间进行转换。
以下示例使用便利函数pytpm.convert.convertv6,而不是直接使用底层TPM函数。文档中也有使用后者的示例。
convertv6函数接受以下参数。对于给定的转换,不一定需要指定所有这些参数。
参数 |
描述 |
---|---|
v6 |
一个V6C向量或V6C向量的列表。 |
s1 |
起始状态 |
s2 |
结束状态 |
epoch |
坐标的儒略日作为坐标的儒略日。 |
equinox |
坐标的儒略日作为春分点的儒略日。 |
utc |
“观测”时间的儒略日;确切含义取决于转换类型;默认为J2000.0。 |
delta_ut |
UT1 - UTC的秒数。 |
delta_at |
TAI - UTC的秒数。 |
lon |
地心经度(度)。 |
lat |
大地纬度,单位为度 |
alt |
海拔,单位为米 |
xpole |
极移,单位为弧度 |
ypole |
极移,单位为弧度 |
T |
温度,单位为开尔文 |
P |
压力,单位为毫巴 |
H |
相对湿度(0-1) |
波长 |
观测波长的单位为微米 |
V6C对象是一个6维向量,用于存储笛卡尔坐标系中的位置和速度。可以使用函数pytpm.convert.v62cat从目录数据创建一个V6C对象。此函数可以接受标量或坐标列表。函数pytpm.convert.v62cat可以将V6C对象转换为目录坐标。坐标以字典的形式返回。此函数还可以接受一个V6C对象列表,并返回一个字典列表。
使用整数或整数常量指定坐标系。这些被称为状态。以下是一些重要的状态。
状态 |
描述 |
---|---|
3 |
IAU 1980 黄道系统 |
4 |
IAU 1958银河系 |
5 |
日心平均FK4系统,B1950春分点 |
6 |
日心平均FK5系统,J2000春分点 |
11 |
地心视FK5,当前春分点 |
16 |
测站视FK5,当前春分点 |
17 |
测站视(时角,赤纬) |
18 |
测站视(方位角,仰角) |
19 |
测站观测(方位角,仰角) |
20 |
测站观测(时角,赤纬) |
FK5春分点和历元J2000.0到FK4春分点和历元B1950.0
首先获取FK5春分点J2000.0和历元J2000.0的赤经和赤纬坐标,单位为弧度。
>>> ra_j2000 = tpm.HMS(hh=12, mm=22, ss=54.899).to_radians() >>> dec_j2000 = tpm.DMS(dd=15, mm=49, ss=20.57).to_radians()
为对象创建一个V6C向量。请注意,pytpm.convert.cat2v6也可以接受坐标列表。
>>> v6 = convert.cat2v6(ra_j2000, dec_j2000)
现在转换为FK4春分点B1950.0,但保持历元J2000.0。在下面的例子中,“6”代表FK5春分点和历元J2000.0坐标,“5”代表FK4春分点和历元B1950.0。历元和春分点使用“epoch”和“equinox”关键字指定。但它们可以根据要求的精确转换有不同的解释。在这种情况下,它们适用于输入坐标。
>>> v6_fk4 = convert.convertv6(v6, s1=6, s2=5, epoch=tpm.J2000, ...: equinox=tpm.J2000)
将V6C转换为目录数据并打印结果。函数pytpm.convert.v62cat也可以接受V6C对象列表。
>>> d = convert.v62cat(v6_fk4, C=tpm.CB) >>> print tpm.HMS(r=d['alpha']) 12H 20M 22.935S >>> print tpm.DMS(r=d['delta']) +16D 05' 58.024"
参数C是一个世纪的日数。速度单位为AU/天,必须转换为“/世纪”。在贝塞尔体系中,一个世纪大约有36524.22天,而在儒略体系中,一个世纪有36525.0天。前者用于FK4,后者用于FK5。默认值设置为36525.0。
注意,上述结果与SIMBAD给出的FK4值不一致。这是因为结果是为历元J2000.0。即使对象没有自行运动,FK4系统相对于FK5是旋转的。这导致FK4系统中出现虚假的自行运动。我们必须从历元J2000.0到历元B1950.0应用自行运动,以获得最终结果。
>>> v6_fk4_ep1950 = convert.proper_motion(v6_fk4, tpm.B1950, tpm.J2000)
最后将V6C转换为目录数据并打印结果。最终结果是FK4春分点和历元B1950.0。最终结果与SIMBAD给出的值一致。
>>> d = convert.v62cat(v6_fk4_ep1950, C=tpm.CB) >>> print tpm.HMS(r=d['alpha']) 12H 20M 22.943S >>> print tpm.DMS(r=d['delta']) +16D 05' 58.241"
FK5春分点和历元J2000到IAU 1958银河系
IAU 1958银河系使用状态4表示。以下结果为历元J2000.0。SIMBAD给出的银河坐标历元为J2000.0。因此,以下得到的结果是我们需要的,即我们不需要应用任何自行运动修正。
>>> ra_j2000 = tpm.HMS(hh=12, mm=22, ss=54.899).to_radians() >>> dec_j2000 = tpm.DMS(dd=15, mm=49, ss=20.57).to_radians() >>> v6 = convert.cat2v6(ra_j2000, dec_j2000) >>> v6_gal = convert.convertv6(v6, s1=6, s2=4, epoch=tpm.J2000, ...: equinox=tpm.J2000) >>> d = convert.v62cat(v6_gal) >>> print tpm.r2d(d['alpha']) 271.136139562 >>> print tpm.r2d(d['delta']) 76.8988689751
IAU 1958银河系到FK5春分点和历元J2000.0
在这里,我们将起始状态设置为银河系,即4,将结束状态设置为FK5春分点。由于输入坐标位于历元J2000.0,最终结果也将位于历元J2000.0,即FK5春分点和历元J2000.0。
>>> gal_lon = tpm.d2r(271.1361) >>> gal_lat = tpm.d2r(76.8989) >>> v6 = convert.cat2v6(gal_lon, gal_lat) >>> v6_fk5 = convert.convertv6(v6, s1=4, s2=6, epoch=tpm.J2000) >>> d = convert.v62cat(v6_fk5) >>> print tpm.HMS(r=d['alpha']) 12H 22M 54.900S >>> print tpm.DMS(r=d['delta']) +15D 49' 20.683"
结果与输入银河坐标的精度一致。
FK5春分点和历元J2000到IAU 1980黄道系
使用状态3指示黄道系。这里输出黄道坐标的历元将是J2000.0。
>>> ra_j2000 = tpm.HMS(hh=12, mm=22, ss=54.899).to_radians() >>> dec_j2000 = tpm.DMS(dd=15, mm=49, ss=20.57).to_radians() >>> v6 = convert.cat2v6(ra_j2000, dec_j2000) >>> v6_ecl = convert.convertv6(v6, s1=6, s2=3, epoch=tpm.J2000, ...: equinox=tpm.J2000) >>> d = convert.v62cat(v6_ecl) >>> print tpm.r2d(d['alpha']) 178.78256462 >>> print tpm.r2d(d['delta']) 16.7597002513
结果与SLALIB(pyslalib)程序中的结果一致,该程序使用了sla_eqecl。
IAU 1980 黄道系统到FK5赤道和J2000.0历元
起始状态设置为黄道为3,终止状态设置为FK5赤道和J2000.0历元为6。
>>> ecl_lon = tpm.d2r(178.78256462) >>> ecl_lat = tpm.d2r(16.7597002513) >>> v6 = convert.cat2v6(ecl_lon, ecl_lat) >>> v6_fk5 = convert.convertv6(v6, s1=3, s2=6, epoch=tpm.J2000) >>> d = convert.v62cat(v6_fk5) >>> print tpm.HMS(r=d['alpha']) 12H 22M 54.898S >>> print tpm.DMS(r=d['delta']) +15D 49' 20.570"
FK5赤道和J2000.0历元到地心视
计算了2010/1/1午夜的地心视赤经和赤纬,如下所示。地心视位置的状态识别号为11。
获取观测时间的UTC和TDB时间。
>>> utc = tpm.gcal2j(2010, 1, 1) - 0.5 # midnight >>> tdb = tpm.utc2tdb(utc)
获取坐标和V6C向量。
>>> ra_j2000 = tpm.HMS(hh=12, mm=22, ss=54.899).to_radians() >>> dec_j2000 = tpm.DMS(dd=15, mm=49, ss=20.57).to_radians() >>> v6 = convert.cat2v6(ra_j2000, dec_j2000)
从J2000.0历元到观测历元应用自行。在这个例子中,由于自行为零,因此不需要这样做。但我们这样做是为了完整性。结果是FK5 J2000当前历元。
>>> v6 = convert.proper_motion(v6, tt, tpm.J2000)
将坐标从FK5赤道J2000历元,当前历元转换为FK5赤道和日期历元。
>>> v6_gc = convert.convertv6(v6, s1=6, s2=11, utc=utc) >>> d = convert.v62cat(v6_gc) >>> print tpm.r2d(d['alpha']) 185.860038856 >>> print tpm.r2d(d['delta']) 15.7631353482
以下给出SLALIB(pyslalib)的等效转换结果,使用sla_map函数。
>>> utc = slalib.sla_caldj(2010, 1, 1)[0] # midnight >>> tt = slalib.sla_dtt(utc) / 86400.0 + utc >>> r, d = slalib.sla_map(ra_j2000, dec_j2000, 0, 0, 0, 0.0, 2000.0, ...: tt) >>> tpm.r2d(r) 185.86002229414245 >>> tpm.r2d(d) 15.763142468669891
赤经的差异约为0.06弧秒,赤纬的差异约为0.03弧秒。
>>> (tpm.r2d(r) - 185.860038856) * 3600.0 -0.059622687126648088 >>> (tpm.r2d(d) - 15.7631353482) * 3600.0 0.025633691604554087
FK5赤道和J2000.0历元到视向心观测
对于默认位置(KPNO)的观测者在2010/1/1午时的视向心方位角和仰角(以及天顶距)被计算。最终状态,即视向心方位角和仰角,为19。
对于2010/1/1午夜,此物体位于地平线以下,因此折射计算不可靠。因此我们使用午时作为以下例子的示例。
>>> utc = tpm.gcal2j(2010, 1, 1) # mid-day >>> tt = tpm.utc2tdb(utc) >>> ra_j2000 = tpm.HMS(hh=12, mm=22, ss=54.899).to_radians() >>> dec_j2000 = tpm.DMS(dd=15, mm=49, ss=20.57).to_radians() >>> v6 = convert.cat2v6(ra_j2000, dec_j2000) >>> v6 = convert.proper_motion(v6, tt, tpm.J2000) >>> v6_app = convert.convertv6(v6, s1=6, s2=19, utc=utc) >>> d = convert.v62cat(v6_app) >>> print tpm.r2d(d['alpha']), 90 - tpm.r2d(d['delta']) 133.49820871 22.0162437585
为了计算观测时的时角和赤纬,可以使用上面获得的v6_app向量作为输入。我们不需要回到FK5赤道和J2000.0历元值。输入状态现在是19,输出,即视向心观测时角和赤纬,为20。
>>> v6_hadec = convert.convertv6(v6_app, s1=19, s2=20, utc=utc) >>> d = convert.v62cat(v6_hadec) >>> print tpm.r2d(d['alpha']) 343.586827647 >>> print tpm.r2d(d['delta']) 15.7683070508
为了计算观测的赤经,我们需要找到LAST,因为TPM只提供视赤经。观测赤经可以通过从LAST减去时角来找到。这是我们需要访问底层TPM在pytpm.tpm中提供的机械的一个例子。请查阅TPM手册和PyTPM文档以获取更多信息。
>>> tstate = tpm.TSTATE() >>> tpm.tpm_data(tstate, tpm.TPM_INIT) >>> tstate.utc = utc >>> tstate.delta_ut = tpm.delta_UT(utc) >>> tstate.delta_at = tpm.delta_AT(utc) >>> tstate.lon = tpm.d2r(-111.598333) >>> tstate.lat = tpm.d2r(31.956389) >>> tpm.tpm_data(tstate, tpm.TPM_ALL) >>> last = tpm.r2d(tpm.r2r(tstate.last)) >>> last - tpm.r2d(d['alpha']) + 360.0 185.85569737491355
使用SLALIB和sla_aop进行相同的计算,产生的结果与PyTPM一致。
>>> dut = tpm.delta_UT(tpm.gcal2j(2010, 1, 1)) # DUT for mid-day. >>> utc = slalib.sla_caldj(2010, 1, 1)[0] + 0.5 # mid-day. >>> tt = slalib.sla_dtt(utc) / 86400.0 + utc >>> r, d = slalib.sla_map(ra_j2000, dec_j2000, 0, 0, 0, 0.0, 2000.0, ...: tt) >>> lon = tpm.d2r(-111.598333) >>> lat = tpm.d2r(31.956389) >>> az, zd, ha, dec, ra = slalib.sla_aop(r, d, utc, dut, lon, lat, ...: 2093.093, 0, 0, 273.15, 1013.25, 0, 0.550, 0.0065) >>> tpm.r2d(tpm.r2r(az)), tpm.r2d(tpm.r2r(zd)) 133.498195532 22.0162383595
时角、赤纬和赤经如下
>>> print tpm.r2d(tpm.r2r(ha)) 343.586827289 >>> print tpm.r2d(tpm.r2r(dec)) 15.7683143606 >>> print tpm.r2d(tpm.r2r(ra)) 185.855680678
请参考PyTPM文档的相应部分,以详细比较PyTPM和SLALIB。
转换位置和速度
转换位置和速度的步骤与上面显示的示例完全相同。《convert.cat2v6》函数将除了位置外,还包括自行、径向速度和视差。返回的字典将包含最终自行、径向速度和视差的适当字段。
请参阅文件《doc/examples/conversions.py》以获取完整的示例。该文件也包含在HTML文档和源代码分发中。
例如,如果《tab》是一个包含完整的6-D坐标的表,键为《ra》、《dec》、《pma》、《pmd》、《px》和《rv》,则可以构建完整的《V6C》向量如下
>>> v6 = convert.cat2v6(tab['ra'], tab['dec'], tab['pma'], ...: tab['pmd'], tab['px'], rv, tpm.CJ)
请参阅《convert.convertv6》函数的docstring以了解这些的单位。
要将其从FK5转换为黄道,在相同的历元,可以使用
>>> v6o = convert.convertv6(v6, s1=6, s2=3) >>> cat = convert.v62cat(v6o)
变量《cat》将包含字典,或字典列表,包含相关的目录量。请参阅此《convert.v62cat》的docstring以了解输出量的单位。
致谢和许可证
Jeffrey W Percival编写了《TPM》C库。《src/tpm/TPM_LICENSE.txt》中包含了TPM许可证。
这里使用的是从《astrolib》库的《coords》包(版本0.36)中获得的版本。《astrolib》库缺少上述源中的某些C源文件,这些文件由Jeff Percival提供。
PyTPM 的 Python 和 Cython 代码在 BSD 许可下发布;请参阅 LICENSE.txt。
如需报告错误、评论和建议,请发送电子邮件至 prasanthhn,邮箱域名为 gmail.com。
项目详情
PyTPM-0.7.1.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 37c1082482f0a338583d77932faf0b1ddee9aa19643a8c189890912759b82279 |
|
MD5 | 99a6fb3e56fcadcad3a1f60865c11071 |
|
BLAKE2b-256 | 9ed48a0284d9042989e64cf85188fffc458309556d43cba1a10d09bf3ff3d4aa |