跳转到主要内容

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输出时。

要构建文档,需要Sphinxnumpydoc Sphinx扩展。

PyTPM已在Ubuntu 10.10和11.04上进行了测试。

安装

如果您没有Distribute,则安装它。然后执行以下操作之一:

  • pipeasy_install

    安装pip,然后运行pip install pytpm

    如果可用的话,easy_install pytpm也将起作用。Distribute包含easy_install。pip本身可以使用命令easy_install pip安装。

或者

  • 手动安装。

    从项目的pypi页面下载发行版。然后运行python setup.py install。使用–prefix <dest>–user参数更改安装位置。

使用这两种方法,都可以使用virtualenvvirtualenvwrapper。这些工具可以轻松安装和维护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 (1.7 MB 查看散列)

上传时间 源代码

由以下支持