我注意到可以在没有image关键字的情况下调用GSObject.draw。文档说如果image = None,则返回自动调整大小的图像。这个自动尺寸究竟是如何确定的?它是否确保在图像中保留一小部分星系的通量,如果是这样的话,是什么分数?
答案 0 :(得分:1)
是。总结是它试图获得至少99.5%的通量。
每个原子对象都有一个内部属性stepk,它是在傅里叶图像中使用的网格大小。这是基于真实空间图像,包括至少99.5%的通量,以避免FFT中的混叠。
然后,当您组合对象(使用Add,Convolve等)或转换它们(剪切,dliate等)时,stepk的值将保持最新的配置文件,有时在准确的公式时会有启发式过于笨拙,但我们通常试图在保守派方面犯错误。
然后当您使用image=None
绘制最终对象时,它使用最终的stepk值来计算带有N = 2pi * wmult / (scale * stepk)
的图章大小,其中scale
是图像的像素比例,其中您通常会明确指定(im = obj.draw(scale=pixel_scale)
),而wmult
是一个可选参数,其工作就是这样 - 制作比默认情况下更大的图像。
然后将此N向上舍入为2^k
或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)