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'])