FITS カットアウトでの Real-Bogus 判定と銀河形態分類
科学画像、参照画像、差分画像の FITS カットアウトに、RA/Dec の表示と光度曲線を添えて突発天体候補を判定し、質問ツリーで銀河を分類します。
v2.13.0 で追加
fits_cutout ディスプレイは、FITS 画像をブラウザに表示します。項目ごとに1枚の画像を表示することも、突発天体候補の科学画像、参照画像、差分画像のカットアウトを、候補の光度曲線の上に並べて表示することもできます。時間領域天文学者は、このディスプレイを real-bogus 判定に使います。real-bogus 判定では、アノテーターが ZTF や Rubin などのサーベイから得た各候補に、実在する天体物理学的な突発天体(real)か、偽の検出(bogus)かのラベルを付けます。そのラベルは、real-bogus 分類器の訓練セットになります。たとえば、ZTF 用の Braai 分類器は、ラベル付きの科学画像、参照画像、差分画像の3つ組3万件以上で訓練されました(Duev et al., MNRAS 489, 3582)。銀河形態分類は、項目ごとに1枚の画像と、Galaxy Zoo 形式の質問ツリーを使います。ディスプレイ自体は何も保存しません。判定の質問は通常、R、B、U のキーに Real、Bogus、Unsure を割り当てた、通常の radio スキームです。
FITS は、天文画像と表の標準的なファイル形式です。FITS ヘッダーの世界座標系(WCS)キーワードは、画像の各ピクセルを天球上の位置に対応づけます。差分画像は、較正済みの科学露出から、同じ領域の参照(テンプレート)画像を引いたもので、実在する突発天体は、差分画像に新しい点源として現れます。ZTF のアラートパケットは、科学画像、参照画像、差分画像のカットアウトを、gzip 圧縮の FITS 画像として保持しており(アラートのスキーマ)、Rubin のスタッフも、Rubin のアラートが3つのカットアウトをすべて保持するだろうと述べています(Rubin フォーラム)。
突発天体は差分カットアウトで目立ちます
- 読み込み: astropy(BSD-3-Clause)が Potato サーバー上で FITS ファイルを読み、項目の位置の周囲の領域を切り出し、カットアウトをスケーリングして、カットアウトの WCS の記述とともに PNG を送ります。サーバーは最初の FITS ファイルが読まれるときに astropy をインポートし、astropy を読み込まずに起動します。
- 形式:
.fits、.fit、.fts、および gzip 圧縮の.fits.gz。ディスプレイは、hduで指定した HDU を表示し、指定がなければ、2次元(またはそれ以上)の画像を持つ最初の HDU を表示します。キューブの場合は、キューブの最初の平面を表示します。.fits.gzという名前でディスクに書き出した ZTF のカットアウトは、展開せずに開きます。 - カットアウト: 中心は、FITS ピクセル(
x、y)または天球上(ra、dec)の位置で、サイズはピクセルまたは"40 arcsec"のような角度です。非圧縮ファイルからは、カットアウトの行だけが読み込まれます。 - キャッシュ: 変換した各カットアウトは、PNG と JSON ファイルとして
<task_dir>/.potato_cache/fits/に書き込まれます。キャッシュキーは、ファイルのパス、サイズ、更新時刻、スケーリングのオプションを含みます。そのため、変更のないファイルは1回だけ変換されます。キャッシュは、最近使われた4,000エントリーを保持し、フォルダーを削除しても問題ありません。 - オフライン: FITS ファイルと光度曲線は、メディアディレクトリから読み込まれます。URL とメディアディレクトリの外のパスは拒否され、光度曲線のプロットは、Potato に同梱された Plotly のコピーを使います。
このディスプレイには、astro エクストラ(astropy>=5.3)が必要です。
pip install 'potato-annotation[astro]'fits_cutout フィールドを持つ設定で astropy がインストールされていない場合は、インストールコマンドを含むメッセージとともに、起動時に失敗します。
設定
次の設定は、カットアウトの3つ組に対する real-bogus 判定を構成します。すべての候補に real-bogus のラベルが必須で、bogus の原因についての2つ目の質問は、アノテーターが Bogus を選んだ場合にのみ表示されます。
annotation_task_name: "Transient candidate vetting"
task_dir: .
media_directory: media
output_annotation_dir: annotation_output
data_files: [data/candidates.json]
item_properties: {id_key: id, text_key: summary}
instance_display:
fields:
- key: candidate # item field holding the triplet
type: fits_cutout
label: "Cutouts"
display_options:
size: 48 # pixels, used when an item gives no size
interval: zscale
stretch: linear
panels:
- {key: science, label: Science}
- {key: reference, label: Reference}
- {key: difference, label: Difference, stretch: asinh}
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: radio
name: vetting
description: "Is this a real astrophysical transient?"
humanize_labels: false
labels:
- {name: "Real", key_value: "r"}
- {name: "Bogus", key_value: "b"}
- {name: "Unsure", key_value: "u"}
label_requirement: {required: true}
- annotation_type: multiselect
name: bogus_reason
description: "What makes the candidate bogus?"
humanize_labels: false
labels:
- "Subtraction residual (dipole)"
- "Cosmic ray or hot pixel"
- "Satellite or asteroid trail"
- "Bad column or image edge"
- "Other"
display_logic:
show_when:
- {schema: vetting, operator: equals, value: "Bogus"}panels リストは、カットアウトとその順序を選び、各パネルは、そのパネル独自のスケーリングを設定できます。ここでは、差分パネルが asinh ストレッチを使い、科学パネルと参照パネルは、ディスプレイの zscale インターバルと線形ストレッチを保ちます。humanize_labels: false は、各ラベルを書いたとおりに表示します。そのため、画面上の「Bogus」が display_logic の条件の値と一致します。非表示の質問は、ページ上でもサーバー上でも、必須回答のチェックの対象外になります。
各項目は、media_directory からの相対パスで3つの FITS パスと、候補の位置、任意の光度曲線を与えます。
{
"id": "cand-001",
"summary": "cand-001: ra 150.11920, dec +2.20583, band r",
"candidate": {
"science": "cutouts/cand-001_sci.fits",
"reference": "cutouts/cand-001_ref.fits",
"difference": "cutouts/cand-001_diff.fits",
"ra": 150.11920, "dec": 2.20583,
"size": 48,
"light_curve": "lightcurves/cand-001.csv"
}
}銀河形態分類では、1つのパスを持つ項目フィールドが、1枚の画像を表示します。
{"id": "gal-17", "image": "galaxies/gal-17.fits"}ZTF の光度曲線
Potato は、一般的な名前で光度曲線の列を見つけますが、ZTF の測光列 magpsf と sigmapsf は、その名前に含まれていません。対応づけがないと、jd, fid, magpsf, sigmapsf, diffmaglim という列を持つ ZTF の光度曲線は、diffmaglim を持つ各行を上限値として描画します。次の部分的なブロックは、上の設定の fits_cutout フィールドに2つのオプションを加え、各列に名前を付けます。
instance_display:
fields:
- key: candidate
type: fits_cutout
display_options:
light_curve_columns: {time: jd, band: fid, mag: magpsf, err: sigmapsf, limit: diffmaglim}
time_label: JDプロット上の「this image」マーカーは、科学画像の MJD-OBS から決まり、Potato は、MJD-OBS が最初の点より前、または最後の点より後に、1,000時間単位以内にあるときにだけマーカーを描画します。JD の軸では、MJD-OBS はすべての時刻より約 2,400,000 小さく、Potato はマーカーを描画しません。各項目に JD での epoch を指定すると、マーカーが置かれます。ZTF のフィルター ID 1、2、3 は、バンド名「1」「2」「3」になり、代わりにバンド列に g、r、i と書くと、各バンドに通常の色が付きます。
質問ツリーによる銀河形態分類
Galaxy Zoo 形式の決定木は、決まった順序で質問を尋ね、各回答が次にどの質問が来るかを決めます。Galaxy Zoo DECaLS のツリーは、「Smooth or Featured?」から始まります(Walmsley et al., MNRAS 509, 3966)。Potato では、ツリーの各質問は radio スキームで、各フォローアップの質問の display_logic は、その質問へつながる回答のあとでだけ、その質問を表示します。
display_logic の2つのルールが、ツリーの形を決めます。1つ目は、非表示になった質問は、非表示になる前にアノテーターが与えた回答を保持することです。2つ目は、質問が表示されるかどうかは、親の質問が画面上にあるかどうかにかかわらず、回答だけから計算されることです。したがって各条件は、最初の質問からの経路全体を all で結合します。親だけを指定した条件では、アノテーターが最初のほうの回答を変えたあとも、後続の質問が画面に残ります。
次の設定は、単一の銀河画像に対する4問のツリーを尋ねます。
annotation_task_name: "Galaxy morphology"
task_dir: .
media_directory: media
output_annotation_dir: annotation_output
data_files: [data/galaxies.json]
item_properties: {id_key: id, text_key: id}
instance_display:
fields:
- key: image
type: fits_cutout
label: "Galaxy"
display_options:
interval: percentile
percentile: 99.5
stretch: asinh
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: radio
name: shape
description: "Is the galaxy simply smooth and rounded, with no sign of a disk?"
humanize_labels: false
labels: ["Smooth", "Features or a disk", "Star or artifact"]
label_requirement: {required: true}
- annotation_type: radio
name: edge_on
description: "Could this be a disk viewed edge-on?"
labels: ["Yes", "No"]
label_requirement: {required: true}
display_logic:
show_when:
- {schema: shape, operator: equals, value: "Features or a disk"}
- annotation_type: radio
name: bulge_edge_on
description: "Does the edge-on disk have a bulge at its center? If so, what shape?"
humanize_labels: false
labels: ["Rounded", "Boxy", "No bulge"]
label_requirement: {required: true}
display_logic:
show_when:
- all:
- {schema: shape, operator: equals, value: "Features or a disk"}
- {schema: edge_on, operator: equals, value: "Yes"}
- annotation_type: radio
name: spiral
description: "Is there any sign of a spiral arm pattern?"
labels: ["Yes", "No"]
label_requirement: {required: true}
display_logic:
show_when:
- all:
- {schema: shape, operator: equals, value: "Features or a disk"}
- {schema: edge_on, operator: equals, value: "No"}項目に位置がない場合、ディスプレイは画像全体を表示します。パーセンタイルインターバルと asinh ストレッチを組み合わせると、銀河の暗い外側の円盤と明るい中心核を1つのビューで見られます。zscale インターバルは暗い天体向けに調整されているため、明るい中心核が飽和することがあります。YAML では "Yes" と "No" を引用符で囲んでください。引用符のない Yes と No は、真偽値として読まれるためです。上流の例では、判定の質問のあとに、同じ種類のツリーを置いています。この例のツリーは、real と判定された各候補の母銀河について尋ねます。
項目データ
項目のフィールドは、FITS のパスか、次のキーを持つマッピングです。
| キー | 意味 |
|---|---|
science、reference、difference、image、または panels のエントリーが指定する任意のキー | メディアディレクトリ内の FITS のパス、または1枚の画像だけ異なるスケーリングをする {path: ..., stretch: ..., interval: ...} のマッピング |
ra、dec | 度単位、または60進法テキスト(RA は時単位で "10:00:28.6"、Dec は "+02:12:21")でのカットアウトの中心。ICRS として読み込まれ、画像自身の座標系(FK5、銀河座標)が異なる場合は、そちらへ変換されます |
x、y | FITS ピクセルでのカットアウトの中心。最初のピクセルの中心は、ds9 や CRPIX と同じく (1, 1) です。項目は x と y、または ra と dec のいずれかを与え、両方は与えません |
size | ピクセル、または角度("30 arcsec"、"0.5 arcmin"、"0.01 deg")でのカットアウトのサイズ |
stretch、interval、percentile、asinh_a、log_a、invert、hdu | この項目のすべての画像に対するスケーリング |
light_curve | メディアディレクトリ内の CSV、TSV、JSON ファイル、または [{"mjd": 60600.0, "band": "g", "mag": 20.21, "magerr": 0.07}] のような点のリスト |
epoch | 光度曲線上にマークする時刻。科学画像の MJD-OBS の代わりに使われます |
スケーリングのオプションは、低いほうから順に4つのレベルで適用されます。(1) ディスプレイのオプション、(2) panels のエントリー、(3) 項目、(4) 1枚の画像に対する項目のマッピング。あとのレベルは、前のレベルを上書きします。位置があり、どこにもサイズがない項目は、64ピクセルのカットアウトになり、カットアウトは1辺が最大4,096ピクセルです。位置のない項目は画像全体を表示し、幅または高さが 1,024 ピクセルを超える画像は、1,024 までブロック平均で縮小されます。画像全体の表示は、max_image_pixels に制限されます。位置のないサイズはエラーです。panels リストがない場合、ディスプレイは、項目が持つ science、reference、difference のうちのいずれかを表示し、なければ image を表示します。
光度曲線ファイル
光度曲線ファイルは、点ごとに1行です。
mjd,band,mag,magerr,limit
60570.0,r,,,21.3
60600.0,g,20.21,0.07,
60603.0,g,19.37,0.05,等級を持つ行は検出で、等級がなく limit を持つ行は上限値です。使える時刻のない行はスキップされ、件数が数えられます。light_curve_columns がない場合、列名は大文字小文字を区別せずに、次のリストと順に照合されます。
| 役割 | 試される名前 |
|---|---|
time | mjd、time、jd、hjd、bjd、t |
mag | mag、magnitude、flux、value、y |
err | magerr、mag_err、err、error、sigma、fluxerr、flux_err、dy |
band | band、filter、fid、passband |
limit | limit、upper_limit、diffmaglim、maglim、lim |
JSON の光度曲線は、点のオブジェクトのリスト、または points や data の下にリストを持つオブジェクトです。TSV ファイルは、拡張子 .tsv、またはファイル内のタブで検出され、# で始まる行はスキップされます。2 MB を超えるファイルは拒否され、20,000行を超える行は破棄されます。バンドは u、g、r、i、z、y、J、H、K、W1、W2、c、o の順に並べられ、それ以外のバンド名は、挙げたバンドのあとに続きます。
ディスプレイオプション
オプションは display_options の下、またはフィールド上に直接置き、サーバーは起動時にすべての値を検査します。
| オプション | デフォルト | 意味 |
|---|---|---|
panels | 項目の science、reference、difference、なければ image | {key, label} による最大6つのパネルを順に指定します。パネルは、下記のスケーリングオプションも設定できます。label のないパネルは、キーから題名が付けられます |
size | なし | 項目がサイズを与えないときのカットアウトのサイズ。ピクセルまたは角度で指定します。位置があり、どこにもサイズがない場合は64ピクセル |
interval | zscale | minmax、zscale(ds9 と同じ IRAF の zscale)、percentile |
percentile | 99.5 | interval: percentile で上下限の内側に入るピクセルの割合。0より大きく100以下 |
stretch | linear | linear、sqrt、log、asinh |
asinh_a | 0.1 | asinh ストレッチの a パラメーター。値が小さいほど、明るいピクセルがより圧縮されます |
log_a | 1000 | log ストレッチの a パラメーター |
invert | false | 明るい背景に暗い天体を表示します |
hdu | 最初の画像 HDU | HDU 番号(0 がプライマリ)または EXTNAME |
max_file_mb | 100 | 読み込む FITS ファイルの最大サイズ(圧縮の有無にかかわらず)。メガバイト単位 |
max_image_pixels | 25000000 | 項目が位置を与えないときに、全体を表示する画像の最大サイズ |
light_curve | true | 項目に光度曲線があれば、それを描画します |
light_curve_columns | 検出 | {time, mag, err, band, limit} による、役割ごとの列名 |
light_curve_units | mag | mag(明るいほうが上)または flux |
light_curve_height | 260 | プロットの高さ(ピクセル) |
time_label | MJD | 時間軸のタイトル |
crosshair | true | 共有のクロスヘアを表示します |
compass | true | WCS から北と東の矢印を表示します |
panel_size | 18rem(パネルが1つのときは 30rem) | パネルの最大幅。CSS の長さで指定します。数字だけの場合はピクセルです |
engine オプションが取る値は potato だけです。FITS ファイルは常にサーバー上で読み込まれるため、ディスプレイは allow_remote を拒否します。
ビューアの操作
パネルは、ズーム、パン、1つのクロスヘアを共有し、ズームの段階は 1× から 16× まで進みます。
| 操作 | 効果 |
|---|---|
| ポインターをカットアウト上で動かす | すべてのパネルでクロスヘアが動き、読み取り欄に、RA と Dec(60進法と度)、元の画像の FITS ピクセル、パネルが表示されます |
| クリックまたはタップ | クロスヘアを固定します。もう一度クリックするか Escape を押すと、クロスヘアを解除します |
| +、−、Reset ボタン | すべてのパネルをまとめてズームするか、1× に戻してクロスヘアを消去します |
| Ctrl または Cmd とホイール、またはトラックパッドのピンチ | ポインターの位置でズームします |
| ズーム中のドラッグ | すべてのパネルをまとめてパンします |
| Tab でカットアウトへ移動し、矢印キー | クロスヘアを1ピクセル動かします。+ と − でズーム、0 でリセットします |
アノテーションのキー(判定設定の R、B、U)は、カットアウトにフォーカスがある間も動作し続けます。矢印キーは、カットアウトにフォーカスがある間だけクロスヘアを動かし、それ以外では、通常どおり項目間を移動します。空白(NaN または BLANK)のピクセルと、画像の端を越えたカットアウトの部分は透明で、市松模様として表示され、パネルの下のステータス行が、どちらに当たるかを示します。
パネルは、サイズが同じで、ピクセルスケールの差が1%以内、天球上の中心の差が半ピクセル以内のとき、整列しているとみなされます。整列していないパネルには注記が付き、Potato は各パネルの線形 TAN WCS を使って、天球上の位置でクロスヘアを各パネルに置きます。光度曲線のプロットは、科学画像のエポックを「this image」としてマークし、上限値を下向きの白抜きの三角形で描画し、プロットの下の表にすべての点を一覧します。
ブラウザに送られる WCS
ブラウザが FITS を読むことはありません。各カットアウトについて、サーバーは PNG の URL と、カットアウトの CRPIX、CRVAL、CD 行列、ピクセルスケール、北と東の方向、カットアウト全体を出力ピクセル16個ごとにサンプリングした天球上の位置のグリッドを含む WCS の記述を送ります。読み取り欄はそのグリッドを補間し、astropy が読めるあらゆる投影(SIP 歪みを含む)に従います。グリッドは各天球上の位置を単位ベクトルとして保存し、単位ベクトルを補間することで、RA 0/360 をまたぐ場合や極付近でも、読み取り欄が連続します。線形のキーワードは SIP の項を含まず、整列していないパネルのクロスヘアの配置は、その線形のキーワードを使います。銀河座標の画像では軸に l と b が、黄道座標の画像では軸に λ と β が表示されます。
保存される回答とエクスポート
ディスプレイは何も保存しません。ページ上の各スキームは、通常の radio や multiselect の質問と同じように、アノテーターの回答を保存し、回答は汎用の形式でエクスポートできます。
python -m potato.export -c config.yaml -f csv -o exports/csvCSV は、アノテーターと項目ごとに1行で、vetting.Real や bogus_reason.Cosmic ray or hot pixel のように、スキームとラベルごとに1列を持ちます。-f jsonl は、同じレコードを JSON Lines として書き出します。あとで非表示になったツリーの質問への回答は、保存されたアノテーションに残ります。分析の前に、前の回答の経路でフォローアップの回答を絞り込んでください。
Potato の一致度指標は、これらのスキームを対象にします。vetting のような radio の質問には、一致率、Cohen と Fleiss のカッパ、Krippendorff のアルファが、bogus_reason のような multiselect の質問には、平均 Jaccard と、MASI 距離による Krippendorff のアルファが出ます。2.13 で追加された consensus エクスポートも radio と multiselect を対象とし、エクスポートには、各候補の得票割合と、consensus_aggregation ブロックのしきい値に基づく retired または needs_review の状態が一覧されます。一致度指標も consensus エクスポートも display_logic を確認せず、非表示の質問に残った回答は、指標にもエクスポートにも数えられます。num_annotators_per_item は、各候補を判定するアノテーターの人数に設定してください。
例
python potato/flask_server.py start examples/image/astronomy-real-bogus/config.yaml -p 8000この例には、円盤銀河内の超新星、差分の双極子、宇宙線、母銀河のない点源という、4つの合成の候補があります。各候補には、1ピクセルあたり 1″ の1つの TAN WCS 上にある 96 × 96 の FITS 画像が3枚と、光度曲線があります。4つ目の候補の画像は gzip 圧縮されています。同じフォルダーの generate_data.py が、ファイルを書き直します。
コーディングエージェントで調査を設定する
potato-skill 1.2.0 は Potato 2.13.1 を対象としており、fits_cutout ディスプレイを名前で認識します。このスキルは、アノテーターに何を尋ねるか、各候補を何人のアノテーターが判定するか、トレーニングと注意チェック、エクスポートなど、調査設計の側面を支援します。このスキルは、FITS の項目形式、ディスプレイのオプション、astro エクストラを、まだ文書化していません。potato-skill をインストールし、エージェントに調査を説明して、形式とオプションについては、このページの Markdown 版をエージェントに参照させてください。Markdown 版は https://www.potatoannotator.com/docs/annotation-types/astronomy.md にあります。
関連資料
- ラジオとマルチセレクト - 判定とツリーの質問を尋ねるスキーム
- 時系列 - 光度曲線上でトランジットやフレアをマークする
- エクスポート形式 - Potato のエクスポート形式とエクスポートコマンド
- アノテーター間一致度の解説 - 一致度係数の選び方と読み方
- アノテーターは何人必要か - 項目あたりのアノテーター数の選び方
実装の詳細については、ソースドキュメントを参照してください。