SAMPによるテーブルと画像の送受信¶
以下の例では、以下の例を用いる。
TOPCAT
_、これはフォームデータを閲覧するためのツールです。SAO DS9
_、ディレクトリを重ね合わせることができる画像視覚化ツールです。Aladin Desktop
_、これは画像とディレクトリを可視化できる別のツールです。
TOPCATおよびAladinは、SAMP Hubが見つからずにSAMP Hubを実行するので、以下の例では、アプリケーションのうちの1つを起動してもよく、起動することもできます。 astropy.samp
ハブです。以下のコマンドを使用して、この動作を開始することができます。
$ samp_hub
テーブルをTOPCATとDS 9に送信する¶
VO表をTOPCATに送信する最も簡単な方法は使用である. SAMPIntegratedClient
級友たち。TOPCATが開いたら、まずインスタンス化します SAMPIntegratedClient
インスタンスは、次いでハブに接続される::
>>> from astropy.samp import SAMPIntegratedClient
>>> client = SAMPIntegratedClient()
>>> client.connect()
次に,送信する表に関する詳細な情報が含まれている辞書を設定しなければならない.これには url
これはファイルのURLであり name
これは,表の人間可読名である.URLはローカルURLとすることができます file:///
):
>>> params = {}
>>> params["url"] = 'file:///Users/tom/Desktop/aj285677t3_votable.xml'
>>> params["name"] = "Robitaille et al. (2008), Table 3"
注釈
ローカルURLを構築するには、ご利用いただけます urlparse
詳細は以下のとおりである.
>>> import urlparse
>>> params["url"] = urlparse.urljoin('file:', os.path.abspath("aj285677t3_votable.xml"))
もう私たちはメッセージ自体を設定することができる。これにはメッセージのタイプが含まれています table.load.votable
VOテーブルのロードが必要であること、および上に設定したテーブルの詳細を示す):
>>> message = {}
>>> message["samp.mtype"] = "table.load.votable"
>>> message["samp.params"] = params
最後に傍受しているすべてのクライアントにこのメッセージをブロードキャストすることができます table.load.votable
メッセージ使用 notify_all()
**
>>> client.notify_all(message)
上記のメッセージは、実際には、SAMPを介して接続されたすべてのアプリケーションにブロードキャストされる。例えば開けてみると SAO DS9 TOPCATを除いて,上の命令を実行し,両アプリケーションともテーブルをロードする.私たちは使用することができます get_registered_clients()
方法ハブに接続されたすべてのクライアントを検索する:
>>> client.get_registered_clients()
['hub', 'c1', 'c2']
これらのIDはあまり意味がありませんが使用することができます:より多くの情報を知る
>>> client.get_metadata('c1')
{'author.affiliation': 'Astrophysics Group, Bristol University',
'author.email': 'm.b.taylor@bristol.ac.uk',
'author.name': 'Mark Taylor',
'home.page': 'http://www.starlink.ac.uk/topcat/',
'samp.description.text': 'Tool for OPerations on Catalogues And Tables',
'samp.documentation.url': 'http://127.0.0.1:2525/doc/sun253/index.html',
'samp.icon.url': 'http://127.0.0.1:2525/doc/images/tc_sok.gif',
'samp.name': 'topcat',
'topcat.version': '4.0-1'}
ご覧のように c1
TOPCATクライアントです。私たちは今データを再送することができますが、今回はTOPCATにしか送信できません。 notify()
方法:
>>> client.notify('c1', message)
完了後、ハブとの接続を切断することを確認しなければなりません:
>>> client.disconnect()
TOPCATからフォームを受信する¶
TOPCATからテーブルを受信するためには、ハブからのメッセージをリッスンするクライアントを設定しなければならない。先ほどと同じように私たちは SAMPIntegratedClient
インスタンスは、ハブに接続される::
>>> from astropy.samp import SAMPIntegratedClient
>>> client = SAMPIntegratedClient()
>>> client.connect()
我々は現在,受信したメッセージを処理するReceiverクラスを設定している.通知と呼び出しのためのハンドラを作成することに注意する必要がある(両者の違いは、呼び出しに返信が必要である):
>>> class Receiver(object):
... def __init__(self, client):
... self.client = client
... self.received = False
... def receive_call(self, private_key, sender_id, msg_id, mtype, params, extra):
... self.params = params
... self.received = True
... self.client.reply(msg_id, {"samp.status": "samp.ok", "samp.result": {}})
... def receive_notification(self, private_key, sender_id, mtype, params, extra):
... self.params = params
... self.received = True
私たちはこれを実例化しました
>>> r = Receiver(client)
私たちは今使用することができます bind_receive_call()
そして bind_receive_notification()
すべてを聞き取る方法を教えてくれました table.load.votable
メッセージ::
>>> client.bind_receive_call("table.load.votable", r.receive_call)
>>> client.bind_receive_notification("table.load.votable", r.receive_notification)
メッセージがまだ届いていないかどうかを確認することができます
>>> r.received
False
私たちは今TOPCATからこのテーブルを中継することができる。数秒後にメッセージが届いたかどうかを再確認することができます
>>> r.received
True
やったぞ!表のURLは今あるはずです r.params['url']
そこで私たちはこうすることができます
>>> from astropy.table import Table
>>> t = Table.read(r.params['url'])
Downloading http://127.0.0.1:2525/dynamic/4/t12.vot [Done]
>>> t
col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
------------------------- -------- ------- -------- -------- ----- ---- ----- ---- -----
SSTGLMC G000.0046+01.1431 0.0046 1.1432 265.2992 -28.3321 6.67 5.04 6.89 5.22 N
SSTGLMC G000.0106-00.7315 0.0106 -0.7314 267.1274 -29.3063 7.18 6.07 nan 5.17 Y
SSTGLMC G000.0110-01.0237 0.0110 -1.0236 267.4151 -29.4564 8.32 6.30 8.34 6.32 N
...
前述したように、以下の動作が完了した後にハブとの接続が切断されることを記憶すべきである
>>> client.disconnect()
例を引く¶
以下は、テーブルを受信および読み取るために使用可能なスクリプトの完全な例である。これは、メッセージが受信されるのを待ち、以下の条件を有するときにテーブルを読み取るループを含む。
import time
from astropy.samp import SAMPIntegratedClient
from astropy.table import Table
# Instantiate the client and connect to the hub
client=SAMPIntegratedClient()
client.connect()
# Set up a receiver class
class Receiver(object):
def __init__(self, client):
self.client = client
self.received = False
def receive_call(self, private_key, sender_id, msg_id, mtype, params, extra):
self.params = params
self.received = True
self.client.reply(msg_id, {"samp.status": "samp.ok", "samp.result": {}})
def receive_notification(self, private_key, sender_id, mtype, params, extra):
self.params = params
self.received = True
# Instantiate the receiver
r = Receiver(client)
# Listen for any instructions to load a table
client.bind_receive_call("table.load.votable", r.receive_call)
client.bind_receive_notification("table.load.votable", r.receive_notification)
# We now run the loop to wait for the message in a try/finally block so that if
# the program is interrupted e.g. by control-C, the client terminates
# gracefully.
try:
# We test every 0.1s to see if the hub has sent a message
while True:
time.sleep(0.1)
if r.received:
t = Table.read(r.params['url'])
break
finally:
client.disconnect()
# Print out table
print t
DS 9とAladinに画像を送信する¶
テーブルについては,SAMPを介してFITS画像を送信する最も便利な方法は使用である. SAMPIntegratedClient
級友たち。AladinまたはDS 9が開くと、まずインスタンス化される。 SAMPIntegratedClient
インスタンスは、その後、前のようにハブに接続される:
>>> from astropy.samp import SAMPIntegratedClient
>>> client = SAMPIntegratedClient()
>>> client.connect()
次に、送信する画像に関する詳細な情報を含む辞書を設定しなければならない。これには url
これはファイルのURLであり name
これは,表の人間可読名である.URLはローカルURLとすることができます file:///
):
>>> params = {}
>>> params["url"] = 'file:///Users/tom/Desktop/MSX_E.fits'
>>> params["name"] = "MSX Band E Image of the Galactic Center"
見 Sending a Table to TOPCAT and DS9 ローカルURLを構築する推薦方法の例については、参照されたい。もう私たちはメッセージ自体を設定することができる。これにはメッセージのタイプが含まれています image.load.fits
FITS画像をロードすべきであることと、上で設定したテーブルの詳細を示す):
>>> message = {}
>>> message["samp.mtype"] = "image.load.fits"
>>> message["samp.params"] = params
最後に傍受しているすべてのクライアントにこのメッセージをブロードキャストすることができます table.load.votable
メッセージ::
>>> client.notify_all(message)
そこまでは Sending a Table to TOPCAT and DS9 vt.的 notify_all()
方法画像をすべてのリスニングクライアントに放送し、表に対して、変更することができます notify()
方法は、それを特定のクライアントに送信する。
完了後、ハブとの接続を切断することを確認しなければなりません:
>>> client.disconnect()
DS 9またはAladinからテーブルを受信する¶
SAMPで画像を受信し Receiving a Table from TOPCAT しかし、メッセージタイプは image.load.fits
ではなく table.load.votable
それがそうです。URLを受け取ると,FITS画像を開くことができる:FITS画像を開く.
>>> from astropy.io import fits
>>> fits.open(r.params['url'])