image キーワードなしで GSObject.draw を呼び出せることに気付きました。ドキュメントによると、image = None の場合、自動的にサイズ変更された画像が返されます。この自動サイズはどのように正確に決定されますか? 画像内に銀河のフラックスの一部を確実に保持しますか?もしそうなら、どの部分を保持しますか?
1 に答える
はい。要約すると、フラックスの少なくとも 99.5% を取得しようとします。
各アトミック オブジェクトには、フーリエ イメージで使用するグリッド サイズである stepk という内部属性があります。これは、FFT でのエイリアシングを回避するために、フラックスの少なくとも 99.5% を含む実空間イメージに基づいています。
次に、オブジェクトを結合 (Add、Convolve など) するか、それらを変換 (shear、dliate など) すると、新しいプロファイルの stepk の値が最新の状態に保たれます。正確な式が扱いにくい場合は、ヒューリスティックを使用することもあります。 、しかし、私たちは通常、ここで保守的な側で誤りを犯そうとしました.
次に、 で最終的なオブジェクトを描画すると、最終的なimage=None
stepk 値を使用して でスタンプ サイズが計算されますN = 2pi * wmult / (scale * stepk)
。ここscale
で、 はイメージのピクセル スケールで、通常は明示的に指定します ( im = obj.draw(scale=pixel_scale)
)。wmult
これだけで、デフォルトよりも大きな画像を作成できます。
2^k
次に、この N は または のいずれかに切り上げられます3 * 2^k
。これは、後続の FFT をより効率的にするのに役立ちます。
99.5% の値を変更したい場合は、GSParams
クラスでも可能です。パラメータalias_threshold
です。まあ、実際には1-alias_threshold
。デフォルトalias_threshold
は 5e-3 ですが、必要に応じて次のようにして下げることができます。
gsparams = galsim.GSParams(alias_threshold=1.e-3)
gal = galsim.Sersic(..., gsparams=gsparams)
psf = galsim.Kolmogorov(..., gsparams=gsparams)
pix = galsim.Pixel(..., gsparams=gsparams)
conv = galsim.Convolve([gal,psf,pix])
im = conv.draw(scale=pixel_scale)