使用SpectalCod类#

警告

这个 SpectralCoord 类在Astropy V4.1中是新的,目前应该被认为是实验性的。请注意,我们并不完全支持观察者和目标相对于彼此相对移动的情况,因此在这种情况下应该小心。根据用户的反馈,Astropy的未来版本中可能会有API的变化。如果您对如何改进有具体的想法,请在|ASTPY-DEV邮件列表|或http://feedback.astropy.org.上与我们联系

这个 SpectralCoord 类提供了一个接口,用于表示和转换光谱坐标,如频率、波长和光子能量,以及等效多普勒速度。平淡无奇 Quantity 类也可以表示这些物理量,并允许通过专用的等价物(例如 u.spectralu.doppler_* 等价物), SpectralCoord (它是 Quantity )目的是使这一点更直接,也可以使观察者和目标参考帧意识到,例如允许从望远镜中心(或拓扑中心)帧转换为例如重心或局部静止标准(LSRK和LSRD)速度帧。

创建SpectralCord对象#

自从 SpectralCoord 类是 Quantity ,初始化它的最简单方法是提供一个或多个值和一个单位,或者 Quantity ::

>>> from astropy import units as u
>>> from astropy.coordinates import SpectralCoord
>>> sc1 = SpectralCoord(34.2, unit='GHz')
>>> sc1
<SpectralCoord 34.2 GHz>
>>> sc2 = SpectralCoord([654.2, 654.4, 654.6] * u.nm)
>>> sc2
<SpectralCoord [654.2, 654.4, 654.6] nm>

在这一点上,我们并没有对观察者的框架,或者被观察到的目标做任何假设。我们将在后面的章节中看到,在初始化时可以提供更多信息 SpectralCoord 对象,但首先我们来看看这些对象的简单单位转换。

单位换算#

默认情况下,光谱单位之间的单位转换不必指定 u.spectral 等效性:

>>> sc2.to(u.micron)
<SpectralCoord [0.6542, 0.6544, 0.6546] micron>
>>> sc2.to(u.eV)
<SpectralCoord [1.89520328, 1.89462406, 1.89404519] eV>
>>> sc2.to(u.THz)
<SpectralCoord [458.25811373, 458.11805929, 457.97809044] THz>

就像情况一样 Quantity 以及 Doppler equivalencies 假设一个特定的静止频率或波长(如光谱线的频率),也可以将这些绝对光谱坐标转换成速度。例如,要将上面的值转换为相对于656.65 nm处的哈尔法线的速度,假设采用光学多普勒约定,您可以执行以下操作:

>>> sc3 = sc2.to(u.km / u.s,
...              doppler_convention='optical',
...              doppler_rest=656.65 * u.nm)
>>> sc3
<SpectralCoord
   (doppler_rest=656.65 nm
    doppler_convention=optical)
  [-1118.5433977 , -1027.23373258,  -935.92406746] km / s>

The rest value for the Doppler conversion as well as the convention to use are stored in the resulting sc3 SpectralCoord object. You can then convert back to frequency without having to specify them again:

>>> sc3.to(u.THz)
<SpectralCoord
   (doppler_rest=656.65 nm
    doppler_convention=optical)
  [458.25811373, 458.11805929, 457.97809044] THz>

或者可以显式指定要使用的其他约定或rest值:

>>> sc3.to(u.km / u.s, doppler_convention='relativistic')
<SpectralCoord
   (doppler_rest=656.65 nm
    doppler_convention=relativistic)
  [-1120.63005892, -1028.99362163,  -937.38499411] km / s>

也可以设置 doppler_conventiondoppler_rest 从创建一个 SpectralCoord 在频率、能量或波长上:

>>> sc4 = SpectralCoord(343 * u.GHz,
...                     doppler_convention='radio',
...                     doppler_rest=342.91 * u.GHz)
>>> sc4.to(u.km / u.s)
<SpectralCoord
   (doppler_rest=342.91 GHz
    doppler_convention=radio)
  -78.68338987 km / s>

参考坐标系变换#

如果您使用任何类型的光谱数据,则通常需要确定和/或应用由于参考帧不同而产生的速度校正,或者应用或消除红移的影响。使用 SpectralCoord 班级:

  • 可以指定或更改观察者和目标之间的速度偏移或红移,而不必指定绝对观察者和目标,而是指定速度差。例如,你知道视线上有15公里/秒的速度差,或者你观察到的是一个z=3.2的星系。这对于快速分析非常有用,但不会为您确定任何帧变换(例如从拓扑中心到重心)。

  • 您可以指定观察者和目标的绝对位置,以及观察的日期,这意味着 SpectralCoord 然后可以计算不同的帧变换。如果有关于观察者和目标的信息,这是推荐的方法,尽管它要求您在设置 SpectralCoord

在接下来的两个部分中,我们将依次讨论这些问题。

手动指定径向速度或红移#

作为一个例子,我们将考虑一个 SpectralCoord 它代表构成(小)频谱x轴的频率。我们碰巧知道被观测到的目标的红移为z=0.5,我们假设由于地球运动引起的任何频率偏移都不重要。在望远镜的参考坐标系中,分光计提供了10个500到900纳米的数值:

>>> import numpy as np
>>> wavs = SpectralCoord(np.linspace(500, 900, 9) * u.nm, redshift=0.5)
>>> wavs  
<SpectralCoord
   (observer to target:
      radial_velocity=115304.79153846153 km / s
      redshift=0.5)
  [500., 550., 600., 650., 700., 750., 800., 850., 900.] nm>

我们在这里设置了红移值=0.5,这样我们就可以跟踪光谱值所在的参考系。这个 radial_velocity 属性给出了相当于红移的衰退速度,它确实足够大,我们不必担心地球围绕太阳自转的问题(这最多将是~30km/s的贡献)。

备注

SpectralCoord ,我们使用了红移和速度之间的完全相对论关系,即。 \(1 + z = \sqrt{{(1 + v/c)/(1 - v/c)}}\)

我们现在想改变波长,这样它们就可以在星系的其余部分了。我们可以使用 to_rest() 方法:

>>> wavs_rest = wavs.to_rest()
>>> wavs_rest
<SpectralCoord
   (observer to target:
      radial_velocity=0.0 km / s
      redshift=0.0)
  [333.33333333, 366.66666667, 400.        , 433.33333333, 466.66666667,
   500.        , 533.33333333, 566.66666667, 600.        ] nm>

波长减少了1/3,这是我们期望的z=0.5。注意 redshiftradial_velocity 属性现在为零,因为我们在目标的参考坐标系中。我们也可以使用 with_radial_velocity_shift() 方法更普遍地应用红移和速度校正。使用此方法的最简单方法是给出一个将应用于目标的值-如果此值没有单位,则将其解释为红移:

>>> wavs_orig = wavs_rest.with_radial_velocity_shift(0.5)
>>> wavs_orig  
<SpectralCoord
   (observer to target:
      radial_velocity=115304.79153846153 km / s
      redshift=0.5)
  [500., 550., 600., 650., 700., 750., 800., 850., 900.] nm>

这将返回一个与我们开始使用的对象等价的对象,因为我们应用了红移0.5。我们也可以提供一个速度作为 Quantity ::

>>> wavs_rest.with_radial_velocity_shift(100000 * u.km / u.s)
<SpectralCoord
   (observer to target:
      radial_velocity=100000.0 km / s
      redshift=0.41458078170200463)
  [471.52692723, 518.67961996, 565.83231268, 612.9850054 , 660.13769813,
   707.29039085, 754.44308357, 801.5957763 , 848.74846902] nm>

在红移约为0.33时将值移到参考系(即,如果光谱确实包含来自z=0.33的物体的贡献,则这些将是该物体的剩余波长。

显式指定观察者和目标#

在中使用更高级的功能 SpectralCoord ,包括在不同的定义良好的速度帧之间轻松转换的能力,您需要向它提供关于观察者和目标的位置(以及可选的速度)的信息。通过传递坐标框对象或 SkyCoord 物体。举一个具体的例子,假设我们现在用阿尔玛望远镜观测到Tτ源。为了创建一个与之对应的观察者对象,我们可以使用 EarthLocation 班级:

>>> from astropy.coordinates import EarthLocation
>>> location = EarthLocation.of_site('ALMA')  
>>> location  
<EarthLocation (2225015.30883296, -5440016.41799762, -2481631.27428014) m>

以米为单位的三个值是地心坐标,即相对于地球中心的三维坐标。看到了吗 EarthLocation 有关创建这类对象的不同方法的详细信息。

一旦你做到了这一点,你将需要转换 location 使用 get_itrs() 方法,它需要观察时间(对于任何类型的速度帧变换来说,这一点很重要):

>>> from astropy.time import Time
>>> alma = location.get_itrs(obstime=Time('2019-04-24T02:32:10'))
>>> alma  
<ITRS Coordinate (obstime=2019-04-24T02:32:10.000, location=(0., 0., 0.) km): (x, y, z) in m
    (2225015.30883296, -5440016.41799762, -2481631.27428014)>

ITRS代表国际地球参考系,它是一个以地球中心为中心,随地球旋转的三维坐标系,因此天文台将在这个参照系中保持静止。

对于目标,最简单的方法是使用 SkyCoord 班级:

>>> from astropy.coordinates import SkyCoord
>>> ttau = SkyCoord('04h21m59.43s +19d32m06.4', frame='icrs',
...                 radial_velocity=23.9 * u.km / u.s,
...                 distance=144.321 * u.pc)

在本例中,我们为目标指定了径向速度和距离(使用 T Tauri SIMBAD entry ,但也可以不指定这些,这意味着假设目标在观察它的框架中是静止的,并且假设目标距离太阳很远(这样,如果相关,任何视差效应都不重要)。假设径向速度位于用于定义目标位置的坐标系中,因此在上面的情况下它相对于ICRS原点(太阳系重心)。

我们现在定义一组频率,对应于测量通量的通道(在这里的示例中,我们假设只有11个频率):

>>> sc_ttau = SpectralCoord(np.linspace(200, 300, 11) * u.GHz,
...                         observer=alma, target=ttau)  
>>> sc_ttau  
<SpectralCoord
   (observer:  <ITRS Coordinate (obstime=2019-04-24T02:32:10.000, location=(0., 0., 0.) km): (x, y, z) in m
                  (2225015.30883296, -5440016.41799762, -2481631.27428014)
               (v_x, v_y, v_z) in km / s
                  (0., 0., 0.)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=41.03594953774002 km / s
      redshift=0.00013689056329480032)
  [200., 210., 220., 230., 240., 250., 260., 270., 280., 290., 300.] GHz>

我们已经可以在上面看到了 SpectralCoord 计算了台站与Tτ的速度差,包括观测站绕地球的运动、地球绕太阳系重心的运动以及Tτ相对于太阳系重心的径向速度。我们可以通过以下方式直接获得该值:

>>> sc_ttau.radial_velocity  
<Quantity 41.03594948 km / s>

如果您使用任何类型的光谱数据,则通常需要确定和/或应用速度校正,因为参考系不同。例如,如果你在不同的日期对天空中的同一个物体进行了观测,通常将其转换为一个共同的速度参考系,这样你的光谱坐标就是那些如果观察者相对于太阳系重心是静止的,就应该应用的那些坐标。你可能还想转换你的光谱坐标,这样它们就会处于一个静止的帧中,相对于当地静止标准(LSR)、银河系中心、局域群,甚至宇宙微波背景(CMB)偶极子。

我们可以利用 with_observer_stationary_relative_to() 方法。此方法可以使用现有坐标/速度帧的名称 BaseCoordinateFrame 实例,或任何定义为 BaseCoordinateFrame 或A SkyCoord 对象。最常用的帧可以使用字符串访问。例如,要转换为相对于地球中心静止的速度帧(这样就消除了地球自转的影响),我们可以使用 'gcrs' 代表 地心天体参考系 (GCRS)::

>>> sc_ttau.with_observer_stationary_relative_to('gcrs')  
<SpectralCoord
   (observer: <GCRS Coordinate (obstime=2019-04-24T02:32:10.000, obsgeoloc=(0., 0., 0.) m, obsgeovel=(0., 0., 0.) m / s): (x, y, z) in m
                  (-5878853.86171412, -192921.84773269, -2470794.19765021)
               (v_x, v_y, v_z) in km / s
                  (4.33251262e-09, 8.96175625e-08, -1.49258412e-08)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=40.674086368345165 km / s
      redshift=0.00013568335316072044)
  [200.00024141, 210.00025348, 220.00026555, 230.00027762, 240.00028969,
   250.00030176, 260.00031383, 270.0003259 , 280.00033797, 290.00035004,
   300.00036211] GHz>

如你所见,频率发生了轻微的变化,这是因为我们去除了地球自转引起的多普勒频移(这也可以在 radial_velocity 属性,它改变了~0.35 km/s。使用相对于太阳系重心的速度参考系,这是太阳系的起源 国际天球参考系 (ICRS)系统,我们可以使用:

>>> sc_ttau.with_observer_stationary_relative_to('icrs')  
<SpectralCoord
   (observer: <ICRS Coordinate: (x, y, z) in m
                  (-1.25867767e+11, -7.48979688e+10, -3.24757657e+10)
               (v_x, v_y, v_z) in km / s
                  (0., 0., 0.)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=23.9 km / s
      redshift=7.97249967898761e-05)
  [200.0114322 , 210.01200381, 220.01257542, 230.01314703, 240.01371864,
   250.01429025, 260.01486186, 270.01543347, 280.01600508, 290.01657669,
   300.0171483 ] GHz>

注意,在这种情况下,观察者和目标之间的总径向速度与我们设置目标时指定的速度相匹配,因为它是相对于ICRS原点(太阳系重心)定义的。观测者的位置仍然和以前一样,但是观测者的速度现在在x,y,z上大约为10-20km/s,这是因为观测者现在相对于重心是静止的,所以相对于地球表面有一个显著的速度。

我们还可以将频率转换为运动学局部静止标准(LSRK)参考系,这是天文学某些分支(如射电天文学)中常用的参考框架:

>>> sc_ttau.with_observer_stationary_relative_to('lsrk')  
<SpectralCoord
   (observer: <LSRK Coordinate: (x, y, z) in m
                  (-1.25867767e+11, -7.48979688e+10, -3.24757657e+10)
               (v_x, v_y, v_z) in km / s
                  (0., 0., 0.)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=12.50698856018455 km / s
      redshift=4.171969349386906e-05)
  [200.01903338, 210.01998505, 220.02093672, 230.02188839, 240.02284006,
   250.02379172, 260.02474339, 270.02569506, 280.02664673, 290.0275984 ,
   300.02855007] GHz>

共同速度帧 上可用作字符串的常见速度帧列表 SpectralCoord 班级。

既然我们可以任意 SkyCoordwith_observer_stationary_relative_to() 方法,我们也可以指定目标本身,以找到目标静止帧中的频率:

>>> sc_ttau_targetframe = sc_ttau.with_observer_stationary_relative_to(sc_ttau.target)  
>>> sc_ttau_targetframe  
<SpectralCoord
   (observer: <ICRS Coordinate: (x, y, z) in m
                  (-1.25867767e+11, -7.48979688e+10, -3.24757657e+10)
               (v_x, v_y, v_z) in km / s
                  (9.34149908, 20.49579745, 7.99178839)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=0.0 km / s
      redshift=0.0)
  [200.02737811, 210.02874702, 220.03011592, 230.03148483, 240.03285374,
   250.03422264, 260.03559155, 270.03696045, 280.03832936, 290.03969826,
   300.04106717] GHz>

这个 radial_velocity ,即观察者和目标之间的速度偏移,现在为零。

SpectralCoord 它是通用的,可以用来表示任何光谱值-不仅是光谱的x轴,还可以用来表示光谱特征的频率。例如,如果我们现在考虑我们发现了一个光谱特征,在望远镜的参照系中,它似乎有以下频率的分量:

>>> sc_feat = SpectralCoord([115.26, 115.266, 115.267] * u.GHz,
...                         observer=alma, target=ttau)  

我们可以使用以下方法将其转换为目标的静止帧:

>>> sc_feat_rest = sc_feat.with_observer_stationary_relative_to(sc_feat.target)  
>>> sc_feat_rest  
<SpectralCoord
   (observer: <ICRS Coordinate: (x, y, z) in m
                  (-1.25867767e+11, -7.48979688e+10, -3.24757657e+10)
               (v_x, v_y, v_z) in km / s
                  (9.34149908, 20.49579745, 7.99178839)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=0.0 km / s
      redshift=0.0)
  [115.27577801, 115.28177883, 115.28277896] GHz>

这些频率非常接近12CO J=1-0分子线跃迁的剩余频率,即115.2712018千兆赫。然而,它们并不完全相同,因此,如果我们看到的特征确实来自12CO,那么它们与我们认为的Tτ的静止帧相比是多普勒频移的。我们可以将这些频率转换成速度,假设多普勒频移方程(在本例中,根据无线电惯例):

>>> sc_feat_rest.to(u.km / u.s, doppler_convention='radio', doppler_rest=115.27120180 * u.GHz)  
<SpectralCoord
   (observer: <ICRS Coordinate: (x, y, z) in m
                  (-1.25867767e+11, -7.48979688e+10, -3.24757657e+10)
               (v_x, v_y, v_z) in km / s
                  (9.34149908, 20.49579745, 7.99178839)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=0.0 km / s
      redshift=0.0
    doppler_rest=115.2712018 GHz
    doppler_convention=radio)
  [-11.90160348, -27.50828539, -30.10939905] km / s>

请注意,这些结果速度与 radial_velocity 属性(这里仍然是零)——后者是观察者和目标之间的速度差,而前者是频谱值相对于静止频率或波长的多普勒偏移量。

因此,如果这些特征确实来自12CO,它们相对于Tτ静止框架的速度大约为-11.9、-27.5和-30.1km/s。

共同速度帧#

任何有效的astropy坐标系都可以传递给 with_observer_stationary_relative_to() 方法,包括字符串别名,如 icrs . 下面我们列出了一些常用于定义光谱坐标的帧:

速度帧可用作 SpectralCoord 课程包括:

框架名称

描述

'gcrs'

地心坐标系(定义为相对于GCRS原点的静止坐标系)

'icrs'

重心框架(相对于ICRS原点定义为静止)

'hcrs'

日心坐标系(定义为相对于HCRS原点的静止坐标系)

'lsrk

运动学局部静止标准(LSRK),定义为相对于太阳系重心,朝向18h+30d(B1900)的速度为20km/s [1].

'lsrd'

动态局部静止标准(LSRD),定义为在银河系坐标系中,速度U=9 km/s,V=12 km/s,W=7 km/s(相当于16.552945 km/s,朝向l=53.13和b=25.02) [2].

'lsr'

一个更新的地方静止标准的定义,在银河系坐标系中U=11.1km/s,V=12.24km/s,W=7.25km/s [3].

定义自定义速度帧#

如本页前面的示例所述,可以传递任意 BaseCoordinateFrameSkyCoord 对象到 with_observer_stationary_relative_to() 方法,并且观测器将被更新为相对于这些坐标是静止的。作为一个例子,我们可以定义一个物体,这个物体可以用来定义一个随星系群移动的速度框架。这并没有一个独特的定义,但在这个例子中,我们使用IAU 1976推荐值,该值说明太阳系重心以300 km/s的速度向本地星系群的速度框架中的l=90和b=0移动 [4]. 给定此值,我们可以使用以下公式定义速度帧:

>>> from astropy.coordinates import Galactic
>>> localgroup_frame = Galactic(u=0 * u.km, v=0 * u.km, w=0 * u.km,
...                             U=0 * u.km / u.s, V=-300 * u.km / u.s, W=0 * u.km / u.s,
...                             representation_type='cartesian',
...                             differential_type='cartesian')

注意这里我们把速度指定为-300,因为我们需要的是局部群相对于太阳系重心的速度。通过这个对象,我们可以转换 SpectralCoord 所以观察者在这个参照系中是静止的:

>>> sc_ttau.with_observer_stationary_relative_to(localgroup_frame)  
<SpectralCoord
   (observer: <Galactic Coordinate: (u, v, w) in m
                  (8.8038652e+10, -5.31344273e+10, 1.09238291e+11)
               (U, V, W) in km / s
                  (-1.42108547e-14, -300., 2.84217094e-14)>
    target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, pc)
                (65.497625, 19.53511111, 144.321)
             (radial_velocity) in km / s
                (23.9,)>
    observer to target (computed from above):
      radial_velocity=42.33062895275233 km / s
      redshift=0.00014120974955456056)
  [199.99913628, 209.9990931 , 219.99904991, 229.99900673, 239.99896354,
   249.99892036, 259.99887717, 269.99883398, 279.9987908 , 289.99874761,
   299.99870443] GHz>

工具书类#