期間・領域・解析条件¶
このページは、期間と領域の指定方法、それらを束ねるView、作業場所のProject、名前付きの条件Caseの仕様をまとめます。
流れを先に掴みたい場合は解析条件を残すを読んでください。
期間は半開区間で指定する¶
SOPRANの期間(TimeRange)は開始を含み、終了を含みません。日ごとのシャードをつなげても、
境界のサンプルを二重に数えないためです。
spn.period("2008-02-01T03:00", "2008-02-01T04:00")
spn.day("2008-02-01") # 2008-02-01 00:00 から 2008-02-02 00:00 まで
spn.month("2008-02")
spn.year("2008")
ISO 8601の文字列とdatetimeを受け付けます。タイムゾーンのない時刻はUTCとして扱います。
TimeRangeはstart、stop(UTCのdatetime)と、文字列のstart_iso、stop_isoを持ちます。
領域は経度の定義域と一緒に持つ¶
region = spn.Region(lon=(350, 10), lat=(-5, 5), body="moon")
region.crosses_lon_boundary # True(0/360度をまたぐ)
region.contains(355, 0) # True
region.to_lon_domain("-180_180") # 経度を -180〜180 で表した Region
経度の既定は東経正・0〜360度、緯度は惑星中心緯度です。lon_domain、lon_direction、lat_typeで変えられます。
月面マップでの座標の扱いは月面マップにあります。
View¶
Viewは期間・領域と処理条件を束ねた、変更不可のオブジェクトです。
view = spn.view(
time=spn.day("2008-02-01"),
region=spn.Region(lon=(120, 160), lat=(-45, -10), body="moon"),
frame="SSE",
download="never",
)
| 種類 | 引数 | 効果 |
|---|---|---|
| 選択 | time(またはstartとstop) |
エンドポイントの既定の期間になる |
| 選択 | region |
月面マップの既定の領域になる |
| 選択 | mission、instrument、product、quality |
解析条件として記録する |
| 処理 | download |
ミッションのダウンロード方針になる |
| 処理 | spice_kernels、time_scale、backend |
view.frame_context()が作るFrameContextに入る |
| 処理 | frame、cache |
解析条件として記録する |
view.kaguya、view.artemis、view.omni、view.moonは、それぞれspn.Kaguyaなどの実体です。
メソッドで期間を省くとview.timeを使います。登録済みのデータ源はview.source("kaguya")でも取り出せます。
条件を変えるときは新しいViewを作ります。
view.with_time("2008-02-01T03:00", "2008-02-01T04:00")
view.with_region(None)
view.with_context(frame="GSE", download="missing")
spn.view(...)は、カレントディレクトリから親へたどって最初に見つかったsopran.tomlを
Projectの設定として使います。spn.kaguyaなどの短い入口も同じです。
Project¶
Projectは解析テーマの作業ディレクトリです。
project = spn.Project("projects/lunar_wake")
project = spn.Project("projects/lunar_wake", store=spn.Store("/path/to/sopran_data"))
| 項目 | 内容 |
|---|---|
project.root |
作業ディレクトリ。sopran.tomlを置く |
project.store |
使うStore。省略時は設定の優先順位で決まる |
project.artifact_root |
project.save()の保存先 |
project.view(...) |
このProjectの既定値を使うView |
project.kaguyaなど |
期間を持たないミッションの実体 |
Case¶
Caseはsopran.tomlに名前付きで保存した解析条件です。
[defaults]
frame = "SSE"
[defaults.region] # 領域を持たないCaseの既定
body = "moon"
lon = [120, 160]
lat = [-45, -10]
[cases.wake_20080201]
start = "2008-02-01T00:00:00"
stop = "2008-02-02T00:00:00"
[cases.wake_20080201.context] # frame, cache, download, quality, time_scale
download = "never"
[cases.wake_20080201.region]
body = "moon"
lon = [130, 150]
lat = [-30, -20]
case = project.case("wake_20080201")
case.kaguya.esa1.counts.load()
case.with_time("2008-02-01T03:00", "2008-02-01T04:00") # View を返す
case.view # Case と同じ条件の View
各キーは、Caseの値、セッション設定、Projectの[defaults]、ユーザー設定の順に解決します。
ただしdownloadだけは、セッション設定と環境変数(SOPRAN_OFFLINEなど)がCaseの値より優先します(設定)。
project.case(name, start=..., stop=...)は、sopran.tomlに書かずにその場でCaseを作ります。
project.save_case(name, view)はViewの期間・領域・処理条件をsopran.tomlへ追記し、
同じ内容をcases/<name>.jsonにも書きます。同名のCaseがあると止まります。上書きは未実装なので、
変えたいときはsopran.tomlを編集してください。
来歴を記録する¶
context=は、図・成果物・データセットに解析条件を書き込む共通の引数です。
| 呼び出し | 記録先 |
|---|---|
plot(..., context=case)、quicklook(..., context=case) |
図のJSON |
project.save(array, "interim/name", context=case) |
NetCDFと同名のJSON |
write_parquet(..., context=case)、write_dataset(..., context=case) |
Storeのマニフェスト |
contextにはCase、View、metadata()かto_metadata()を持つオブジェクト、JSONにできる辞書を渡せます。
CaseならCase名・Projectの場所・Storeの場所・期間・領域・既定値が入ります。
project.save(value, name)は、to_xarray()を持つ値をNetCDFとしてartifact_rootの下に保存し、
期間・出典・相対パスをJSONに記録します。Projectの中に置くのは一時的な成果物です。
複数の解析で再利用するデータはStoreに保存してください。