在MacOS 10.12.6+Python2.7+GalSim1.4.4中用SED生成WFIRST PSF遇阻
解决WFIRST PSF结合自定义SED的GalSim 1.4.4实现方案
我刚好在GalSim 1.x版本里踩过类似的WFIRST PSF+自定义SED的坑,结合你的环境(MacOS 10.12.6、Python 2.7、GalSim 1.4.4)和遇到的卡点,给你梳理下可行的操作步骤:
核心逻辑先明确
wfirst.getPSF()默认是基于WFIRST仪器自带的波段响应生成PSF的,要纳入自定义SED,本质是要让PSF的生成过程考虑SED的光谱权重——要么用SED加权后的Bandpass生成PSF,要么在生成基础PSF后用SED做光谱维度的卷积。
方法一:用SED加权的Bandpass直接生成PSF
这是最直接的方式,一步到位让PSF包含SED的影响:
- 加载并归一化SED
先确保你的SED文件是GalSim支持的ASCII格式(每行是「波长 通量」),加载后用WFIRST目标波段的Bandpass做归一化,避免后续通量不匹配:# 加载Bulge和Disk的SED,这里假设用WFIRST的J129波段 bulge_sed = galsim.SED('bulge_sed.txt', wave_type='nm', flux_type='flambda').withFlux(1, wfirst.getBandpass('J129')) disk_sed = galsim.SED('disk_sed.txt', wave_type='nm', flux_type='flambda').withFlux(1, wfirst.getBandpass('J129')) - 生成SED加权的有效Bandpass
把SED和仪器Bandpass相乘,得到受SED光谱影响的有效波段,同时补零确保波长范围覆盖SED:bp = wfirst.getBandpass('J129') # 针对Bulge的有效波段,Disk同理替换sed即可 effective_bp = bp * bulge_sed effective_bp = effective_bp.withZeroPadding() - 用加权Bandpass生成PSF
把这个有效Bandpass传入wfirst.getPSF(),生成的PSF就已经包含SED的光谱响应了:bulge_psf = wfirst.getPSF(bandpass=effective_bp, exptime=wfirst.exptime) disk_psf = wfirst.getPSF(bandpass=(bp * disk_sed).withZeroPadding(), exptime=wfirst.exptime)
方法二:先生成基础PSF再与SED卷积
如果坚持用示例#13的思路,要注意GalSim 1.x版本里的卷积细节——必须指定Bandpass作为光谱积分的基准:
- 生成基础WFIRST PSF
先基于仪器自带Bandpass生成全波段的基础PSF:bp = wfirst.getBandpass('J129') base_psf = wfirst.getPSF(bandpass=bp) - PSF与SED做光谱卷积
调用convolve方法时,必须传入Bandpass参数,让GalSim在波长空间完成加权积分:# 生成Bulge对应的SED加权PSF bulge_psf = base_psf.convolve(bulge_sed, bp) # Disk同理 disk_psf = base_psf.convolve(disk_sed, bp)
你之前操作可能踩的坑
- SED未归一化:如果SED通量没调整到合理范围,卷积后PSF的信号会异常,一定要用
withFlux()结合目标Bandpass做归一化 - 波长范围不重叠:检查SED的波长范围和WFIRST Bandpass的波长范围是否有重叠,可以用
print(bp.wave_list)和print(bulge_sed.wave_list)确认 - Bandpass参数传错:
wfirst.getPSF()的bandpass参数必须是完整的Bandpass对象,不能直接传SED,这点很容易搞错
内容的提问来源于stack exchange,提问作者Ashlou
相关产品推荐
相关产品推荐

