def _project_reference_hdu(self, name_hdr, muse_hdu=None): """Project the reference image onto the MUSE field """ if self.use_montage: # The original way. Sometimes this introduces an offset hdu_repr = montage.reproject_hdu(self.reference_hdu, header=name_hdr, exact_size=True) else: # The mpdaf way if muse_hdu is not None: wcs_ref = WCS(hdr=self.reference_hdu.header) ima_ref = Image(data=self.reference_hdu.data, wcs=wcs_ref) wcs_muse = WCS(hdr=muse_hdu.header) ima_muse = Image(data=muse_hdu.data, wcs=wcs_muse) ima_ref = ima_ref.align_with_image(ima_muse) hdu_repr = ima_ref.get_data_hdu() else: hdu_repre = None print( "Warning: provide target HDU when not using montage to reproject" ) return hdu_repr
def rotate_cube_wcs(cube_name, cube_folder="", outwcs_folder=None, rotangle=0., **kwargs): """Routine to remove potential Nan around an image and reconstruct an optimal WCS reference image. The rotation angle is provided as a way to optimise the extent of the output image, removing Nan along X and Y at that angle. Args: cube_name (str): input image name. No default. cube_folder (str): input image folder [''] outwcs_folder (str): folder where to write the output frame. Default is None which means that it will use the folder of the input image. rotangle (float): rotation angle in degrees [0] **kwargs: in_suffix (str): in suffix to remove from name ['prealign'] out_suffix (str): out suffix to add to name ['rotwcs'] margin_factor (float): factor to extend the image [1.1] Returns: """ # Reading the input names and setting output folder fullname = joinpath(cube_folder, cube_name) cube_folder, cube_name = os.path.split(fullname) if outwcs_folder is None: outwcs_folder = cube_folder # Suffix in_suffix = kwargs.pop("in_suffix", "prealign") out_suffix = kwargs.pop("out_suffix", "rotwcs") # Get margin if needed margin_factor = kwargs.pop("margin_factor", 1.1) extend_fraction = np.maximum(0., (margin_factor - 1.)) upipe.print_info("Will use a {:5.2f}% extra margin".format( extend_fraction * 100.)) # Opening the image via mpdaf cubewcs = Cube(fullname) imawcs = cubewcs.sum(axis=0) extra_pixels = (np.array(imawcs.shape) * extend_fraction).astype(np.int) # New dimensions and extend current image new_dim = tuple(np.array(imawcs.shape).astype(np.int) + extra_pixels) ima_ext = imawcs.regrid(newdim=new_dim, refpos=imawcs.get_start(), refpix=tuple(extra_pixels / 2.), newinc=imawcs.get_step()[0] * 3600.) # Copy and rotate WCS new_wcs = copy.deepcopy(ima_ext.wcs) upipe.print_info( "Rotating spatial WCS of Cube by {} degrees".format(rotangle)) new_wcs.rotate(rotangle) # New rotated image ima_rot = Image(data=np.nan_to_num(ima_ext.data), wcs=new_wcs) # Then resample the image using the initial one as your reference ima_rot_resampled = ima_rot.align_with_image(ima_ext, flux=True) # Crop NaN ima_rot_resampled.crop() # get the new header with wcs and rotate back finalwcs = ima_rot_resampled.wcs finalwcs.rotate(-rotangle) # create the final image data_cube_rot = np.repeat(ima_rot_resampled[np.newaxis, :, :].data, cubewcs.shape[0], axis=0) final_rot_cube = Cube(data=data_cube_rot, wave=cubewcs.wave, wcs=finalwcs) # Save image if isinstance(in_suffix, str) and in_suffix != "" and in_suffix in cube_name: out_name = cube_name.replace(in_suffix, out_suffix) else: name, extension = os.path.splitext(cube_name) if out_suffix != "": out_suffix = "_{}".format(out_suffix) out_name = "{0}{1}{2}".format(name, out_suffix, extension) # write output final_rot_cube.write(joinpath(outwcs_folder, out_name)) return outwcs_folder, out_name