def _a_blot_segment_image(self, image_to_blot, tempname, x_excess, y_excess, interp): """Blot the segmentation or other nondrizzled image as if it were assume self.grism_image is always used as the source wcs reference Thats just a simple wrapper around the task blot in astrodrizzle Parameters ---------- image_to_blot: str the input image name, either the grism or direct drizzled image tempname: str the name of the output blotted image Notes ----- exposure time is hard coded to 1 since it was made from the drizzled image and we dont want the id numbers rescaled by the exposure time that was used for blotting """ excess_x = 0 excess_y = 0 # the drizzle coeff information for adriz is taken # from the self.data image # use the current data as reference image input_image = (self.data).split("[")[0] flt_header = fits.getheader(input_image) flt_wcs = HSTWCS(self.data) # check to see if this is a simple fits or MEF and grab # the science information. ftype = fileutil.isFits(self.grism_image_name)[1] if (ftype is 'mef'): grism_wcs = HSTWCS(self.grism_image_name, ext=(str(self.fcube_info["ext_nam"]), self.fcube_info["ext_ver"])) elif (ftype is 'simple'): grism_wcs = HSTWCS(self.grism_image_name) else: return IOError("File type of fits image is not " "supported {0:s}".format(image_to_blot)) ftype = fileutil.isFits(image_to_blot)[1] if (ftype is 'mef'): image_data = fits.getdata(image_to_blot, ext=(str(self.fcube_info["ext_nam"]), self.fcube_info["ext_ver"])) elif (ftype is 'simple'): image_data = fits.getdata(image_to_blot) else: return IOError("Input image is not a supported FITS " "type: {0:s}".format(image_to_blot)) # edit the wcs header information to add any dim_info shifts that we # need the segment image needs to be the same sky area cut without # the added pixels type(x_excess) if x_excess > 0: excess_x = int(flt_wcs.naxis1 + x_excess * 2.) flt_wcs.naxis1 = excess_x crpix = flt_wcs.wcs.crpix newx = int(crpix[0]) + x_excess flt_wcs.wcs.crpix = np.array([newx, crpix[1]]) flt_wcs.sip.crpix[0] = newx if y_excess > 0: excess_y = int(flt_wcs.naxis2 + y_excess * 2.) flt_wcs.naxis2 = excess_y crpix = flt_wcs.wcs.crpix newy = int(crpix[1]) + y_excess flt_wcs.wcs.crpix = np.array([int(crpix[0]), newy]) flt_wcs.sip.crpix[1] = newy # returns a numpy.ndarray which is just the data outimage = astrodrizzle.ablot.do_blot(image_data.astype(np.float32), grism_wcs, flt_wcs, 1., interp=interp, sinscl=1., coeffs=True, wcsmap=None, stepsize=10) # update the flt_header with the flt_wcs information I created flt_header['CRPIX1'] = flt_wcs.wcs.crpix[0] flt_header['CRPIX2'] = flt_wcs.wcs.crpix[1] # if the input flt was an MEF we need to write an MEF out try: newimage = fits.PrimaryHDU() newimage.data = outimage newimage.header = flt_header newimage.header.update(flt_wcs.to_header()) newimage.verify('silentfix') newimage.writeto(tempname) except: raise IOError("Problem writing fits image {0:s}".format(tempname))
def _a_blot_image(self, image_to_blot, tempname, x_excess, y_excess, interp): """ Blot one image. Thats just a simple wrapper around the task blot in astrodrizzle Parameters ---------- image_to_blot: str the input image name, either the grism or direct drizzled image tempname: str the name of the output blotted image """ # the drizzle coeff information for adriz is taken # from the self.data image, excess_x = 0 excess_y = 0 # use the current data as reference image for output # self.data comes from the header of the input grism or flux image # and is one of the input images used to make the drizzled # image_to_blot input_image = (self.data).split("[")[0] bunit = fits.getval(image_to_blot, 'BUNIT') flt_header = fits.getheader(input_image) flt_wcs = HSTWCS(self.data) # now look at the image to blot, this is a drizzled image ftype = fileutil.isFits(image_to_blot)[1] if (ftype == 'mef'): blot_wcs = HSTWCS(image_to_blot, ext=(str(self.fcube_info["ext_nam"]), str(self.fcube_info["ext_ver"]))) image_data = fits.getdata(image_to_blot, extname=str(self.fcube_info["ext_nam"]), extver=int(self.fcube_info["ext_nam"])) elif (ftype is 'simple'): blot_wcs = HSTWCS(image_to_blot) # assume simple image_data = fits.getdata(image_to_blot) else: return IOError("File type of fits image is not " "supported {0:s}".format(image_to_blot)) # edit the wcs header information to add any dim_info shifts that # we need, expanding the size of the output image # make sure this gets saved to the output extension header. # The lambda image will be bigger than the segment image if x_excess > 0: excess_x = int(flt_wcs.naxis1 + x_excess * 2.) flt_wcs.naxis1 = excess_x crpix = flt_wcs.wcs.crpix newx = int(crpix[0]) + x_excess flt_wcs.wcs.crpix = np.array([newx, int(crpix[1])]) flt_wcs.sip.crpix[0] = newx if y_excess > 0: excess_y = int(flt_wcs.naxis2 + y_excess * 2.) flt_wcs.naxis2 = excess_y crpix = flt_wcs.wcs.crpix newy = int(crpix[1]) + y_excess flt_wcs.wcs.crpix = np.array([int(crpix[0]), newy]) flt_wcs.sip.crpix[1] = newy # outimage is just the data array outimage = astrodrizzle.ablot.do_blot(image_data.astype(np.float32), blot_wcs, flt_wcs, 1., interp=interp, sinscl=1., coeffs=True, wcsmap=None, stepsize=10) # update the flt_header with the flt_wcs information I created flt_header['CRPIX1'] = flt_wcs.wcs.crpix[0] flt_header['CRPIX2'] = flt_wcs.wcs.crpix[1] try: newimage = fits.PrimaryHDU() newimage.data = outimage newimage.header = flt_header newimage.header['BUNIT'] = bunit newimage.header.update(flt_wcs.to_header()) newimage.verify('silentfix') newimage.writeto(tempname) except: raise IOError("Problem writing fits image {0:s}".format(tempname))