def create_patches(self): """ This function ... :return: """ colors = iter(pretty_colors) # Loop over the geometries for label in self.geometries: geometry = self.geometries[label] x_center = 0.0 y_center = 0.0 major = None # 2 * major axis radius minor = None # 2 * minor axis radius angle = None # in degrees if isinstance(geometry, SersicModel3D): major = 2.0 * geometry.effective_radius.to("pc").value minor = geometry.z_flattening * major angle = geometry.tilt.to("deg").value elif isinstance(geometry, ExponentialDiskModel3D): major = 2.0 * geometry.radial_scale.to("pc").value minor = 2.0 * geometry.axial_scale.to("pc").value angle = geometry.tilt.to("deg").value elif isinstance(geometry, DeprojectionModel3D): minor = 2.0 * geometry.scale_height.to("pc").value major = 0.3 * (geometry.pixelscale * geometry.x_size).to("pc").value angle = 0.0 if self._min_x is None or 0.5 * major > abs(self._min_x): self._min_x = -0.5 * major if self._max_x is None or 0.5 * major > self._max_x: self._max_x = 0.5 * major if self._min_y is None or 0.5 * minor > abs(self._min_y): self._min_y = -0.5 * minor if self._max_y is None or 0.5 * minor > self._max_y: self._max_y = 0.5 * minor # Create the patch color = next(colors) ell = plt_Ellipse((x_center, y_center), major, minor, angle, edgecolor='none', facecolor=color, lw=3, alpha=0.7) # Add the patch self.patches[label] = ell
def to_mpl_patch(self): """ This function ... :return: """ from matplotlib.patches import Ellipse as plt_Ellipse return plt_Ellipse((self.center.x, self.center.y), 2.0 * self.radius.x, 2.0 * self.radius.y, self.angle.to("deg").value, edgecolor="red", facecolor="none", lw=5)
def create_patches(self): """ This function ... :return: """ colors = iter(pretty_colors) # Loop over the geometries for label in self.geometries: geometry = self.geometries[label] x_center = 0.0 y_center = 0.0 major = None # 2 * major axis radius minor = None # 2 * minor axis radius angle = None # in degrees if isinstance(geometry, SersicModel3D): major = 2.0 * geometry.effective_radius.to("pc").value minor = geometry.z_flattening * major angle = geometry.tilt.to("deg").value elif isinstance(geometry, ExponentialDiskModel3D): major = 2.0 * geometry.radial_scale.to("pc").value minor = 2.0 * geometry.axial_scale.to("pc").value angle = geometry.tilt.to("deg").value elif isinstance(geometry, DeprojectionModel3D): minor = 2.0 * geometry.scale_height.to("pc").value major = 0.3 * (geometry.pixelscale * geometry.x_size).to("pc").value angle = 0.0 if self._min_x is None or 0.5*major > abs(self._min_x): self._min_x = - 0.5*major if self._max_x is None or 0.5*major > self._max_x: self._max_x = 0.5*major if self._min_y is None or 0.5*minor > abs(self._min_y): self._min_y = - 0.5*minor if self._max_y is None or 0.5*minor > self._max_y: self._max_y = 0.5*minor # Create the patch color = next(colors) ell = plt_Ellipse((x_center, y_center), major, minor, angle, edgecolor='none', facecolor=color, lw=3, alpha=0.7) # Add the patch self.patches[label] = ell
def add_source(self, source): """ This function ... :param source: :return: """ # Create buffer and figure buf = io.BytesIO() fig = plt.figure(figsize=(15, 15)) # Add first subplot ax = fig.add_subplot(2, 3, 1) # Plot the frame (before removal) norm = ImageNormalize(stretch=LogStretch()) norm_residual = ImageNormalize(stretch=LogStretch()) min_value = np.nanmin(self.frame) max_value = 0.5 * (np.nanmax(self.frame) + min_value) ax.imshow(self.frame, origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) r = plt_Rectangle((source.x_min, source.y_min), source.xsize, source.ysize, edgecolor="yellow", facecolor="none", lw=5) ax.add_patch(r) if isinstance(self.principal_shape, PixelEllipseRegion): ell = plt_Ellipse( (self.principal_shape.center.x, self.principal_shape.center.y), 2.0 * self.principal_shape.radius.x, 2.0 * self.principal_shape.radius.y, self.principal_shape.angle.to("deg").value, edgecolor="red", facecolor="none", lw=5) ax.add_patch(ell) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the second subplot ax = fig.add_subplot(2, 3, 2) frame_xsize = self.frame.xsize frame_ysize = self.frame.ysize new_xmin = int(source.center.x - 0.1 * frame_xsize) new_xmax = int(source.center.x + 0.1 * frame_xsize) new_ymin = int(source.center.y - 0.1 * frame_ysize) new_ymax = int(source.center.y + 0.1 * frame_ysize) if new_xmin < 0: new_xmin = 0 if new_ymin < 0: new_ymin = 0 if new_xmax > frame_xsize: new_xmax = frame_xsize if new_ymax > frame_ysize: new_ymax = frame_ysize ax.imshow(self.frame[new_ymin:new_ymax, new_xmin:new_xmax], origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) r = plt_Rectangle((source.x_min - new_xmin, source.y_min - new_ymin), source.xsize, source.ysize, edgecolor="yellow", facecolor="none", lw=5) ax.add_patch(r) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the third subplot ax = fig.add_subplot(2, 3, 3) # Adapt the mask self.mask[source.y_slice, source.x_slice] += source.mask # Plot the mask # ax.imshow(self.mask[new_ymin:new_ymax, new_xmin:new_xmax], origin="lower", cmap='Greys') ax.imshow(self.mask, origin="lower", cmap="Greys") ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the fourth subplot ax = fig.add_subplot(2, 3, 4) # Plot the source cutout # ax.imshow(source.cutout, origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) ax.imshow(np.ma.MaskedArray(source.cutout, mask=source.background_mask), origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # ell = plt_Ellipse((source.center.x-source.x_min, source.center.y-source.y_min), 2.0*source.radius.x, 2.0*source.radius.y, edgecolor="yellow", facecolor="none", lw=5) # ax.add_patch(ell) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the fourth subplot ax = fig.add_subplot(2, 3, 5) # Plot the source background # ax.imshow(np.ma.MaskedArray(source.cutout, mask=source.mask), origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) new_cutout = source.cutout.copy() new_cutout[source.mask] = source.background[source.mask] ax.imshow(new_cutout, origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) # ell = plt_Ellipse((source.center.x-source.x_min, source.center.y-source.y_min), 2.0 * source.radius.x, 2.0 * source.radius.y, edgecolor="yellow", facecolor="none", lw=5) # ax.add_patch(ell) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the sixth subplot ax = fig.add_subplot(2, 3, 6) # Plot the residual cutout (background removed) ax.imshow(source.subtracted, origin="lower", interpolation="nearest", vmin=0.0, vmax=max_value, norm=norm_residual) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.tight_layout() plt.savefig(buf, format="png") plt.close() buf.seek(0) im = imageio.imread(buf) buf.close() self.add_frame(im)
def add_source(self, source): """ This function ... :param source: :return: """ # Create buffer and figure buf = io.BytesIO() fig = plt.figure(figsize=(15, 15)) # Add first subplot ax = fig.add_subplot(2, 3, 1) # Plot the frame (before removal) norm = ImageNormalize(stretch=LogStretch()) norm_residual = ImageNormalize(stretch=LogStretch()) min_value = np.nanmin(self.frame) max_value = 0.5 * (np.nanmax(self.frame) + min_value) ax.imshow(self.frame, origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) r = plt_Rectangle((source.x_min, source.y_min), source.xsize, source.ysize, edgecolor="yellow", facecolor="none", lw=5) ax.add_patch(r) if isinstance(self.principal_shape, Ellipse): ell = plt_Ellipse((self.principal_shape.center.x, self.principal_shape.center.y), 2.0 * self.principal_shape.radius.x, 2.0 * self.principal_shape.radius.y, self.principal_shape.angle.to("deg").value, edgecolor="red", facecolor="none", lw=5) ax.add_patch(ell) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the second subplot ax = fig.add_subplot(2, 3, 2) frame_xsize = self.frame.xsize frame_ysize = self.frame.ysize new_xmin = int(source.center.x - 0.1 * frame_xsize) new_xmax = int(source.center.x + 0.1 * frame_xsize) new_ymin = int(source.center.y - 0.1 * frame_ysize) new_ymax = int(source.center.y + 0.1 * frame_ysize) if new_xmin < 0: new_xmin = 0 if new_ymin < 0: new_ymin = 0 if new_xmax > frame_xsize: new_xmax = frame_xsize if new_ymax > frame_ysize: new_ymax = frame_ysize ax.imshow(self.frame[new_ymin:new_ymax, new_xmin:new_xmax], origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) r = plt_Rectangle((source.x_min - new_xmin, source.y_min - new_ymin), source.xsize, source.ysize, edgecolor="yellow", facecolor="none", lw=5) ax.add_patch(r) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the third subplot ax = fig.add_subplot(2, 3, 3) # Adapt the mask self.mask[source.y_slice, source.x_slice] += source.mask # Plot the mask # ax.imshow(self.mask[new_ymin:new_ymax, new_xmin:new_xmax], origin="lower", cmap='Greys') ax.imshow(self.mask, origin="lower", cmap="Greys") ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the fourth subplot ax = fig.add_subplot(2, 3, 4) # Plot the source cutout # ax.imshow(source.cutout, origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) ax.imshow(np.ma.MaskedArray(source.cutout, mask=source.background_mask), origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # ell = plt_Ellipse((source.center.x-source.x_min, source.center.y-source.y_min), 2.0*source.radius.x, 2.0*source.radius.y, edgecolor="yellow", facecolor="none", lw=5) # ax.add_patch(ell) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the fourth subplot ax = fig.add_subplot(2, 3, 5) # Plot the source background # ax.imshow(np.ma.MaskedArray(source.cutout, mask=source.mask), origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) new_cutout = source.cutout.copy() new_cutout[source.mask] = source.background[source.mask] ax.imshow(new_cutout, origin="lower", interpolation="nearest", vmin=min_value, vmax=max_value, norm=norm) # ell = plt_Ellipse((source.center.x-source.x_min, source.center.y-source.y_min), 2.0 * source.radius.x, 2.0 * source.radius.y, edgecolor="yellow", facecolor="none", lw=5) # ax.add_patch(ell) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # Add the sixth subplot ax = fig.add_subplot(2, 3, 6) # Plot the residual cutout (background removed) ax.imshow(source.subtracted, origin="lower", interpolation="nearest", vmin=0.0, vmax=max_value, norm=norm_residual) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.tight_layout() plt.savefig(buf, format="png") plt.close() buf.seek(0) im = imageio.imread(buf) buf.close() self.add_frame(im)