def remove_continuum_blockvisibility(vis: BlockVisibility, degree=1, mask=None) -> BlockVisibility:
""" Fit and remove continuum visibility
Fit a polynomial in frequency of the specified degree where mask is True
:param vis:
:param degree: Degree of polynomial
:param mask:
:return:
"""
assert isinstance(vis, Visibility) or isinstance(vis, BlockVisibility), vis
if mask is not None:
assert numpy.sum(mask) > 2 * degree, "Insufficient channels for fit"
nchan = len(vis.frequency)
x = (vis.frequency - vis.frequency[nchan // 2]) / (vis.frequency[0] - vis.frequency[nchan // 2])
for row in range(vis.nvis):
for ant2 in range(vis.nants):
for ant1 in range(vis.nants):
for pol in range(vis.polarisation_frame.npol):
wt = numpy.sqrt(vis.data['weight'][row, ant2, ant1, :, pol])
if mask is not None:
wt[mask] = 0.0
fit = numpy.polyfit(x, vis.data['vis'][row, ant2, ant1, :, pol], w=wt, deg=degree)
prediction = numpy.polyval(fit, x)
vis.data['vis'][row, ant2, ant1, :, pol] -= prediction
return vis
operations.py 文件源码
python
阅读 43
收藏 0
点赞 0
评论 0
评论列表
文章目录