def get_kernel(self, data, subkernel=True): indep, dep, kshape, lo, hi = self._get_kernel_data(data, subkernel) # Use kernel data set WCS if available eqpos = getattr(self.kernel, 'eqpos', None) sky = getattr(self.kernel, 'sky', None) # If kernel is a model, use WCS from data if available if callable(self.kernel): eqpos = getattr(data, 'eqpos', None) sky = getattr(data, 'sky', None) dataset = None ndim = len(kshape) if ndim == 1: dataset = Data1D('kernel', indep[0], dep) elif ndim == 2: # Edit WCS to reflect the subkernel extraction in # physical coordinates. if (subkernel and sky is not None and lo is not None and hi is not None): if (WCS is not None): sky = WCS(sky.name, sky.type, sky.crval, sky.crpix - lo, sky.cdelt, sky.crota, sky.epoch, sky.equinox) # FIXME: Support for WCS only (non-Chandra) coordinate # transformations? dataset = DataIMG('kernel', indep[0], indep[1], dep, kshape[::-1], sky=sky, eqpos=eqpos) else: raise PSFErr('ndim') return dataset
def get_image_data(arg, make_copy=True, fix_type=True): """ get_image_data ( filename [, make_copy=True, fix_type=True ]) get_image_data ( IMAGECrate [, make_copy=True, fix_type=True ]) """ filename = '' close_dataset = False if type(arg) == str: img = open_crate(arg) if not isinstance(img, pycrates.IMAGECrate): # ??????????????????????????????????######## dtn close_crate_dataset(img.get_dataset()) # ??????????????????????????????????######## dtn raise IOErr('badfile', arg, "IMAGECrate obj") filename = arg close_dataset = True elif isinstance(arg, pycrates.IMAGECrate): img = arg filename = arg.get_filename() make_copy = False else: raise IOErr('badfile', arg, "IMAGECrate obj") data = {} data['y'] = _require_image(img, make_copy, fix_type) sky = None skynames = ['SKY', 'sky', 'pos', 'POS'] names = img.get_axisnames() # find the SKY name using the set intersection inter = list(set(names) & set(skynames)) if inter: sky = img.get_transform(inter[0]) wcs = None if 'EQPOS' in names: wcs = img.get_transform('EQPOS') if sky is not None and transformstatus: linear = pycrates.WCSTANTransform() linear.set_name("LINEAR") linear.set_transform_matrix(sky.get_transform_matrix()) cdelt = numpy.array(linear.get_parameter_value('CDELT')) crpix = numpy.array(linear.get_parameter_value('CRPIX')) crval = numpy.array(linear.get_parameter_value('CRVAL')) data['sky'] = WCS('physical', 'LINEAR', crval, crpix, cdelt) if wcs is not None and transformstatus: cdelt = numpy.array(wcs.get_parameter_value('CDELT')) crpix = numpy.array(wcs.get_parameter_value('CRPIX')) crval = numpy.array(wcs.get_parameter_value('CRVAL')) crota = SherpaFloat(wcs.get_parameter_value('CROTA')) equin = SherpaFloat(wcs.get_parameter_value('EQUINOX')) epoch = SherpaFloat(wcs.get_parameter_value('EPOCH')) data['eqpos'] = WCS('world', 'WCS', crval, crpix, cdelt, crota, epoch, equin) data['header'] = _get_meta_data(img) keys = [ 'MTYPE1', 'MFORM1', 'CTYPE1P', 'CTYPE2P', 'WCSNAMEP', 'CDELT1P', 'CDELT2P', 'CRPIX1P', 'CRPIX2P', 'CRVAL1P', 'CRVAL2P', 'MTYPE2', 'MFORM2', 'CTYPE1', 'CTYPE2', 'CDELT1', 'CDELT2', 'CRPIX1', 'CRPIX2', 'CRVAL1', 'CRVAL2', 'CUNIT1', 'CUNIT2', 'EQUINOX' ] # 'WCSTY1P', 'WCSTY2P'] for key in keys: try: data['header'].pop(key) except KeyError: pass if close_dataset: close_crate_dataset(img.get_dataset()) return data, filename
def get_image_data(arg, make_copy=False): """ arg is a filename or a HDUList object """ hdu, filename = _get_file_contents(arg) # FITS uses logical-to-world where we use physical-to-world. # For all transforms, update their physical-to-world # values from their logical-to-world values. # Find the matching physical transform # (same axis no, but sub = 'P' ) # and use it for the update. # Physical tfms themselves do not get updated. # # Fill the physical-to-world transform given the # logical-to-world and the associated logical-to-physical. # W = wv + wd * ( P - wp ) # P = pv + pd * ( L - pp ) # W = lv + ld * ( L - lp ) # Then # L = pp + ( P - pv ) / pd # so W = lv + ld * ( pp + (P-pv)/pd - lp ) # = lv + ( ld / pd ) * ( P - [ pv + (lp-pp)*pd ] ) # Hence # wv = lv # wd = ld / pd # wp = pv + ( lp - pp ) * pd # EG suppose phys-to-world is # W = 1000 + 2.0 * ( P - 4.0 ) # and we bin and scale to generate a logical-to-phys of # P = 20 + 4.0 * ( L - 10 ) # Then # W = 1000 + 2.0 * ( (20-4) - 4 * 10 ) + 2 * 4 $ # try: data = {} img = hdu[0] if hdu[0].data is None: img = hdu[1] if hdu[1].data is None: raise IOErr('badimg', '') data['y'] = numpy.asarray(img.data) cdeltp = _get_wcs_key(img, 'CDELT1P', 'CDELT2P') crpixp = _get_wcs_key(img, 'CRPIX1P', 'CRPIX2P') crvalp = _get_wcs_key(img, 'CRVAL1P', 'CRVAL2P') cdeltw = _get_wcs_key(img, 'CDELT1', 'CDELT2') crpixw = _get_wcs_key(img, 'CRPIX1', 'CRPIX2') crvalw = _get_wcs_key(img, 'CRVAL1', 'CRVAL2') # proper calculation of cdelt wrt PHYSICAL coords if (isinstance(cdeltw, numpy.ndarray) and isinstance(cdeltp, numpy.ndarray)): cdeltw = cdeltw / cdeltp # proper calculation of crpix wrt PHYSICAL coords if (isinstance(crpixw, numpy.ndarray) and isinstance(crvalp, numpy.ndarray) and isinstance(cdeltp, numpy.ndarray) and isinstance(crpixp, numpy.ndarray)): crpixw = crvalp + (crpixw - crpixp) * cdeltp sky = None if (transformstatus and isinstance(cdeltp, numpy.ndarray) and isinstance(crpixp, numpy.ndarray) and isinstance(crvalp, numpy.ndarray)): sky = WCS('physical', 'LINEAR', crvalp, crpixp, cdeltp) eqpos = None if (transformstatus and isinstance(cdeltw, numpy.ndarray) and isinstance(crpixw, numpy.ndarray) and isinstance(crvalw, numpy.ndarray)): eqpos = WCS('world', 'WCS', crvalw, crpixw, cdeltw) data['sky'] = sky data['eqpos'] = eqpos data['header'] = _get_meta_data(img) keys = [ 'MTYPE1', 'MFORM1', 'CTYPE1P', 'CTYPE2P', 'WCSNAMEP', 'CDELT1P', 'CDELT2P', 'CRPIX1P', 'CRPIX2P', 'CRVAL1P', 'CRVAL2P', 'MTYPE2', 'MFORM2', 'CTYPE1', 'CTYPE2', 'CDELT1', 'CDELT2', 'CRPIX1', 'CRPIX2', 'CRVAL1', 'CRVAL2', 'CUNIT1', 'CUNIT2', 'EQUINOX' ] for key in keys: try: data['header'].pop(key) except KeyError: pass finally: hdu.close() return data, filename
def get_image_data(arg, make_copy=False): """ get_image_data( filename [, make_copy=False ]) get_image_data( [PrimaryHDU] [, make_copy=False ]) """ filename = '' if type(arg) == str and is_binary_file(arg): hdu = pyfits.open(arg) filename = arg elif ( (type(arg) is pyfits.HDUList) and (len(arg) > 0 ) and (arg[0].__class__ is pyfits.PrimaryHDU) ): hdu = arg filename = hdu[0]._file.name else: raise IOErr('badfile', arg, "a binary FITS file or a PyFITS.PrimaryHDU list") # FITS uses logical-to-world where we use physical-to-world. # For all transforms, update their physical-to-world # values from their logical-to-world values. # Find the matching physical transform # (same axis no, but sub = 'P' ) # and use it for the update. # Physical tfms themselves do not get updated. # # Fill the physical-to-world transform given the # logical-to-world and the associated logical-to-physical. # W = wv + wd * ( P - wp ) # P = pv + pd * ( L - pp ) # W = lv + ld * ( L - lp ) # Then # L = pp + ( P - pv ) / pd # so W = lv + ld * ( pp + (P-pv)/pd - lp ) # = lv + ( ld / pd ) * ( P - [ pv + (lp-pp)*pd ] ) # Hence # wv = lv # wd = ld / pd # wp = pv + ( lp - pp ) * pd # EG suppose phys-to-world is # W = 1000 + 2.0 * ( P - 4.0 ) # and we bin and scale to generate a logical-to-phys of # P = 20 + 4.0 * ( L - 10 ) # Then # W = 1000 + 2.0 * ( (20-4) - 4 * 10 ) + 2 * 4 $ # try: data = {} img = hdu[0] if hdu[0].data is None: img = hdu[1] if hdu[1].data is None: raise IOErr('badimg', '') data['y'] = numpy.asarray(img.data) cdeltp = _get_wcs_key(img, 'CDELT1P', 'CDELT2P') crpixp = _get_wcs_key(img, 'CRPIX1P', 'CRPIX2P') crvalp = _get_wcs_key(img, 'CRVAL1P', 'CRVAL2P') cdeltw = _get_wcs_key(img, 'CDELT1', 'CDELT2') crpixw = _get_wcs_key(img, 'CRPIX1', 'CRPIX2') crvalw = _get_wcs_key(img, 'CRVAL1', 'CRVAL2') # proper calculation of cdelt wrt PHYSICAL coords if (( cdeltw != () ) and ( cdeltp != () ) ): cdeltw = cdeltw/cdeltp # proper calculation of crpix wrt PHYSICAL coords if (( crpixw != () ) and ( crvalp != () ) and ( cdeltp != () ) and ( crpixp != () ) ): crpixw = crvalp + ( crpixw - crpixp ) * cdeltp sky = None if(cdeltp != () and crpixp != () and crvalp != () and transformstatus): sky = WCS('physical', 'LINEAR', crvalp, crpixp, cdeltp) eqpos = None if(cdeltw != () and crpixw != () and crvalw != () and transformstatus): eqpos = WCS('world', 'WCS', crvalw, crpixw, cdeltw) data['sky'] = sky data['eqpos'] = eqpos data['header'] = _get_meta_data(img) keys = ['MTYPE1','MFORM1','CTYPE1P','CTYPE2P','WCSNAMEP','CDELT1P', 'CDELT2P','CRPIX1P','CRPIX2P','CRVAL1P','CRVAL2P', 'MTYPE2','MFORM2','CTYPE1','CTYPE2','CDELT1','CDELT2','CRPIX1', 'CRPIX2','CRVAL1','CRVAL2','CUNIT1','CUNIT2','EQUINOX'] for key in keys: try: data['header'].pop(key) except KeyError: pass finally: hdu.close() return data, filename