2

我注意到 GSObject.draw 可以在没有 image 关键字的情况下调用。文档说如果 image = None,则返回自动调整大小的图像。这个自动大小究竟是如何确定的?它是否确保在图像中保留一部分星系通量,如果是,那是多少?

4

1 回答 1

2

是的。总结是它试图获得至少 99.5% 的通量。

每个原子对象都有一个内部属性 stepk,它是在傅立叶图像中使用的网格大小。这是基于包含至少 99.5% 通量的真实空间图像,以避免 FFT 中的混叠。

然后,当您组合对象(使用 Add、Convolve 等)或变换它们(shear、dliate 等)时,stepk 的值会针对新配置文件保持最新,有时在精确公式过于笨拙时使用启发式,但我们通常会尝试在保守的一面犯错。

然后,当您使用 绘制最终对象时,它使用最终的stepkimage=None值来计算印章大小,N = 2pi * wmult / (scale * stepk)其中scale是图像的像素比例,您通常会明确指定 (只是这个 - 制作比默认情况下更大的图像。im = obj.draw(scale=pixel_scale)wmult

然后将此 N 向上舍入为2^k3 * 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)
于 2014-03-29T20:11:25.243 回答