예제 #1
0
    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
예제 #2
0
파일: ellipse.py 프로젝트: SKIRT/PTS
    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)
예제 #3
0
    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
예제 #4
0
    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)
예제 #5
0
    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)