Supports 2MASS, WISE, USNO-B1.0, UCAC3, PPMXL, GSC-2.3, etc.
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.
Special Thanks: 瀧田怜様,大薮進喜様(Linuxでのテスト),池田紀夫様(MacOSXへの対応),板由房様(ドキュメントのレビュー)
技術論文 (2011PASP..123.1324Y) を出版しました.
ページ一覧:
ホーム /
大カタログの登録 /
小カタログの登録 /
テーブルカラム情報 /
このページの目次:
イントロダクション /
サポートされているカタログ /
必要条件 /
ダウンロード /
インストール手順 /
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') | 2 | 0.001秒 | SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 1); |
Radial (半径60') | 5198 | 0.015秒 | SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 60); |
Radial (半径180') | 47632 | 0.102秒 | SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 180); |
Radial (半径360') | 189784 | 0.368秒 | SELECT count(*) FROM fTwomassGetNearbyObjEq(0, 0, 360); |
Box (120'x120') | 6644 | 0.023秒 | SELECT count(*) FROM fTwomassGetNearbyObjFromBoxCel('j2000', 0,0, 60,60); |
Box (120'x2400') | 136579 | 0.498秒 | SELECT count(*) FROM fTwomassGetNearbyObjFromBoxCel('j2000', 0,0, 60,1200); |
Rectangular (2x2deg) | 6644 | 0.006秒 | SELECT count(*) FROM fTwomassGetObjFromRectEq(-1,1, -1,1); |
Rectangular (10x10deg) | 167266 | 0.107秒 | SELECT count(*) FROM fTwomassGetObjFromRectEq(-5,5, -5,5); |
※上記は,メモリ上にテーブルとインデックスがキャッシュされている 理想的な状態での結果です. 特に,マシン起動直後はメモリ上のキャッシュが空っぽですから ディスクI/Oが頻繁に入るため,高速なSSDを使わない限り これらよりも遅くなります. マシンをRDBMS専用として,長期間落とさずに運用すれば, 上記の値に近づいていくはずです.
下記は大カタログの超高速検索を行ないたい場合, 必要に応じて用意してください.
下記のパッケージをダウンロードしてください.
データベース登録のためのデータファイルは, HTTPからダウンロードできます.
この文書では, Red Hat Enterprise Linux 6 or 5 (CentOS 6 or 5) または MacOSX での手順を記載します. 他のOSの場合は,適宜対応してください.
Linux の場合は,
/etc/sysconfig/selinuxの次の部分を編集して, SELinuxをDisableしてください.
SELINUX=disabled
この後,OSを再起動してください.
/etc/sysctl.conf
にて,次のように共有メモリ・セグメントの上限を十分大きな値にしておきます.
この値は搭載メモリ量以上を設定しても問題ありません.
RHEL, CentOSの場合はこの設定は不要です.
# Controls the maximum shared segment size, in bytes kernel.shmmax = 68719476736
# Controls the maximum shared segment size, in bytes kernel.shmmax = 3221225472
/etc/sysctl.conf
が無ければ新規に作成してください.
kern.sysv.shmmax=68719476736
MacOSX 10.4以前の場合は /etc/rc
を編集します.ただし,
OS アップデートに伴って設定が書き変わってしまうので注意してください.
上記パラメータの追加または書き換えを行なった場合は, OS を再起動してください.
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
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構築後に使用します.
キットを展開してください.
$ 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 に失敗します!」もご覧ください.
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
の設定は非常に重要です.
rootになって,PostgreSQLサーバを起動します.
Linuxの場合
$ su # /etc/rc.d/init.d/postgresql start
MacOSXの場合
$ su # pg_ctl start -D /db/pgsql/data
次のようにして,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
」
では他の名前で行なってもかまいません.
/db/pgsql/data/pg_hba.conf
をエディタで開き,
次のように local の認証 METHOD を md5 に変更します.
local all all md5
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
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 のクライアント(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 ホスト名 …
」
とすれば,サーバ上のデータベースにアクセスする事ができます.
パスワード入力のプロンプトが出ると,
スクリプトから利用したい場合に困った事になります.
その場合は,ホームディレクトリの
.pgpass
というファイルに,次のようにロール名とパスワードを設定しておけば,
psql を利用する時にパスワード入力を省略できます.
*:*:*:guest:password
「*
」は「何でも可」の設定です.
必要に応じて,
hostname:port:database:username:password
の順に設定する事ができます.
パーミッションを 600 に設定するのを忘れずに:
$ chmod 600 .pgpass
Intel系チップセットの場合は,省電力機能
C1E
(Enhanced HALT)
を Disable にしておきましょう.
Enable の時と比べて 10%〜20% 程度パフォーマンスが改善する事があります.
この設定は,Cross-ID のようにディスクI/Oが頻発する場合に
パフォーマンスに影響を与えます.
最高のパフォーマンスを狙うなら,CPU のクロック可変を無効にします:
/etc/rc.d/init.d/cpuspeed stop
hdparm
コマンドで,ディスクの先読み量を少し増やすと
パフォーマンスが良くなる事があります.下記のような
設定を
/etc/rc.d/rc.local
に書いておきましょう.
/sbin/hdparm -a4096 /dev/sda
/db/pgsql/data/postgresql.conf
の下記パラメータを必要に応じて調整します.
shared_buffers
work_mem
一般的に,
OLTP (OnLine Transaction Processing)
ではshared_buffers
が重要になりますが,
OLAP (OnLine Analytical Processing)
では,work_mem
を十分に確保する必要があります.
SSD以外の場合はあまり気にしなくて良いと思います. 我々の Cross-ID のテストでは, SSD使用時に,ext4 が ext3,xfs に比べて 1 パーセント程度 良い結果を出していました.
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 の使い方については, この日本語ページ または 英語公式ページ をご覧ください.
次のようにストアドファンクション 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;
ストアドファンクション
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
次のようにストアドファンクション 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 | (省略)
まず,マッチアップしたいカタログを, データベースにテーブルとして登録する必要があります. 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
AKARI-CAS用に作成したストアドファンクションをいくつか収録しています.
PostgreSQL が提供している関数については,
AKARI-CASのこのページ
をご覧ください.
fDistanceArcminEq(ra1,dec1, ra2,dec2)
または
fDistanceArcMinXYZ(cx1,cy1,cz1, cx2,cy2,cz2)
により,2つの天体間の角度を求める事ができます.
引数に
NULL
が与えられた場合の動作は未定義です.
次のように, 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)の形式で,座標を指定して検索ができます.
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
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
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アプリケーション等での流用には かなりの追加対策が必要です.
AKARI-CAS
の
SQL Search
で2MASSカタログの検索が可能です.
(AKARI-CASの2MASSの検索も,基本的には2MASS Kitと同じ手法を用いています).
A: 例えば,/aaa/bbb/db/pgsql
内にデータベースを構築しようとしていた場合,
ディレクトリ
/aaa
,/aaa/bbb
,/aaa/bbb/db
はすべてオーナが
root:root (OSによっては異なるかもしれません),
モードが 755 にセットされていなければなりません.
A: PostgreSQLサーバと同じバージョンの psql を使ってください. サーバと異なるバージョンの psql を使った場合, データベースの内部データが壊れたかのようなエラーが報告される事があります.
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 を構築する方が良いと思います.
A: objidはオリジナルのカタログにはありませんが, 高速化のためにこのキットにて勝手に追加したものです.objid は 4バイトまたは8バイト整数「オフセット値 + 行番号」とし,プライマリキー として利用しています. このIDを論文等に載せてはいけません.
A: ディスクが超高速では無い限り,起動直後の検索速度はどうしても
ディスクの遅さにひっぱられます.
この問題を解決するには,すべてのテーブル・インデックスを
高速なSSDに移動させる必要があります.
2MASS Kitでは,そういったニーズに応えるため,
すべてのテーブル・インデックスをテーブルスペース内に
作成するようになっています.
/db/pgsql/tablespace
以下のデータすべてを
高速SSDにコピーし,bindで上からマウントすれば,
マシン起動直後から高速な検索が可能になります.
A: GPL V2 に従います. データセットはオリジナルのライセンスに従います.