GalSim автоматическое поведение размера изображения для galsim.GSObject.draw()

Я заметил, что GSObject.draw можно вызывать без ключевого слова image. В документации сказано, что автоматически выбирается размер изображения, если image = Нет. Как именно определяется этот автоматический размер? Сохраняет ли он некоторую долю потока галактики в изображении, и если да, то какую долю?

1 ответ

Решение

Да. Суть в том, что он пытается получить не менее 99,5% потока.

Каждый атомарный объект имеет внутренний атрибут stepk, который представляет собой размер сетки, используемый в изображении Фурье. Это основано на изображении в реальном пространстве, включающем, по крайней мере, 99,5% потока, чтобы избежать наложения в БПФ.

Затем, когда вы комбинируете объекты (с помощью 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, Это поможет сделать последующие БПФ более эффективными.

Если вы хотите изменить значение 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)
Другие вопросы по тегам