2MASS Catalog Server Kit (日本語版)

Supports 2MASS, WISE, USNO-B1.0, UCAC3, PPMXL, GSC-2.3, etc.

2014年9月 Version 2.3

2MASS Kitを利用している研究機関・観測所:
CFHT観測所, 東京大学木曽観測所, ISAS/JAXA, 国立天文台, 名古屋大学, miniTAO

[HISTORY]
Sep.2014  V. 2.3  Supported SLLIB-1.4 or newer.
Nov.2012  V. 2.2  Supported WISE 3-Band Cryo Source.
May.2012  V. 2.1  Supported WISE All-Sky Release Catalog.
                  Small improvements.
Dec.2011  V. 2.0  A lot of improvements including design changes.
                  Supports USNO-B1.0, UCAC3, GSC-2.3.2, and PPMXL.
Sep.2011  V. 1.2  Supports fast box search.
Aug.2011  V. 1.1  Supports Tycho2, AKARI IRC, AKARI FIS and IRAS PSC.
                  Added a client tool: clients/sql2mass.php.
Nov.2010  V. 1.0  Supports 2MASS PSC only.

山内@国立天文台/宇宙研

PostgreSQL Powered

Special Thanks: 瀧田怜様,大薮進喜様(Linuxでのテスト),池田紀夫様(MacOSXへの対応),板由房様(ドキュメントのレビュー)
技術論文 (2011PASP..123.1324Y) を出版しました.


ページ一覧:
ホーム / 大カタログの登録 / 小カタログの登録 / テーブルカラム情報 / HDDのコピーサービス

このページの目次:
イントロダクション / サポートされているカタログ / 必要条件 / ダウンロード / インストール手順 / PostgreSQLの各種設定 / チューニング / 使い方 / ストアドファンクション / クライアント・ツール / FAQ


イントロダクション

2MASS Kitは,代表的な大天体カタログ・小天体カタログの 高性能検索サーバを,御自身のPCに誰でも簡単に構築できる オープンソースソフトウェアです. ソフトウェアの名称に「2MASS」が入っていますが, もちろん 2MASS PSC 以外のカタログだけを登録して使う事も可能です.

巨大テーブルの座標検索(Radial Search,Box Search,Rectangular Search) についてチューニングを施し, 単一テーブルで単純にインデックスを作成する方法に比べて, 一桁以上の高速化を実現しています (もちろん,WCSTools の scat よりもずっと高速です). 最良の条件下においては2MASS PSCに対して秒間3000回以上の位置検索が可能です.

このキットの大きな特徴は,「チューニングの柔軟性」です. 巨大カタログにおいては,各テーブル・インデックスを 6つのテーブルスペース(別々のディレクトリ)に登録する事により, 必要な部分だけを高速デバイスに移動する事が簡単に行なえるようになっています. 特に最近のSSDの速度性能の進化は凄まじいものがあり, 予算に応じてテーブル・インデックスの一部,またはすべてを高速SSDに移せば, これまでデータセンターでしか実現できなかったような高性能サーバを 低コストで構築できます.

主な利用者としては,ネットワークが細いor不安定な観測所を想定していますが, 個人PC,観測所PC,研究所PC,データセンターのサーバ等で幅広く利用可能です.

なお,このキットではオープンソースRDBMSである PostgreSQL-8.4 を使っており, ソフトウェアに対するライセンス料は発生しません.

サポートされているカタログ

全天カタログ

非全天カタログ

座標検索のパフォーマンス

最良の条件下での2MASS PSCの Radial Search,Box Search,Rectangular Search の検索速度の一例を示します. 3回同じ条件で検索して経過時間を測り,その中間の値をとっています.

ハードウェア
CPU: Intel(R) Xeon(R) E5640 @ 2.67GHz
メインボード: SuperMicro X8STE
メモリ: DDR3-1333 24 GB

ソフトウェア
OS: CentOS 5.6 64-bit
RDBMS: PostgreSQL-8.4.7

検索条件天体数経過時間 使用したSQLステートメント
Radial (半径1')20.001秒 SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 1);
Radial (半径60')51980.015秒 SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 60);
Radial (半径180')476320.102秒 SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 180);
Radial (半径360')1897840.368秒 SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 360);
Box (120'x120')66440.023秒 SELECT count(*) FROM fTwomassGetNearbyObjFromBoxCel('j2000', 0,0, 60,60);
Box (120'x2400')1365790.498秒 SELECT count(*) FROM fTwomassGetNearbyObjFromBoxCel('j2000', 0,0, 60,1200);
Rectangular (2x2deg)66440.006秒 SELECT count(*) FROM fTwomassGetObjFromRectEq(-1,1, -1,1);
Rectangular (10x10deg)1672660.107秒 SELECT count(*) FROM fTwomassGetObjFromRectEq(-5,5, -5,5);

※上記は,メモリ上にテーブルとインデックスがキャッシュされている 理想的な状態での結果です. 特に,マシン起動直後はメモリ上のキャッシュが空っぽですから ディスクI/Oが頻繁に入るため,高速なSSDを使わない限り これらよりも遅くなります. マシンをRDBMS専用として,長期間落とさずに運用すれば, 上記の値に近づいていくはずです.


必要条件

下記は大カタログの超高速検索を行ないたい場合, 必要に応じて用意してください.


ダウンロード

下記のパッケージをダウンロードしてください.

データベース登録のためのデータファイルは, HTTP または FTP からダウンロードできます.

HDDのコピーサービスも行なっています.


インストール手順

この文書では, Red Hat Enterprise Linux 6 or 5 (CentOS 6 or 5) または MacOSX での手順を記載します. 他のOSの場合は,適宜対応してください.

SELinuxのDisable

Linux の場合は,

/etc/sysconfig/selinux
の次の部分を編集して, SELinuxをDisableしてください.

SELINUX=disabled

この後,OSを再起動してください.

共有メモリの設定

/etc/sysctl.conf にて,次のように共有メモリ・セグメントの上限を十分大きな値にしておきます. この値は搭載メモリ量以上を設定しても問題ありません. RHEL, CentOSの場合はこの設定は不要です.

64-bit Linux の場合

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

32-bit Linux の場合

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 3221225472

MacOSX 10.5 以降の場合

/etc/sysctl.conf が無ければ新規に作成してください.

kern.sysv.shmmax=68719476736

MacOSX 10.4以前の場合は /etc/rc を編集します.ただし, OS アップデートに伴って設定が書き変わってしまうので注意してください.

上記パラメータの追加または書き換えを行なった場合は, OS を再起動してください.

PostgreSQL-8.4のインストール

Linux (CentOS-6,RHEL-6) の場合, postgresql, postgresql-libs, postgresql-devel, postgresql-server をインストールします.

$ su
# yum install postgresql
# yum install postgresql-devel
# yum install postgresql-server

Linux (CentOS-5,RHEL-5) の場合, postgresql84, postgresql84-libs, postgresql84-devel, postgresql84-server をインストールします.

$ su
# yum install postgresql84
# yum install postgresql84-devel
# yum install postgresql84-server

MacOSX の場合,次のように macports を使います.
各バイナリは /opt/local/lib/postgresql84/bin/ に置かれます.

# port install postgresql84
# port install postgresql84-server

もし,PostgreSQL サーバが動作している場合は,停止してください.

Linuxの場合

$ su
# /etc/rc.d/init.d/postgresql stop

MacOSXの場合

$ su
# pg_ctl stop

DB用ディレクトリの準備

PostgreSQL用のデータ保存ディレクトリを用意します. このキットでは,そのディレクトリを /db として解説します(Makefileを修正すれば変更可能です). 必要なディスクスペースを確保します.

通常,ホームディレクトリ用のHDDパーティションは 容量を大きくとると思います.ホーム用のパーティションが 十分大きければ,下記のようにバインドを使って /home/db とに分けると良いでしょう. 次に, /dev/sda4 をホーム用のパーティションとして使う場合を示します.

$ su
# mkdir -p /mnt/sda4
# mount /dev/sda4 /mnt/sda4
# mkdir -p /mnt/sda4/home
# mkdir -p /home
# mount --bind /mnt/sda4/home /home
# mkdir -p /mnt/sda4/db
# mkdir -p /db
# mount --bind /mnt/sda4/db /db

/db をHDDの1パーティションで用意できる場合は, マウントオプション「-o noatime」 をつけておきます(若干高速化に効くかもしれません).

そして,/etc/fstab に次のように書いておきます.

/dev/sda4               /mnt/sda4               ext3    defaults        1 2
/mnt/sda4/home          /home                   none    bind            0 0
/mnt/sda4/db            /db                     none    bind            0 0

もちろん,上記の方法以外でもかまいませんが, いずれにしても,ホームディレクトリと, /db 以下で必要なディスクスペースを確保してください.

なお,この時点ではSSDは利用しません. SSDは高速化したい項目に応じて,DB構築後に使用します.

2MASSキットのビルド・DB初期化

キットを展開してください.

$ tar zxvf 2masskit-2.3.tar.gz
$ cd 2masskit-2.3

適切なMakefileを選んでシンボリックリンクを作ってください. Makefileは数種類あり, Makefile.linux64(64-bit Linux用), Makefile.linux32(32-bit Linux用), Makefile.MacOSX64(64-bit MacOSX用), Makefile.MacOSX32(32-bit MacOSX用), Makefile.solaris64(64-bit Solaris Sparc用) があります. その後,Makefileを書き換えます.

$ ln -s Makefile.linux64 Makefile
$ vi Makefile

PostgreSQLのデータを /db 以下に保存し,かつ OS が RHEL 6 or 5,CentOS 6 or 5 の場合は Makefile のディレクトリ項目の修正は不要です. これ以外の場合は,環境に応じて適宜修正してください.

makeします.

$ make

必要なファイルをインストールし,DBを初期化します.

Linuxの場合

$ su
# make install
# /sbin/service postgresql initdb

MacOSXの場合

$ su
# make install
# initdb -D /db/pgsql/data

/db/pgsql/data ディレクトリにファイルが存在すると,initdb に失敗します. その場合は,/db 以下を空にして,再度 make install からやりなおしてください.
うまくいかない方は,FAQ の「initdb に失敗します!」もご覧ください.

PostgreSQLのリソース量設定

initdb で作成された /db/pgsql/data/postgresql.conf をエディタで開き,下記のようにパラメータを変更します.

shared_buffers = 128MB
work_mem = 512MB
maintenance_work_mem = 128MB
checkpoint_segments = 10
effective_cache_size = 256MB

これらの値は用途や環境に応じて調整が必要になる事があります. より高い性能を求める方は, チューニング もご覧ください. 特に,1回の検索で大きな表を引き出す場合work_memの設定は非常に重要です.

PostgreSQLサーバの起動

rootになって,PostgreSQLサーバを起動します.

Linuxの場合

$ su
# /etc/rc.d/init.d/postgresql start

MacOSXの場合

$ su
# pg_ctl start -D /db/pgsql/data

PostgreSQL内アカウント,データベースの作成

次のようにして,UNIXのpostgresユーザになり, psqlを起動します.

$ su
# su postgres
% psql

PostgreSQL内アカウント(PostgreSQLではロールといいます) を設定,データベースを作成します.
ロールpostgresは,PostgreSQLのスーパーユーザ, ロールadminは,テーブルやストアドファンクションの登録を行なうためのユーザ, ロールguestは,DBを利用するためのユーザです. それぞれ 'xxxxxx' のところにパスワードを設定してください:

postgres=# ALTER ROLE postgres PASSWORD 'xxxxxx';
postgres=# CREATE ROLE admin LOGIN PASSWORD 'xxxxxx';
postgres=# CREATE ROLE guest LOGIN PASSWORD 'xxxxxx';
postgres=# CREATE DATABASE "2MASS";
postgres=# \q

本ドキュメントでは, 本キットのためのデータベースの名称は "2MASS" としていますが,上記「CREATE DATABASE」 では他の名前で行なってもかまいません.

pg_hba.confの変更

/db/pgsql/data/pg_hba.conf をエディタで開き, 次のように local の認証 METHOD を md5 に変更します.

local   all         all                               md5

PostgreSQLサーバの起動設定・再起動

rootになって,PostgreSQLサーバの起動設定を行ない, PostgreSQLサーバを再起動します.

Linuxの場合

$ su
# /sbin/chkconfig --level 2345 postgresql on
# /etc/rc.d/init.d/postgresql restart

MacOSXの場合

/opt/local/etc/LaunchDaemons/org.macports.postgresql84-server/postgresql84-server.wrapper の最初の方に,

POSTGRESQL84DATA=/db/pgsql/data

のように,DBのデータの置き場所を付け加えてください. その後,次のようにします.

$ su
# launchctl load -w /Library/LaunchDaemons/org.macports.postgresql84-server.plist
# pg_ctl restart -D /db/pgsql/data

PostgreSQLのCストアドファンクション

UNIXの一般ユーザで,データベース "2MASS" に postgresロール(PostgreSQLのスーパーユーザ)でログインし, Cストアドファンクションを登録します.

$ psql -U postgres 2MASS
Password for user postgres: xxxxxx
psql (8.4.5)
Type "help" for help.

2MASS=# \i create_c_function.sql
(登録されたストアドファンクションの名前が表示される)
2MASS=# \q

汎用ストアドファンクションの登録

UNIXの一般ユーザで,データベース "2MASS" に adminロールでログインし, 汎用のストアドファンクションを登録します.

$ psql -U admin 2MASS
Password for user admin: xxxxxx
psql (8.4.5)
Type "help" for help.

2MASS=> \i create_function.sql

カタログの登録

大カタログ (2MASS PSC, WISE, USNO-B1.0, UCAC3, GSC-2.3.2, and PPMXL) の登録は, 「大カタログの登録」 をご覧ください.

小カタログ (Tycho-2, AKARI IRC, AKARI FIS, and IRAS PSC), の登録は, 「Install Small Catalogs」 をご覧ください.

WISE Preliminary catalogの登録については, こちらのページ をご覧ください.


PostgreSQLの各種設定

別のマシンのPostgreSQLクライアントから接続できるようにする

別のマシンの PostgreSQL のクライアント(psql や Web アプリケーション) から接続できるようにするには, postgresql.conf の設定とファイアウォールの設定が必要です 次に手順を示します.

/db/pgsql/data/postgresql.conf をエディタで開き, listen_addresses を次のように設定します.

listen_addresses = '*'

setupコマンドからファイアウォールの設定を行ないます (ファイアウォールが Disable に設定されている場合はこの設定は不要です).

$ su
# setup

ここで, Firewall configuration → Customize の Other ports に 「postgres:tcp」と設定します.
これにより,次の設定が /etc/sysconfig/iptables に追加されます:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT

iptables をリスタートさせます (ファイアウォールが Disable に設定されている場合はこの設定は不要です):

$ su
# /etc/rc.d/init.d/iptables restart

MacOSX の場合は,システム環境設定→共有から行います.

/db/pgsql/data/pg_hba.conf をエディタで開き, 接続したいクライアントの IP アドレス xxx.xxx.xxx.xxx を 次のように記述します:

host  all     guest   xxx.xxx.xxx.xxx    255.255.255.255 md5

上記の場合は,guestロールだけに利用を許可する場合です. すべてのロールでの利用を許可する場合は 「all」と書きます.

PostgreSQLサーバをリスタートします.

$ su
# /etc/rc.d/init.d/postgresql restart

クライアントからは「psql -h ホスト名 …」 とすれば,サーバ上のデータベースにアクセスする事ができます.

パスワード入力なしで psql を利用する

パスワード入力のプロンプトが出ると, スクリプトから利用したい場合に困った事になります.
その場合は,ホームディレクトリの .pgpass というファイルに,次のようにロール名とパスワードを設定しておけば, psql を利用する時にパスワード入力を省略できます.

*:*:*:guest:password

*」は「何でも可」の設定です. 必要に応じて, hostname:port:database:username:password の順に設定する事ができます.

パーミッションを 600 に設定するのを忘れずに:

$ chmod 600 .pgpass

チューニング

BIOSの設定

Intel系チップセットの場合は,省電力機能 C1E (Enhanced HALT) を Disable にしておきましょう. Enable の時と比べて 10%〜20% 程度パフォーマンスが改善する事があります.
この設定は,Cross-ID のようにディスクI/Oが頻発する場合に パフォーマンスに影響を与えます.

cpuspeedの設定

最高のパフォーマンスを狙うなら,CPU のクロック可変を無効にします:

/etc/rc.d/init.d/cpuspeed stop

hdparmの設定

hdparm コマンドで,ディスクの先読み量を少し増やすと パフォーマンスが良くなる事があります.下記のような 設定を /etc/rc.d/rc.local に書いておきましょう.

/sbin/hdparm -a4096 /dev/sda

PostgreSQLのリソース量調整

/db/pgsql/data/postgresql.conf の下記パラメータを必要に応じて調整します.

一般的に, OLTP (OnLine Transaction Processing) ではshared_buffersが重要になりますが, OLAP (OnLine Analytical Processing) では,work_memを十分に確保する必要があります.

ファイルシステム

SSD以外の場合はあまり気にしなくて良いと思います. 我々の Cross-ID のテストでは, SSD使用時に,ext4 が ext3,xfs に比べて 1 パーセント程度 良い結果を出していました.

高速SSDの利用

2MASS Kitでは,すべてのテーブル・インデックスは, いくつかの独立したディレクトリ(テーブルスペースと言います) に分けて保存するようになっています.

それぞれの巨大カタログにつき, テーブルスペースは次のように6つ存在します.

# ls /db/pgsql/tablespace/twomass_*
twomass_eqi               twomass_eqi_index_xyzi16  twomass_main_index
twomass_eqi_index_radeci  twomass_main              twomass_main_pkey

上記のディレクトリの一部またはすべてを 高速SSDにコピーし,上記ディレクトリにSSDをマウントすれば, 検索速度を飛躍的に改善する事ができます. マウントする時は, bind(デバイスのかわりにディレクトリをマウントする機能)を使うと便利です.
次に,高速化の重要度の高いものから順に示します.

低コストで大きなパフォーマンスアップを狙うなら, 256 GB の PLEXTOR PX-M3 Pro SSD を購入し, 上から 4 つのディレクトリ(twomass_eqi_index_xyzi16 〜 twomass_main_pkey) を SSD にコピーすると良いでしょう.

Cross-IDを高速化する方法の1つとして, twomass_eqi_index_xyzi16 を tmpfs (/dev/shm)のような ramdisk にコピーし, twomass_eqi を SSD にコピーする方法があります.

次に,上記の一部を高速SSD(/dev/sdb)にコピーし, Radial Search,Box Search,Cross-IDを高速化する場合を示します.

$ su
# /etc/rc.d/init.d/postgresql stop
# mkdir -p /mnt/ssd_a
# mount -o noatime /dev/sdb1 /mnt/ssd_a
# mkdir -p /mnt/ssd_a/pgsql_tablespace
# chown -R postgres:postgres /mnt/ssd_a/pgsql_tablespace
# rsync -a --delete /db/pgsql/tablespace/twomass_eqi /mnt/ssd_a/pgsql_tablespace/.
# rsync -a --delete /db/pgsql/tablespace/twomass_eqi_index_xyzi16 /mnt/ssd_a/pgsql_tablespace/.
# mount --bind /mnt/ssd_a/pgsql_tablespace/twomass_eqi /db/pgsql/tablespace/twomass_eqi
# mount --bind /mnt/ssd_a/pgsql_tablespace/twomass_eqi_index_xyzi16 /db/pgsql/tablespace/twomass_eqi_index_xyzi16
# /etc/rc.d/init.d/postgresql start

使い方

ここでは,2MASS PSC の検索例を示します. 他のカタログの場合は「Twomass」の部分を 置き換えてください.

通常の利用時は誤ってテーブルを壊さないように, guestロールで利用します:

$ psql -U guest 2MASS

psql の使い方については, この日本語ページ または 英語公式ページ をご覧ください.

Radial Search

次のようにストアドファンクション fTwomassGetNearbyObjEq() か fTwomassGetNearbyObjCel() を利用します(大文字小文字は区別しません). 検索速度を重視する場合は前者を利用し, J2000から他の座標系への変換を行ないたい場合は後者を利用します.

fTwomassGetNearbyObjEq() の引数は順に, R.A.(deg),Dec.(deg),サーチ半径(arcmin) です.

2MASS=> SELECT * FROM fTwomassGetNearbyObjEq(0, 0, 3);

fTwomassGetNearbyObjCel() の引数は順に 座標系('j2000''b1950''ecliptic''galactic'), longitude(deg), latitude(deg), サーチ半径(arcmin) です.

2MASS=> SELECT * FROM fTwomassGetNearbyObjCel('j2000', 0, 0, 3);

fTwomassGetNearbyObjEq()の場合は 次のように,objid,lon,lat,distance のテーブルが返ります. distance の単位は arcmin です.

   objid   |    lon     |    lat    |     distance      
-----------+------------+-----------+-------------------
 793571660 | 359.982569 |  0.044046 |  2.84218284794452
 793571662 | 359.989615 |  0.012327 | 0.967104621472398
 793571661 |  359.98931 |  0.027802 |  1.78718165359994
 792913920 |   0.009564 | -0.000827 | 0.575981326971027
 792913922 |    0.01738 | -0.032945 |  2.23489923964895
 792913925 |   0.021541 | -0.023737 |  1.92324084931489
 792913927 |   0.030595 | -0.006287 |  1.87405693715596
 792913929 |   0.034844 | -0.028304 |  2.69347254510121
 793236078 |   0.038972 |  0.001536 |  2.34013544202409
 792913932 |   0.047375 | -0.006703 |  2.87081085523336

メインテーブルの内容が必要な場合は,次のように ストアドファンクションの返り値とメインテーブルとを, プライマリキーobjidを使って ジョインします. この例では,座標,フラックス,フラックスのエラー,distanceを得ています.

SELECT o.ra,o.dec,o.j_m,o.h_m,o.k_m,o.j_msigcom,o.h_msigcom,o.k_msigcom,n.distance
FROM fTwomassGetNearbyObjEq(0,0,3) n, twomass o
WHERE n.objid = o.objid;

次のような結果を得ます.

     ra     |    dec    |  j_m   |  h_m   |  k_m   | j_msigcom | h_msigcom | k_msigcom |     distance      
------------+-----------+--------+--------+--------+-----------+-----------+-----------+-------------------
 359.982569 |  0.044046 | 12.842 | 12.374 | 12.335 |     0.022 |     0.021 |     0.029 |  2.84218284794452
 359.989615 |  0.012327 |  13.75 | 13.194 |  13.14 |     0.026 |      0.03 |     0.037 | 0.967104621472398
  359.98931 |  0.027802 | 15.773 | 15.347 | 14.972 |     0.079 |      0.11 |      0.14 |  1.78718165359994
   0.009564 | -0.000827 | 16.422 | 16.112 |  15.21 |      0.11 |     0.227 |           | 0.575981326971027
    0.01738 | -0.032945 | 15.591 | 15.023 | 15.069 |     0.059 |     0.073 |     0.154 |  2.23489923964895
   0.021541 | -0.023737 | 17.025 | 15.841 | 17.233 |      0.22 |     0.159 |           |  1.92324084931489
   0.030595 | -0.006287 |  14.43 | 14.085 | 13.923 |     0.038 |     0.039 |     0.056 |  1.87405693715596
   0.034844 | -0.028304 | 15.644 | 15.355 | 15.129 |     0.069 |     0.096 |     0.143 |  2.69347254510121
   0.038972 |  0.001536 | 12.682 | 12.096 | 11.844 |     0.022 |     0.025 |     0.022 |  2.34013544202409
   0.047375 | -0.006703 | 13.514 | 13.189 | 13.167 |     0.029 |     0.031 |     0.033 |  2.87081085523336

ストアドファンクション fTwomassGetNearbyObjEq(),fTwomassGetNearbyObjCel() は distance でのソートは 行ないません. 必要な場合は,次のように「ORDER BY」を追加してください.

SELECT o.ra,o.dec,o.j_m,o.h_m,o.k_m,o.j_msigcom,o.h_msigcom,o.k_msigcom,n.distance
FROM fTwomassGetNearbyObjEq(0,0,3) n, twomass o
WHERE n.objid = o.objid
ORDER BY n.distance;

Box Search

ストアドファンクション fTwomassGetNearbyObjFromBoxCel() を利用します(大文字小文字は区別しません). このストアドファンクションの引数は順に, 座標系('j2000''b1950''ecliptic''galactic'), longitude(deg), latitude(deg), search box half width(arcmin; 最大5400), search box half height(arcmin; 最大5400) です.

(l,b)=(12.0,34.0)を中心とする横幅6',縦幅2'の領域を検索する例を示します.

2MASS=> SELECT * FROM fTwomassGetNearbyObjFromBoxCel('galactic', 12,34, 3,1);

次のように,objid,lon,lat のテーブルが返ります. lon, lat は第一引数で指定された座標系での longitude(deg), latitude(deg)です.

   objid   |       lon        |       lat        
-----------+------------------+------------------
 791409307 | 11.9461680949935 | 34.0096860074137
 791409308 | 11.9583757299871 |  34.015082591074
 791409311 | 11.9783906896371 | 34.0105966402837
 791409315 | 11.9505030961589 |  33.986455172412
 791409320 |  11.972281681199 | 33.9903131870409
 791409314 | 11.9812358007798 | 34.0060314550454
 791731741 | 12.0181080800759 | 34.0075228040278
 791409325 | 11.9916294535507 | 33.9913928836596
 791409328 | 11.9875644762627 | 33.9867387367315
 791731743 |  12.019301859339 | 34.0023027320602
 791731745 | 12.0481339981243 | 34.0058079804499
 791731746 |  12.046615046783 | 34.0033867068321
 791731752 | 12.0313248764534 | 33.9836666790509

メインテーブルの内容が必要な場合は,次のように ストアドファンクションの返り値とメインテーブルとを, プライマリキーobjidを使って ジョインします. この例では,座標,フラックス,フラックスのエラーを得ています.

SELECT o.ra,o.dec,n.lon as l, n.lat as b,
       o.j_m,o.h_m,o.k_m,o.j_msigcom,o.h_msigcom,o.k_msigcom
FROM fTwomassGetNearbyObjFromBoxCel('galactic', 12,34, 3,1) n, twomass o
WHERE n.objid = o.objid;

次のような結果を得ます.

     ra     |    dec    |        l         |        b         |  j_m   |  h_m   |  k_m   | j_msigcom | h_msigcom | k_msigcom 
------------+-----------+------------------+------------------+--------+--------+--------+-----------+-----------+-----------
 243.573157 | -0.525274 | 11.9461680949935 | 34.0096860074137 | 16.137 | 15.373 |  15.25 |     0.104 |     0.138 |     0.216
 243.574301 | -0.513863 | 11.9583757299871 |  34.015082591074 | 15.281 | 14.835 | 14.586 |     0.056 |      0.07 |     0.117
 243.587256 | -0.502569 | 11.9783906896371 | 34.0105966402837 | 15.316 | 14.679 | 14.613 |     0.058 |     0.064 |     0.121
 243.594462 |  -0.53521 | 11.9505030961589 |  33.986455172412 | 15.913 | 15.168 | 14.912 |     0.092 |     0.094 |      0.15
 243.601299 | -0.518057 |  11.972281681199 | 33.9903131870409 | 16.041 | 15.671 | 15.173 |     0.113 |     0.149 |          
 243.592362 | -0.503147 | 11.9812358007798 | 34.0060314550454 | 15.935 | 15.398 | 15.408 |     0.093 |     0.125 |          
 243.608113 | -0.476909 | 12.0181080800759 | 34.0075228040278 | 16.299 | 15.204 | 14.744 |     0.137 |     0.098 |     0.153
 243.609321 | -0.504123 | 11.9916294535507 | 33.9913928836596 | 12.818 | 12.396 | 12.308 |     0.025 |     0.026 |     0.033
 243.611316 | -0.509512 | 11.9875644762627 | 33.9867387367315 |  16.43 | 15.689 | 16.224 |     0.147 |     0.133 |          
 243.613003 | -0.478987 |  12.019301859339 | 34.0023027320602 | 16.084 | 15.673 | 15.245 |     0.101 |     0.144 |     0.205
 243.623368 | -0.457166 | 12.0481339981243 | 34.0058079804499 | 15.955 | 15.405 | 15.527 |     0.096 |     0.102 |     0.242
 243.624682 | -0.459558 |  12.046615046783 | 34.0033867068321 | 16.816 |  15.84 | 15.839 |     0.201 |     0.159 |          
 243.634037 | -0.481054 | 12.0313248764534 | 33.9836666790509 | 15.595 |  15.18 | 15.008 |     0.071 |     0.098 |     0.157

Rectangular Search

次のようにストアドファンクション fTwomassGetObjFromRectEq() を利用します(大文字小文字は区別しません). このストアドファンクションの引数は順に R.A.1(deg),R.A.2(deg),Dec.1(deg),Dec.2(deg) です.

2MASS=> SELECT * FROM fTwomassGetObjFromRectEq(0,0.1, 1,1.1);

次のように,objid,lon,lat のテーブルが返ります. lon, lat は J2000 の R.A. と Dec. です.

   objid   |   lon    |   lat    
-----------+----------+----------
 796325619 | 0.000857 | 1.024927
 796325620 | 0.000901 | 1.088982
 796325621 | 0.010481 | 1.091584
 796325622 | 0.012691 | 1.059668
 796325623 | 0.021387 |  1.06185
 796325624 | 0.022389 | 1.044861
 796325625 | 0.022943 | 1.076892
 796325626 | 0.026073 | 1.097096
 796325627 | 0.029074 | 1.012373
 796325628 | 0.044551 |  1.09418
 796325629 | 0.047209 | 1.004132
 796325630 |  0.04838 | 1.030788
 796325631 | 0.058135 |  1.01824
 796325632 | 0.063318 | 1.057747
 796325633 | 0.070774 | 1.089212
 796325634 | 0.071413 | 1.019535
 796325635 | 0.081828 | 1.000061
 796325636 | 0.084937 | 1.084082
 796325637 | 0.090331 | 1.089642
 796325638 | 0.091378 | 1.039778

メインテーブルの内容が必要な場合は,次のように ストアドファンクションの返り値とメインテーブルとを, プライマリキーobjidを使って ジョインします. この例では,座標,フラックス,フラックスのエラーを得ています.

SELECT o.ra,o.dec,o.j_m,o.h_m,o.k_m,o.j_msigcom,o.h_msigcom,o.k_msigcom
FROM fTwomassGetObjFromRectEq(0,0.1, 1,1.1) n, twomass o
WHERE n.objid = o.objid;

次のような結果を得ます.

    ra    |   dec    |  j_m   |  h_m   |  k_m   | j_msigcom | h_msigcom | k_msigcom 
----------+----------+--------+--------+--------+-----------+-----------+-----------
 0.000857 | 1.024927 | 16.617 | 15.804 | 15.515 |     0.113 |     0.135 |      0.16
 0.000901 | 1.088982 |  8.219 |  8.063 |   7.95 |     0.027 |     0.046 |     0.023
 0.010481 | 1.091584 | 14.662 | 14.041 |  14.01 |      0.03 |     0.036 |     0.049
 0.012691 | 1.059668 | 14.633 |  14.23 | 14.207 |     0.035 |     0.041 |      0.05
 0.021387 |  1.06185 | 16.225 | 15.745 | 15.592 |     0.078 |     0.106 |     0.174
 0.022389 | 1.044861 | 14.637 | 14.105 | 13.822 |     0.036 |     0.033 |     0.045
 0.022943 | 1.076892 | 16.962 | 16.611 | 15.644 |     0.146 |     0.234 |     0.188
 0.026073 | 1.097096 | 16.645 | 15.905 | 15.457 |     0.134 |     0.162 |      0.19
 0.029074 | 1.012373 | 16.243 | 15.586 | 15.026 |     0.093 |     0.125 |     0.121
 0.044551 |  1.09418 | 15.534 | 14.906 | 14.484 |     0.051 |     0.067 |      0.08
 0.047209 | 1.004132 | 16.932 | 16.155 | 15.264 |     0.182 |     0.238 |     0.166
  0.04838 | 1.030788 | 16.468 | 15.803 | 14.991 |     0.129 |     0.206 |      0.13
 0.058135 |  1.01824 | 16.556 | 15.736 | 15.363 |     0.113 |     0.136 |     0.169
 0.063318 | 1.057747 | 16.131 | 15.499 | 15.535 |     0.096 |     0.122 |     0.192
 0.070774 | 1.089212 | 16.183 | 15.689 | 15.346 |           |     0.162 |          
 0.071413 | 1.019535 | 14.407 | 14.002 | 13.819 |     0.033 |     0.031 |     0.054
 0.081828 | 1.000061 |  14.45 | 13.841 | 13.682 |     0.032 |     0.033 |     0.049
 0.084937 | 1.084082 | 16.145 | 15.555 | 15.246 |      0.08 |     0.133 |     0.153
 0.090331 | 1.089642 | 16.741 | 16.307 | 15.551 |     0.157 |     0.246 |     0.194
 0.091378 | 1.039778 | 15.616 | 15.183 |  15.39 |     0.056 |     0.109 |     0.177

テーブルのカラムを確認

次のように「\d」コマンドを使うと, テーブルのカラム情報を取得できます.

2MASS=> \d twomass
 objid         | integer          | not null
 designation   | character(17)    | not null
 ra            | double precision | not null
 dec           | double precision | not null
 err_maj       | real             | not null
 err_min       | real             | not null
 err_ang       | smallint         | not null
 j_m           | real             | 
 j_cmsig       | real             | 
 j_msigcom     | real             | 
 j_snr         | real             | 
 h_m           | real             | 
 h_cmsig       | real             | 
 h_msigcom     | real             | 
 h_snr         | real             | 
 k_m           | real             | 
 k_cmsig       | real             | 
 k_msigcom     | real             | 
 k_snr         | real             | 
(省略)

Cross-ID (他カタログとのマッチアップ)

まず,マッチアップしたいカタログを, データベースにテーブルとして登録する必要があります. PostgreSQLの公式ドキュメントなどを参考にして,テーブルを作成してください. 長期的に利用するテーブルを作成する時は, adminロールでそれを行なうと良いでしょう. なお,作成するテーブルには, J2000のR.A.(deg)とDec.(deg)がカラムに含まれている必要があります.

次の例では,my_catalogに入ったカタログと2MASSカタログとのマッチアップ を半径 0.25 arcmin で行ない,その件数を得ます.

SELECT count(fTwomassGetNearestObjIDEq(o.ra, o.dec, 0.25))
FROM ( SELECT * FROM my_catalog ORDER BY dec ) o;

次の例では,my_catalogの全行を取得し,マッチに成功したものは 2MASSの座標(R.A.とDec.)とdistanceとを,my_catalogの右側に追加します.

SELECT p.*,
       q1.objid, q1.ra, q1.dec,
       (CASE (q1.objid IS NULL) WHEN true THEN null ELSE
       fDistanceArcminEq(p.ra,p.dec,q1.ra,q1.dec) END) as distance
FROM
(
  SELECT o.*
  FROM my_table o
  ORDER BY dec
) p
LEFT JOIN
  Twomass q1
ON 
  fTwomassGetNearestObjIDEq(p.ra, p.dec, 0.25) = q1.objid

マッチに成功した行だけを取り出す場合は,もう少し簡単に書けます:

SELECT p.*,
       q1.objid, q1.ra, q1.dec,
       fDistanceArcminEq(p.ra,p.dec,q1.ra,q1.dec) as distance
FROM
(
  SELECT o.*
  FROM my_table o
  ORDER BY dec
) p
JOIN
  Twomass q1
ON 
  fTwomassGetNearestObjIDEq(p.ra, p.dec, 0.25) = q1.objid

2MASS Kit特有の便利なストアドファンクション

AKARI-CAS用に作成したストアドファンクションをいくつか収録しています.
PostgreSQL が提供している関数については, AKARI-CASのこのページ をご覧ください.

角度の算出

fDistanceArcminEq(ra1,dec1, ra2,dec2) または fDistanceArcMinXYZ(cx1,cy1,cz1, cx2,cy2,cz2) により,2つの天体間の角度を求める事ができます. 引数に NULL が与えられた場合の動作は未定義です.

deg→sexagesimal(xx:xx:xx.x)変換

次のように, fDeg2LonStr(),fDeg2LatStr() を利用すれば,deg単位の値をsexagesimal(xx:xx:xx.x)の形式に変換できます.

SELECT fDeg2LonStr(o.ra) as ra, fDeg2LatStr(o.dec) as dec,
       o.j_m,o.h_m,o.k_m, n.distance
FROM fTwomassGetNearbyObjEq(0,0,3) n, twomass o
WHERE n.objid = o.objid
ORDER BY n.distance;

次の結果を得ます.

     ra      |     dec     |  j_m   |  h_m   |  k_m   |     distance      
-------------+-------------+--------+--------+--------+-------------------
 00:00:02.30 | -00:00:03.0 | 16.422 | 16.112 |  15.21 | 0.575981326971027
 23:59:57.51 | +00:00:44.4 |  13.75 | 13.194 |  13.14 | 0.967104621472398
 23:59:57.43 | +00:01:40.1 | 15.773 | 15.347 | 14.972 |  1.78718165359994
 00:00:07.34 | -00:00:22.6 |  14.43 | 14.085 | 13.923 |  1.87405693715596
 00:00:05.17 | -00:01:25.5 | 17.025 | 15.841 | 17.233 |  1.92324084931489
 00:00:04.17 | -00:01:58.6 | 15.591 | 15.023 | 15.069 |  2.23489923964895
 00:00:09.35 | +00:00:05.5 | 12.682 | 12.096 | 11.844 |  2.34013544202409
 00:00:08.36 | -00:01:41.9 | 15.644 | 15.355 | 15.129 |  2.69347254510121
 23:59:55.82 | +00:02:38.6 | 12.842 | 12.374 | 12.335 |  2.84218284794452
 00:00:11.37 | -00:00:24.1 | 13.514 | 13.189 | 13.167 |  2.87081085523336

sexagesimal(xx:xx:xx.x)→deg変換

sexagesimal(xx:xx:xx.x)の形式で,座標を指定して検索ができます.

SELECT fDeg2LonStr(o.ra) as ra, fDeg2LatStr(o.dec) as dec,
       o.j_m,o.h_m,o.k_m, n.distance
FROM fTwomassGetNearbyObjEq(fLonStr2Deg('11:22:33.3'),fLatStr2Deg('22:33:44.4'),3) n, twomass o
WHERE n.objid = o.objid
ORDER BY n.distance;

次の結果を得ます.

     ra      |     dec     |  j_m   |  h_m   |  k_m   |     distance      
-------------+-------------+--------+--------+--------+-------------------
 11:22:31.39 | +22:33:04.7 | 16.137 | 15.803 | 15.808 | 0.794373037809949
 11:22:36.24 | +22:34:12.4 | 16.728 | 15.787 | 15.138 | 0.823298100602107
 11:22:34.17 | +22:34:33.9 | 16.658 | 15.962 | 15.287 |  0.84883116250746
 11:22:37.70 | +22:33:42.5 | 16.746 | 15.973 |  15.79 |  1.01713844965725
 11:22:34.57 | +22:32:44.2 | 16.729 | 15.875 |     17 |  1.04481387810461
 11:22:29.11 | +22:34:25.0 | 16.971 | 16.102 | 15.431 |  1.17931773570099
 11:22:27.70 | +22:33:04.7 | 16.197 | 15.689 | 15.014 |  1.45335381456842
 11:22:36.10 | +22:35:29.7 | 16.009 | 15.623 | 14.811 |  1.86948967595817
 11:22:22.99 | +22:33:16.5 | 16.656 | 16.009 | 15.635 |  2.42576801128236
 11:22:33.53 | +22:36:25.4 | 16.165 | 15.278 | 14.937 |  2.68444346193211
 11:22:21.60 | +22:34:34.4 |   16.5 | 15.154 | 15.144 |  2.82628524515026
 11:22:45.61 | +22:34:13.3 | 13.216 | 12.736 | 12.668 |  2.88203892253219
 11:22:31.09 | +22:36:37.8 | 16.659 | 16.118 | 15.246 |  2.93504711436251
 11:22:31.65 | +22:30:48.1 |  16.29 |  15.87 | 15.435 |  2.96366827957033

座標変換 (J2000 ⇔ B1950,Ecliptic,Galactic)

WCSTools のソースの一部を利用してストアドファンクションを登録する事により, SQL 文にて主要な座標系に対して座標変換ができるようになっています.

B1950,Ecliptic,Galactic から J2000 へ変換するストアドファンクション:

ストアドファンクション引数返り値
fB2Ra(ra,dec)B1950座標J2000 R.A.
fB2Dec(ra,dec)B1950座標J2000 Dec.
fE2Ra(lon,lat)Ecliptic座標J2000 R.A.
fE2Dec(lon,lat)Ecliptic座標J2000 Dec.
fG2Ra(lon,lat)Galactic座標J2000 R.A.
fG2Dec(lon,lat)Galactic座標J2000 Dec.

J2000 から B1950,Ecliptic,Galactic へ変換するストアドファンクション:

ストアドファンクション引数返り値
fJ2Ra1950(ra,dec)J2000座標B1950 R.A.
fJ2Dec1950(ra,dec)J2000座標B1950 Dec.
fJ2Lambda(ra,dec)J2000座標Ecliptic Lon.
fJ2Beta(ra,dec)J2000座標Ecliptic Lat.
fJ2L(ra,dec)J2000座標Galactic Lon.
fJ2B(ra,dec)J2000座標Galactic Lat.

次に,Galactic座標の (0,0) で Radial Search を行なう例を示します.

SELECT fJ2L(o.ra,o.dec) as l, fJ2B(o.ra,o.dec) as b,
       o.j_m,o.h_m,o.k_m, n.distance
FROM fTwomassGetNearbyObjEq(fG2Ra(0,0),fG2Dec(0,0),0.2) n, twomass o
WHERE n.objid = o.objid
ORDER BY n.distance;

次の結果を得ます.

          l           |           b           |  j_m   |  h_m   |  k_m   |      distance      
----------------------+-----------------------+--------+--------+--------+--------------------
 0.000238199212139686 |  0.000245096272298005 | 17.133 |  13.88 | 11.912 | 0.0205064415510798
     359.999429961829 |  -0.00149404269361704 | 17.089 | 13.623 | 12.001 | 0.0959458926395396
  0.00199983911961157 | -4.01722558191383e-05 | 16.407 | 12.665 | 10.888 |  0.120014534784677
     359.998106567874 |  0.000932992925588326 | 17.443 | 13.571 | 11.703 |  0.126649154498087
  0.00287219868966155 |  0.000670744958130914 | 16.467 | 12.758 | 10.874 |  0.176968660924733
  0.00261470909270918 |  -0.00204362165890217 | 16.831 | 13.607 | 12.482 |  0.199115956417241

クライアント・ツール

sql2mass.php

client/sql2mass.php は2MASS Kitクライアントのサンプルプログラムです.

使う前に,次のようにして PHP といくつかのライブラリをインストールします:

# yum install php
# yum install php-pgsql
# yum install php-pear
# pear install MDB2
# pear install pear/MDB2#pgsql

sql2mass.php先頭付近の$Dsn変数の PASSWORD を 実際のものに変更します:

$Dsn = "pgsql://guest:PASSWORD@127.0.0.1:5432/2MASS";

最初の引数にSQLステートメントをセットして, sql2mass.phpを実行します.

$ php sql2mass.php "SELECT * FROM twomass LIMIT 10"

警告: このスクリプトにはセキュリティ対策のためのコードが無く, ダイレクトにSQLを入力させるWebアプリケーション等での流用には かなりの追加対策が必要です.


FAQ

Q: ちょっと試しに使ってみたいのだけど?

AKARI-CASSQL Search で2MASSカタログの検索が可能です.
(AKARI-CASの2MASSの検索も,基本的には2MASS Kitと同じ手法を用いています).

Q: initdb に失敗します!

A: 例えば,/aaa/bbb/db/pgsql 内にデータベースを構築しようとしていた場合, ディレクトリ /aaa/aaa/bbb/aaa/bbb/db はすべてオーナが root:root (OSによっては異なるかもしれません), モードが 755 にセットされていなければなりません.

Q: データファイルのmd5が一致しているのに,データ登録に失敗します!

A: PostgreSQLサーバと同じバージョンの psql を使ってください. サーバと異なるバージョンの psql を使った場合, データベースの内部データが壊れたかのようなエラーが報告される事があります.

Q: メインテーブルのデータ登録が3日たっても終わりません!

A: 下記のようにして,HDDパフォーマンスの簡易測定を行なってみてください.

$ su
# /sbin/hdparm -t /dev/sda

上記テストで,100MB/sec 出ていない場合, S-ATA インタフェースが本来の性能を発揮していない可能性があります.
チップセットによっては,S-ATAインタフェースが いくつかの動作モードを持っており,その場合は BIOS でそれを設定できるようになっている事がほとんどです. メーカー製PCの中には,BIOS のデフォルトの設定が Linux に最適な状態になっていない事があります. 特に DELL の PC がそうで,実際多くの方がこの罠にハマってきました (これはDELLの優れた伝統の1つです).
Linux だけをインストールしている場合は, /etc/modprobe.conf に 「alias scsi_hostadapter ata_piix (Intelのチップセットの場合)」 のように書いて initrd を再作成し, BIOS の S-ATA動作モードを「native」等に切り替えれば 本来の性能が発揮できるようになります.
Windows とデュアルブートになっている場合や, initrd なんてわからないという方は, オンボード S-ATA インタフェースの本来の性能は諦め, S-ATAインタフェースカード (例: LSI 9211-4i, ASUS U3S6 : ただし,PCIe x4 以上の空きスロットが必要) を増設し,そこに HDD を接続して DB を構築する方が良いと思います.

Q: objidって何ですか?

A: objidはオリジナルのカタログにはありませんが, 高速化のためにこのキットにて勝手に追加したものです.objid は 4バイトまたは8バイト整数「オフセット値 + 行番号」とし,プライマリキー として利用しています. このIDを論文等に載せてはいけません.

Q: マシン起動直後は検索が遅いです!!

A: ディスクが超高速では無い限り,起動直後の検索速度はどうしても ディスクの遅さにひっぱられます. この問題を解決するには,すべてのテーブル・インデックスを 高速なSSDに移動させる必要があります. 2MASS Kitでは,そういったニーズに応えるため, すべてのテーブル・インデックスをテーブルスペース内に 作成するようになっています. /db/pgsql/tablespace以下のデータすべてを 高速SSDにコピーし,bindで上からマウントすれば, マシン起動直後から高速な検索が可能になります.

Q: このキットのライセンスは?

A: GPL V2 に従います. データセットはオリジナルのライセンスに従います.