def interp_band_to_band(img, ref_map, map): map_size = map['signal'].shape ref_size = ref_map['signal'].shape #create a grid of RA/DEC coordinates for image we want to interpolate w = world(map['shead']) #holder for the x, y pixel coordinates that we want. x = np.arange(0, map_size[0]) y = np.arange(0, map_size[1]) xvec = np.repeat(x[:, np.newaxis], map_size[1], axis=1) yvec = np.repeat(y[np.newaxis, :], map_size[0], axis=0) c = pixel_to_skycoord(xvec, yvec, w, origin=0) #this is converting the pixel coords to right ascension and declination in fk4 ra = np.asarray(c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(c.dec.to_string(decimal=True), dtype=float) # reformat map data and coordinates data = np.ravel(img) points = np.column_stack((np.ravel(ra), np.ravel(dec))) #create a agrid of RA/DEC coordinates that we want to interpolate over ref_w = world(ref_map['shead']) ref_grid_x, ref_grid_y = np.mgrid[0:ref_size[0], 0:ref_size[1]] ref_grid_ra, ref_grid_dec = ref_w.wcs_pix2world(ref_grid_x, ref_grid_y, 0) #do the interpolation interp_map = griddata(points, data, (ref_grid_ra, ref_grid_dec), method='linear') return interp_map
def interp_back_to_ref(img, ra, dec, ref_head, ref_shape): ''' Purpose: Perform the inperolation of the completed Planck Map to a reference header Inputs: img - the Planck flux map ra - grid of the Right Ascension values used to create the Planck Map dec - grid of the Decliation values used to create the Planck Map ref_head - the reference header for the interpolatino grid ref_shape - the shape of the interpolation grid ''' map_size = img.shape # reformat map data and coordinates data = np.ravel(img) points = np.column_stack((np.ravel(ra), np.ravel(dec))) #create a agrid of RA/DEC coordinates that we want to interpolate over ref_w = world(ref_head) ref_grid_x, ref_grid_y = np.mgrid[0:ref_shape[0], 0:ref_shape[1]] ref_grid_ra, ref_grid_dec = ref_w.wcs_pix2world(ref_grid_x, ref_grid_y, 0) #do the interpolation interp_map = griddata(points, data, (ref_grid_ra, ref_grid_dec)) final_map = np.swapaxes(interp_map, 0, 1) return final_map, ref_grid_ra, ref_grid_dec
def one_map(name, header, band): if 'CDELT1' in header.keys(): #calculating the pixsize based off of astrometry parameters. pixsize = 3600 * np.mean( [abs(header['CDELT1']), abs(header['CDELT2'])]) #if the given astrometry has CDELT values and not a cd matrix create a cd matrix. header['cd_1'] = header['CDELT1'] header['cd_2'] = 0 header['cd_1'] = 0 header['cd_2'] = header['CDELT2'] else: #if the astrometry is given with a cd matrix calculate the pixsize this way. pixsize = 3600 * \ np.mean([abs(header['CD1_1']+ header['CD2_1']), \ abs(header['CD2_1'] + header['CD2_2'])]) #this is to call IRIS code ra_c = header['crval1'] * u.deg dec_c = header['crval2'] * u.deg cent = [ra_c.value, dec_c.value] coord = SkyCoord(ra=ra_c, dec=dec_c) b1950_coord = coord.transform_to(FK4(equinox='B1950')) ra_c_b = float(b1950_coord.ra.to_string(decimal=True)) dec_c_b = float(b1950_coord.dec.to_string(decimal=True)) #square patch of sky, this can be changed if desired. naxis = [header['naxis1'], header['naxis2']] iris_head = make_header(pixsize, naxis, ra_c_b, dec_c_b) iris_map = mosaic(iris_head, band=4) x = np.arange(0, iris_head['NAXIS1']) y = np.arange(0, iris_head['NAXIS2']) yvec = np.repeat(x[:, np.newaxis], iris_head['NAXIS2'], axis=1) xvec = np.repeat(y[np.newaxis, :], iris_head['NAXIS1'], axis=0) w = world(iris_head) c = pixel_to_skycoord(xvec, yvec, w, origin=0) c = c.transform_to('icrs') #this is converting the pixel coords to right ascension and declination in fk4 ra = np.asarray(c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(c.dec.to_string(decimal=True), dtype=float) iris_interp, r, d = interp_back_to_ref(iris_map, ra.ravel(), dec.ravel(), header) c = 2.99792458e8 #m/s nu = c / clus_get_lambdas(band, center=False) planck, ra, dec, avg_T, avg_beta, avg_tau = create_map(header, nu=nu) planck_head = save_header(header, avg_beta, avg_T, avg_tau, 'Planck_' + band, 'Jy/Beam', cent) return planck, iris_interp, avg_T, avg_beta, avg_tau, planck_head
def mosaic(header, band=4, catname=config.IrisLookupFile, dir=config.IrisDir): ''' purpose: create mosaic of images Inputs : Header - header information -should contain some astrometry information band - the band you wish to look at - 1 : 12 micron - 2 : 25 micron - 3 : 60 micron - 4 : 100 micron (default) catname- filename of the catalog dir - directory where iris maps are Outputs: ''' header.set('NAXIS', 2) w = world(header) try: equinox = header['EQUINOX'] except KeyError: equinox = header['EPOCH'] x_size = header['NAXIS1'] y_size = header['NAXIS2'] print('Handling %s elements' % (x_size * y_size)) x = np.arange(0, x_size) y = np.arange(0, y_size) xlist = np.tile(1, x_size) ylist = np.tile(1, y_size) xmap = np.outer(x, ylist) ymap = np.outer(xlist, y) result = np.zeros((x_size, y_size)) weight = np.zeros((x_size, y_size)) new_c = pixel_to_skycoord(xmap, ymap, w, origin=0) #this is converting the pixel coords to right ascension and declination in fk4 ra = np.asarray(new_c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(new_c.dec.to_string(decimal=True), dtype=float) ctype = get_cord_type(header) if ctype == 2: fk4 = 1 equinox = 1950 #force the equinox to be 1950 in the case of galactic coordinates print('converting from Galactic to Celestial') sk = SkyCoord(ra * u.deg, dec * u.deg, frame=Galactic) new_c = sk.transform_to(FK4) ra = np.asarray(new_c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(new_c.dec.to_string(decimal=True), dtype=float) elif ctype == 3: print('converting from Ecliptic to Celestial') sk = SkyCoord(ra * u.deg, dec * u.deg, frame=BarycentricTrueEcliptic) new_c = sk.transform_to(FK4) ra = [] dec = [] coordinates = new_c.to_string('decimal') ra = np.asarray(new_c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(new_c.dec.to_string(decimal=True), dtype=float) if equinox == 2000.0: print('precessing coordinates from J2000 to B1950') new_c.transform_to(FK4(equinox='B1950')) ra = np.asarray(new_c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(new_c.dec.to_string(decimal=True), dtype=float) ra = nan2undef(ra) dec = nan2undef(dec) ra = np.asarray(ra) dec = np.asarray(dec) #converted these to arrays for easier data manipulation inum, ramin, ramax, raavg, decmin, decmax, decavg, medianval, noise_key = np.loadtxt(catname, unpack=True) numel = int(inum[-1]) #number of entries in the text file print('Checking for ISSA maps that intersect with the given header') ind1 = np.where(ra != -32768)[0] ind2 = np.where(dec != -32768)[0] ind = [] for i in range(ra.shape[0]): for j in range(ra.shape[1]): if ra[i,j] != -32768 and dec[i,j] != -32768: ind.append([i,j]) ind = np.asarray(ind) good_inds = np.zeros(numel) c1min = np.min(ra[ind]) c1max = np.max(ra[ind]) c2min = np.min(dec[ind]) c2max = np.max(dec[ind]) for i in range(numel): if c1min > ramin[i] and c1min < ramax[i] and c2min > decmin[i] and c2min < decmax[i]: good_inds[i] = 1 elif c1min > ramin[i] and c1min < ramax[i] and c2max > decmin[i] and c2max < decmax[i]: good_inds[i] = 1 elif c1max > ramin[i] and c1max < ramax[i] and c2max > decmin[i] and c2max < decmax[i]: good_inds[i] = 1 elif c1max > ramin[i] and c1max < ramax[i] and c2min > decmin[i] and c2min < decmax[i]: good_inds[i] = 1 elif ramin[i] > c1min and ramin[i] < c1max and decmin[i] > c2min and decmin[i] < c2min: good_inds[i] = 1 elif ramax[i] > c1min and ramax[i] < c1max and decmin[i] > c2min and decmin[i] < c2min: good_inds[i] = 1 elif ramin[i] > c1min and ramin[i] < c1max and decmax[i] > c2min and decmax[i] < c2min: good_inds[i] = 1 elif ramax[i] > c1min and ramax[i] < c1max and decmax[i] > c2min and decmax[i] < c2min: good_inds[i] = 1 good_inds = np.where(good_inds > 0)[0] if good_inds.shape[0] == 0: print('No ISSA map corresponds to the header given') exit() print('%s ISSA maps will be combined to produce the mosaic' %(good_inds.shape[0])) for i in range(good_inds.shape[0]): mapi = get_iris(inum[good_inds[i]], dir=dir, band=band) mapi[0].header['EQUINOX'] = 2000.0 try: del(mapi[0].header['NAXIS3']) except KeyError: pass #do the transform back to pixel coords w = world(mapi[0].header) x, y = skycoord_to_pixel(new_c, w, origin=0) tempo = mbilinear(x, y, mapi[0].data) for j in range(tempo.shape[0]): for k in range(tempo.shape[1]): if tempo[j,k] != -32768: weight[j,k] = weight[j,k] + 1 result[j,k] = result[j,k] + tempo[j,k] indw = [] complement = [] for i in range(weight.shape[0]): for j in range(weight.shape[1]): if weight[i,j] > 0: result[i,j] = result[i,j] / weight[i,j] else: result[i,j] = -32768 #because of the way the image gets made it is rotated and flipped along its x-axis #this is a correction to get it to line up with the idl version and does not have any #real effect on its astrometry result = np.rot90(result, k=3) result = np.fliplr(result) #for testing # plt.imshow(result, origin='lower') # plt.show() return result
def read_in_fits(filename, center, ref_head, ref_pixsize=8, ref_mapsize=260): ''' Purpose : This function reads in the fits files for the components and parses them so that we are left with data only for our field. Inputs: filename (str) - the singular filename for a component used in the MBB fit center (float array) - center of the field of interest ref_head (Astropy.header) - header for the reference field ref_pixsize - pixel size of the reference map ref_mapsize - mapsize of the reference map Outputs: map (float array) - an array of flux values at the given field pixsize (float) - pixel size of the uninterpolated component maps x_side (int) - the length of the x-axis of the map y_side (int) - the length of the y-axis of the map RA_grid (float array) - grid of the Right Ascension values used to pull out components DEC_grid (float array) - grid of the Declination values used to pull out components ''' hdul = fits.open(filename) head = hdul[1].header if 'Temperature' in filename: data = hdul[1].data.field('TEMP') error = hdul[1].data.field('ERR_TEMP') elif 'Spectral-Index' in filename: data = hdul[1].data.field('BETA') error = hdul[1].data.field('ERR_BETA') elif 'Opacity' in filename: data = hdul[1].data.field('TAU353') error = hdul[1].data.field('ERR_TAU') else: data = hdul[1].data.field(0) nside = head['NSIDE'] order = head['ORDERING'] hdul.close() #Galactic Coordinate System hp = HEALPix(nside=nside, order=order, frame='galactic') #create a pixel grid in terms of the nu=353 grid for GNILC to create our intensity maps pixsize = hp.pixel_resolution.to(u.arcsecond).value #* 2 is for boosting the size of the map so to fix edge effects from interpolation map_arc_x = ref_mapsize[0] * 2 * ref_pixsize #map size in arcseconds map_arc_y = ref_mapsize[1] * 2 * ref_pixsize npixxside = ceil(map_arc_x / pixsize) #convert to map size in pixels for nu = 353 map. npixyside = ceil(map_arc_y / pixsize) #* 2 is for boosting the size of the map so to fix edge effects from interpolation x = np.linspace(0, ref_mapsize[0] * 2, npixxside) y = np.linspace(0, ref_mapsize[1] * 2, npixyside) X, Y = np.meshgrid(x, y) w = world(ref_head) skycoords = pixel_to_skycoord(X.ravel(), Y.ravel(), wcs=w, origin=0) RA_grid = np.asarray(skycoords.ra.to_string(decimal=True), dtype='float') * u.deg DEC_grid = np.asarray(skycoords.dec.to_string(decimal=True), dtype='float') * u.deg # coords = SkyCoord(RA_grid.ravel(), DEC_grid.ravel(), frame='icrs') coords = SkyCoord(ra=RA_grid.ravel(), dec=DEC_grid.ravel(), frame='icrs') gal_coords = coords.galactic map = hp.interpolate_bilinear_skycoord(gal_coords, data) x_side = len(x) y_side = len(y) return map, pixsize, y_side, x_side, RA_grid, DEC_grid
def mosaic(header, band=4, catname=iris_config.IrisLookupFile, dir=iris_config.IrisDir): ''' purpose: create mosaic of images Inputs : Header - header information -should contain some astrometry information band - the band you wish to look at - 1 : 12 micron - 2 : 25 micron - 3 : 60 micron - 4 : 100 micron (default) catname- filename of the catalog dir - directory where iris maps are Outputs: ''' header.set('NAXIS', 2) w = world(header) try: equinox = header['EQUINOX'] except KeyError: equinox = header['EPOCH'] x_size = header['NAXIS2'] y_size = header['NAXIS1'] print('Handling %s elements' % (x_size * y_size)) x = np.arange(0, x_size) y = np.arange(0, y_size) xlist = np.tile(1, x_size) ylist = np.tile(1, y_size) xmap = np.outer(x, ylist) ymap = np.outer(xlist, y) result = np.zeros((x_size, y_size)) weight = np.zeros((x_size, y_size)) new_c = pixel_to_skycoord(xmap, ymap, w, origin=0) #this is converting the pixel coords to right ascension and declination in fk4 ra = np.asarray(new_c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(new_c.dec.to_string(decimal=True), dtype=float) ctype = get_cord_type(header) ra = nan2undef(ra) dec = nan2undef(dec) ra = np.asarray(ra) dec = np.asarray(dec) #converted these to arrays for easier data manipulation inum, ramin, ramax, raavg, decmin, decmax, decavg, medianval, noise_key = np.loadtxt( catname, unpack=True) numel = int(inum[-1]) #number of entries in the text file print('Checking for ISSA maps that intersect with the given header') ind1 = np.where(ra != -32768)[0] ind2 = np.where(dec != -32768)[0] ind = [] for i in range(ra.shape[0]): for j in range(ra.shape[1]): if ra[i, j] != -32768 and dec[i, j] != -32768: ind.append([i, j]) ind = np.asarray(ind) good_inds = np.zeros(numel) c1min = np.min(ra[ind]) c1max = np.max(ra[ind]) c2min = np.min(dec[ind]) c2max = np.max(dec[ind]) for i in range(numel): if c1min > ramin[i] and c1min < ramax[i] and c2min > decmin[ i] and c2min < decmax[i]: good_inds[i] = 1 elif c1min > ramin[i] and c1min < ramax[i] and c2max > decmin[ i] and c2max < decmax[i]: good_inds[i] = 1 elif c1max > ramin[i] and c1max < ramax[i] and c2max > decmin[ i] and c2max < decmax[i]: good_inds[i] = 1 elif c1max > ramin[i] and c1max < ramax[i] and c2min > decmin[ i] and c2min < decmax[i]: good_inds[i] = 1 elif ramin[i] > c1min and ramin[i] < c1max and decmin[ i] > c2min and decmin[i] < c2min: good_inds[i] = 1 elif ramax[i] > c1min and ramax[i] < c1max and decmin[ i] > c2min and decmin[i] < c2min: good_inds[i] = 1 elif ramin[i] > c1min and ramin[i] < c1max and decmax[ i] > c2min and decmax[i] < c2min: good_inds[i] = 1 elif ramax[i] > c1min and ramax[i] < c1max and decmax[ i] > c2min and decmax[i] < c2min: good_inds[i] = 1 good_inds = np.where(good_inds > 0)[0] if good_inds.shape[0] == 0: print('No ISSA map corresponds to the header given') exit() print('%s ISSA maps will be combined to produce the mosaic' % (good_inds.shape[0])) for i in range(good_inds.shape[0]): mapi = get_iris(inum[good_inds[i]], dir=dir, band=band) try: del (mapi[0].header['NAXIS3']) except KeyError: pass #do the transform back to pixel coords w = world(mapi[0].header) x, y = skycoord_to_pixel(new_c, w, origin=0) tempo = mbilinear(x, y, mapi[0].data) for j in range(tempo.shape[0]): for k in range(tempo.shape[1]): if tempo[j, k] != -32768: weight[j, k] = weight[j, k] + 1 result[j, k] = result[j, k] + tempo[j, k] indw = [] complement = [] for i in range(weight.shape[0]): for j in range(weight.shape[1]): if weight[i, j] > 0: result[i, j] = result[i, j] / weight[i, j] else: result[i, j] = -32768 #in interpolating the image the x and y axes get flipped. result = np.swapaxes(result, 0, 1) if band == 4: result -= 0.65 #subtract CIB to get just dgl / cirrus return result
pixsize = 0.0250000000000 #pixels / arcsecond of observation to interpolate IRIS # maps to. naxis = 22 name = 'rxj1347' #square patch of sky, this can be changed if desired. naxis1 = naxis2 = naxis y = np.arange(0, naxis1) x = np.arange(0, naxis2) yvec = np.repeat(x[:, np.newaxis], naxis2, axis=1) xvec = np.repeat(y[np.newaxis, :], naxis1, axis=0) head = make_header(pixsize, naxis, ra_c_b, dec_c_b) #this function assumes a square. w = world(head) c = pixel_to_skycoord(xvec, yvec, w, origin=0) c = c.transform_to('icrs') #this is converting the pixel coords to right ascension and declination in fk4 ra = np.asarray(c.ra.to_string(decimal=True), dtype=float) dec = np.asarray(c.dec.to_string(decimal=True), dtype=float) #get information from the IRAS astrometry positions map = mosaic(head, band=4) hdu = fits.PrimaryHDU(map, head) hdul = fits.HDUList([hdu]) hdul.writeto(config.DataDir + 'iris_0' + name + '_fx.fits') #ra hdu = fits.PrimaryHDU(ra, head)