TOPCAT大型星表筛选交叉方法

你看这个SQL它又长又宽,就像这个Gaia它又大又圆

Posted by mingjie on January 19, 2019

TOPCAT是个神器。师兄说的好,要是把它用6了,编程工作减少一半。它在星表读入输出、交叉、画图中具有的非常多的功能使得我们可以方便地获取数据、进行初步处理并查看某些参数的分布。这里通过两个有关Gaia的教程(12)介绍一下如何获取像Gaia DR2这样的星表。这里默认读者已经有TOPCAT的基本使用经验。

星团证认:M4

一、获取M4附近的Gaia数据

这里我们将会用到Cone Search。这是专用于获取某个坐标附近一定角距离的程序。如果想获取多个坐标附近的源的话,用Multicone就可以了(当然得准备一个位置和搜索半径的表)。

  1. 打开VO|Cone Search
  2. Keyword中输入gaia dr2并点击Find Service
  3. 在搜索结果中选择ARI-Gaia并在下面的Object Name中输入M4并点击Resove,在Radius中填入1(degree)
  4. 点击OK并等待一会,TOPCAT就会将我们要的星表准备好了,44662个源
  5. 回到主界面点击Sky Plot,看一下这个星表的空间分布 你看这个Gaia它又大又圆

至于实际上应该选择哪个星表,我的建议是在TAP窗口中搜索并看看星表的各种参数以及列名再确定。

二、通过自行挑出星团成员

这样下下来的星表包含了M3的成员星以及非常多的前景场星,而且它们混在了一起,所以我们需要通过星团成员星有相似的移动速度这个条件来将成员星挑出来。要注意这个方法只是为了演示,因为M4的自行非常大所以才能这样做,其他的星团基本上不行。

  1. 回到主界面点击Plane Plot,并将x与y轴设为pmrapmdec
  2. 场星一般都是太阳附近的恒星,所以它们相对太阳应该没有整体的运动。所以中心不在(0,0)的那坨星就是星团的成员星了;将他们框起来并命名为comoving

三、验证成员星

这里我们将成员星与非成员星的自行画出来看一下。

  1. 打开Row Subset,选中comoving,然后点击创建互补subset的按钮,瞬间就多了个not_comoving
  2. 打开SKy Plot,将subsets选为comovingNOT_comoving并换一下位置
  3. Frame中加入Sky Vector,然后将Delta Longitude设为pmra以及*Delta Latitude设为pmdec,你就会发现 *好多头发!
  4. Scale调小,就可以看到两个subset不同的自行规律了

四、确定M4的视差

  1. 打开上述两个subset的Histogram Plot,x轴设为parallax
  2. Forms中添加Add Gaussian,就可以看到这两个subset的视差平均值了

要注意的是因为Gaia的视差误差不小(特别对于远的恒星来说),所以直接计算视差的倒数作为距离是不合适的。这里可以这样做是因为我们有很多恒星在同一个距离上。

相空间的星团证认:毕星团

这个例子使用相空间(3维速度空间)的密度来找星团。

获取太阳附近的Gaia数据

  1. 打开TAP窗口,搜索gaia并选择GAIA
  2. 选择gaiadr2_gata_source
  3. 在ADQL Text窗口输入:
    SELECT ra, dec, pmra, pmdec, parallax, radial_velocity, bp_rp,
    phot_g_mean_mag + 5*log10(parallax/100) as g_abs
    FROM gaiadr2.gaia_source WHERE parallax > 15 AND parallax_over_error > 5
    AND radial_velocity IS NOT NULL
    

TAP教程

下载整个星表

SELECT * FROM “table_name”

星表的名字可以先去Vizier搜链接,然后在TAP上找,就有了。

选择星表的前n行:SELECT

SELECT TOP 1 1+1 AS result FROM gaiadr1.tgas_source

SELECT [TOP setLimit] selectList FROM fromClause [WHERE conditions] [GROUP BY columns] [ORDER BY columns]
选择 行内容 列内容 AS 结果列名 FROM 源星表

SELECT TOP 10 * FROM gaiadr1.tgas_source

*表示全部列都要(握拳)。


排序:ORDER BY

SELECT TOP 5 source_id, parallax
  FROM gaiadr1.tgas_source
  ORDER BY parallax

降序的话可以这样写:

SELECT TOP 5 source_id, parallax
  FROM gaiadr1.tgas_source
  ORDER BY parallax DESC
SELECT TOP 5 source_id, phot_g_mean_mag , parallax
  FROM gaiadr1.tgas_source
  ORDER BY phot_g_mean_mag, parallax

第二个排序列名的作用暂未确定。噢顺便,首行不缩进是因为:好看。

练习:在gaiadr1.tgas_source中选出最亮的20颗星的id和视星等


表达式的一些内容

  • SQL中的名字是大小写敏感的
  • 浮点数形式:4.5e-8
  • 字符串必须用单引号括起来(双引号不行)
  • 运算符号们
    • 加减乘除:+-*/;次幂:POWER(), SQRT(x), SQUARE(x)
    • 不等号:=, <, >, <=, >=;注意不是==
    • 和或否:AND, OR, NOT
    • 字符串相加:||(未验证)
    • 格式化字符串:LIKE();支持%, _, *, ?等(未验证)
    • COS, ASIN, ATAN, ATAN2, COS, SIN, TAN
    • EXP, LOG(natural logarithm),LOG10
    • FLOOR(x), CEILING(x), ROUND(x), ROUND(x, n), TRUNCATE(x), TRUNCATE(x,n);n表示截止到多少位小数
    • DEGREES(rads), RADIANS(degs)
    • RAND(seed)
    • MOD(x,y)
SELECT TOP 10
  source_id,
  SQRT(POWER(pmdec_error,2)+POWER(pmra_error,2)) AS pm_errTot
  FROM gaiadr1.tgas_source
  ORDER BY pm_errTot

自己算出来的东西pm_errTot马上就可以拿来排序。

练习:Select the source id, position, proper motion in arcsec/yr and mag g for the 20 fastest stars in tgas_source.


有条件选择:WHERE

SELECT source_id, ra, dec
  FROM gaiadr1.tgas_source
  WHERE
  phot_g_mean_flux > 13
  AND parallax < 0.2

练习:Select the absolute magnitude, position and the source id for the 20 stars with the largest observed apparent magnitude in the g band from the table tgas_source (in case you don’t remember: The absolute magnitude is M= 5 + 5log π+ m with the parallax in arcsec π and the apparent magnitude m (check the units!). This will fail. Try to fix it.


交叉证认:JOIN

SELECT TOP 10 h1.ra, h1.dec, h1.hip, t1.hip
  FROM hipparcos AS h1
  JOIN tycho2 AS t1
  USING (hip)
FROM hipparcos AS h1
  JOIN tycho2 AS t1
  USING (hip)

Don’t execute them.这俩是假例子。这俩的结果应该是内积。


更复杂的交叉证认:JOIN ON

SELECT TOP 20 source_id, h.hip
  FROM gaiadr1.tgas_source AS tgas
  LEFT OUTER JOIN hipparcos as h ON (tgas.phot_g_mean_mag BETWEEN h.hpmag -0.05 AND h.hpmag+0.05)

这里就不是内积了,是留左表,同时交叉条件改成了星等差在之内。 (会出现1对n的情况吗?)

举一反三,肯定还有INNER JOIN(和JOIN一样)、RIGHT OUTER JOINFULL OUTER JOIN


令人头大的交叉证认:基于位置

SELECT TOP 5
  source_id, tgas.ra, tgas.dec, tm.raj2000, tm.dej2000, hmag, e_hmag
  FROM gaiadr1.tgas_source as tgas
  JOIN twomass AS tm
  ON 1=CONTAINS (
     POINT('ICRS', tm.raj2000, tm.dej2000),
     CIRCLE('ICRS', tgas.ra, tgas.dec, 1.5/3600))

如果历元不同的话,最好不要在查询中转换历元(位置加减自行),而是将交叉半径扩大,然后用WHERE去解决历元的问题:

SELECT
   TOP 30
   *
   FROM ppmxl AS m
   JOIN gaiadr2.gaia_source AS g
   ON 1=CONTAINS(POINT('ICRS', m.raj2000, m.dej2000),
                 CIRCLE('ICRS', g.ra, g.dec, 30./3600.))
   WHERE 1=CONTAINS(POINT('ICRS',
   m.raj2000+m.pmra*COS(RADIANS(m.dej2000))*15,
   m.dej2000+m.pmde*15),
   CIRCLE('ICRS', g.ra, g.dec, 0.5/3600.))

俄罗斯套娃:查询中的查询

SELECT count(*) as n, round((hmag-jmag)*2) as bin
  FROM (SELECT TOP 4000 * FROM twomass) AS q
  GROUP BY bin
  ORDER BY bin

(SELECT TOP 4000 * FROM twomass)就是一个小的查询,用括号括起来就行了

TOPCAT使用的某些tips

表格

Column Window中的 可以为subset在总表中添加布尔值标识