diff --git a/resolve/ubik_tools/plot_polarization.py b/resolve/ubik_tools/plot_polarization.py index 204406e158fd5cbbfc03b2fbc9a3a37b9719de18..89168a6c54d7bdcd33cbf8c901de4ad18c127224 100644 --- a/resolve/ubik_tools/plot_polarization.py +++ b/resolve/ubik_tools/plot_polarization.py @@ -139,7 +139,7 @@ def _extent(sdom, offset=None): return [-xlim+ox, xlim+ox, -ylim+oy, ylim+oy] -def polarization_quiver(ax, sky_field, nquivers=100, pfrac=0.001): +def polarization_quiver(ax, sky_field, nquivers=100, pfrac=0.001, vmin=None, vmax=None): assert_sky_domain(sky_field.domain) pdom, tdom, fdom, sdom = sky_field.domain assert all((pol in pdom.labels) for pol in ["I", "Q", "U"]) @@ -147,7 +147,7 @@ def polarization_quiver(ax, sky_field, nquivers=100, pfrac=0.001): ang = polarization_angle(sky_field).val[0, 0] lin = linear_polarization(sky_field).val[0, 0] - im = ax.imshow(lin.T, cmap="inferno", norm=LogNorm(), origin="lower", + im = ax.imshow(lin.T, cmap="inferno", norm=LogNorm(vmin=vmin, vmax=vmax), origin="lower", extent=_extent(sdom)) scale = np.max(lin)*max(lin.shape) * 5 @@ -169,6 +169,24 @@ def polarization_quiver(ax, sky_field, nquivers=100, pfrac=0.001): scale=1.1/dst/skip, scale_units="xy", alpha=.6, ) + plt.colorbar(im, ax=ax, orientation="horizontal", label="Linear polarized flux [Jy/sr]") + + +def polarized_fraction(ax, sky_field, pfrac=0.001, vmax=None): + assert_sky_domain(sky_field.domain) + pdom, tdom, fdom, sdom = sky_field.domain + assert all((pol in pdom.labels) for pol in ["I", "Q", "U"]) + assert tdom.size == fdom.size == 1 + lin = linear_polarization(sky_field).val[0, 0] + total_int = sky_field.val[pdom.label2index("I"), 0, 0] + + frac = lin/total_int + frac = np.ma.masked_where(lin < pfrac * np.max(lin), frac) + + im = ax.imshow(frac.T, cmap="viridis_r", origin="lower", vmin=0, vmax=vmax, + extent=_extent(sdom)) + + plt.colorbar(im, ax=ax, orientation="horizontal", label="Polarized fraction [1]") def polarization_angle(sky_field, faradaycorrection=0): diff --git a/resolve/weighting_model.py b/resolve/weighting_model.py index e6c09495cfbe0152cb70d2f7210eb1cea29cf484..486a6000b08c278e2c6b5f86e3df11fb4ead99da 100644 --- a/resolve/weighting_model.py +++ b/resolve/weighting_model.py @@ -77,11 +77,10 @@ def log_weighting_model(cfg, obs, sky_domain): tmpop.append(foo.ducktape(key).ducktape_left(key)) linear_interpolation = reduce(add, tmpop) restructure = _CustomRestructure(linear_interpolation.target, oo.vis.domain) - ift.extra.check_linear_operator(restructure) tmpop = (restructure @ linear_interpolation @ log_weights).scale(-2) if oo.is_single_precision(): tmpop = DtypeConverter(tmpop.target, np.float64, np.float32) @ tmpop - tmpop = ift.Adder(oo.weight.log()) @ tmpop + tmpop = ift.Adder(_log_if_not_zero(oo.weight)) @ tmpop op.append(tmpop) return op, additional if cfg["model"] == "independent gamma": @@ -126,3 +125,9 @@ class _CustomRestructure(ift.LinearOperator): for ii in range(self.target.shape[2]): res[_polfreq_key(pp, ii)] = x[pp, :, ii] return ift.makeField(self._tgt(mode), res) + + +def _log_if_not_zero(fld): + res = fld.log().val_rw() + res[fld.val == 0.] = 0. + return ift.makeField(fld.domain, res)