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)