def ccds_touching_wcs(targetwcs, T, ccdrad=0.17, polygons=True): ''' targetwcs: wcs object describing region of interest T: fits_table object of CCDs ccdrad: radius of CCDs, in degrees. Default 0.17 is for DECam. #If None, computed from T. Returns: index array I of CCDs within range. ''' trad = targetwcs.radius() if ccdrad is None: ccdrad = max(np.sqrt(np.abs(T.cd1_1 * T.cd2_2 - T.cd1_2 * T.cd2_1)) * np.hypot(T.width, T.height) / 2.) rad = trad + ccdrad #r,d = targetwcs.crval r,d = targetwcs.radec_center() #print len(T), 'ccds' #print 'trad', trad, 'ccdrad', ccdrad I = np.flatnonzero(np.abs(T.dec - d) < rad) #print 'Cut to', len(I), 'on Dec' I = I[degrees_between(T.ra[I], T.dec[I], r, d) < rad] #print 'Cut to', len(I), 'on RA,Dec' if not polygons: return I # now check actual polygon intersection tw,th = targetwcs.imagew, targetwcs.imageh targetpoly = [(0.5,0.5),(tw+0.5,0.5),(tw+0.5,th+0.5),(0.5,th+0.5)] cd = targetwcs.get_cd() tdet = cd[0]*cd[3] - cd[1]*cd[2] #print 'tdet', tdet if tdet > 0: targetpoly = list(reversed(targetpoly)) targetpoly = np.array(targetpoly) keep = [] for i in I: W,H = T.width[i],T.height[i] wcs = Tan(*[float(x) for x in [T.crval1[i], T.crval2[i], T.crpix1[i], T.crpix2[i], T.cd1_1[i], T.cd1_2[i], T.cd2_1[i], T.cd2_2[i], W, H]]) cd = wcs.get_cd() wdet = cd[0]*cd[3] - cd[1]*cd[2] #print 'wdet', wdet poly = [] for x,y in [(0.5,0.5),(W+0.5,0.5),(W+0.5,H+0.5),(0.5,H+0.5)]: rr,dd = wcs.pixelxy2radec(x,y) ok,xx,yy = targetwcs.radec2pixelxy(rr,dd) poly.append((xx,yy)) if wdet > 0: poly = list(reversed(poly)) poly = np.array(poly) if polygons_intersect(targetpoly, poly): keep.append(i) I = np.array(keep) #print 'Cut to', len(I), 'on polygons' return I
def ccds_touching_wcs(targetwcs, ccds, ccdrad=0.17, polygons=True): ''' targetwcs: wcs object describing region of interest ccds: fits_table object of CCDs ccdrad: radius of CCDs, in degrees. Default 0.17 is for DECam. #If None, computed from T. Returns: index array I of CCDs within range. ''' trad = targetwcs.radius() if ccdrad is None: ccdrad = max( np.sqrt(np.abs(ccds.cd1_1 * ccds.cd2_2 - ccds.cd1_2 * ccds.cd2_1)) * np.hypot(ccds.width, ccds.height) / 2.) rad = trad + ccdrad r, d = targetwcs.radec_center() I, = np.nonzero(np.abs(ccds.dec - d) < rad) I = I[np.atleast_1d(degrees_between(ccds.ra[I], ccds.dec[I], r, d) < rad)] if not polygons: return I # now check actual polygon intersection tw, th = targetwcs.imagew, targetwcs.imageh targetpoly = [(0.5, 0.5), (tw + 0.5, 0.5), (tw + 0.5, th + 0.5), (0.5, th + 0.5)] cd = targetwcs.get_cd() tdet = cd[0] * cd[3] - cd[1] * cd[2] if tdet > 0: targetpoly = list(reversed(targetpoly)) targetpoly = np.array(targetpoly) keep = [] for i in I: W, H = ccds.width[i], ccds.height[i] wcs = Tan(*[ float(x) for x in [ ccds.crval1[i], ccds.crval2[i], ccds.crpix1[i], ccds.crpix2[i], ccds.cd1_1[i], ccds.cd1_2[i], ccds.cd2_1[i], ccds.cd2_2[i], W, H ] ]) cd = wcs.get_cd() wdet = cd[0] * cd[3] - cd[1] * cd[2] poly = [] for x, y in [(0.5, 0.5), (W + 0.5, 0.5), (W + 0.5, H + 0.5), (0.5, H + 0.5)]: rr, dd = wcs.pixelxy2radec(x, y) ok, xx, yy = targetwcs.radec2pixelxy(rr, dd) poly.append((xx, yy)) if wdet > 0: poly = list(reversed(poly)) poly = np.array(poly) if polygons_intersect(targetpoly, poly): keep.append(i) I = np.array(keep) return I
def ccds_touching_wcs(targetwcs, ccds, ccdrad=0.17, polygons=True): ''' targetwcs: wcs object describing region of interest ccds: fits_table object of CCDs ccdrad: radius of CCDs, in degrees. Default 0.17 is for DECam. #If None, computed from T. Returns: index array I of CCDs within range. ''' trad = targetwcs.radius() if ccdrad is None: ccdrad = max(np.sqrt(np.abs(ccds.cd1_1 * ccds.cd2_2 - ccds.cd1_2 * ccds.cd2_1)) * np.hypot(ccds.width, ccds.height) / 2.) rad = trad + ccdrad r,d = targetwcs.radec_center() I, = np.nonzero(np.abs(ccds.dec - d) < rad) I = I[np.atleast_1d(degrees_between(ccds.ra[I], ccds.dec[I], r, d) < rad)] if not polygons: return I # now check actual polygon intersection tw,th = targetwcs.imagew, targetwcs.imageh targetpoly = [(0.5,0.5),(tw+0.5,0.5),(tw+0.5,th+0.5),(0.5,th+0.5)] cd = targetwcs.get_cd() tdet = cd[0]*cd[3] - cd[1]*cd[2] if tdet > 0: targetpoly = list(reversed(targetpoly)) targetpoly = np.array(targetpoly) keep = [] for i in I: W,H = ccds.width[i],ccds.height[i] wcs = Tan(*[float(x) for x in [ccds.crval1[i], ccds.crval2[i], ccds.crpix1[i], ccds.crpix2[i], ccds.cd1_1[i], ccds.cd1_2[i], ccds.cd2_1[i], ccds.cd2_2[i], W, H]]) cd = wcs.get_cd() wdet = cd[0]*cd[3] - cd[1]*cd[2] poly = [] for x,y in [(0.5,0.5),(W+0.5,0.5),(W+0.5,H+0.5),(0.5,H+0.5)]: rr,dd = wcs.pixelxy2radec(x,y) ok,xx,yy = targetwcs.radec2pixelxy(rr,dd) poly.append((xx,yy)) if wdet > 0: poly = list(reversed(poly)) poly = np.array(poly) if polygons_intersect(targetpoly, poly): keep.append(i) I = np.array(keep) return I
def unwise_tiles_touching_wcs(wcs, polygons=True): ''' Returns a FITS table (with RA,Dec,coadd_id) of unWISE tiles ''' from astrometry.util.miscutils import polygons_intersect from astrometry.util.starutil_numpy import degrees_between from pkg_resources import resource_filename atlasfn = resource_filename('legacypipe', 'data/wise-tiles.fits') T = fits_table(atlasfn) trad = wcs.radius() wrad = np.sqrt(2.) / 2. * 2048 * 2.75 / 3600. rad = trad + wrad r, d = wcs.radec_center() I, = np.nonzero(np.abs(T.dec - d) < rad) I = I[degrees_between(T.ra[I], T.dec[I], r, d) < rad] if not polygons: return T[I] # now check actual polygon intersection tw, th = wcs.imagew, wcs.imageh targetpoly = [(0.5, 0.5), (tw + 0.5, 0.5), (tw + 0.5, th + 0.5), (0.5, th + 0.5)] cd = wcs.get_cd() tdet = cd[0] * cd[3] - cd[1] * cd[2] if tdet > 0: targetpoly = list(reversed(targetpoly)) targetpoly = np.array(targetpoly) keep = [] for i in I: wwcs = unwise_tile_wcs(T.ra[i], T.dec[i]) cd = wwcs.get_cd() wdet = cd[0] * cd[3] - cd[1] * cd[2] H, W = wwcs.shape poly = [] for x, y in [(0.5, 0.5), (W + 0.5, 0.5), (W + 0.5, H + 0.5), (0.5, H + 0.5)]: rr, dd = wwcs.pixelxy2radec(x, y) _, xx, yy = wcs.radec2pixelxy(rr, dd) poly.append((xx, yy)) if wdet > 0: poly = list(reversed(poly)) poly = np.array(poly) if polygons_intersect(targetpoly, poly): keep.append(i) I = np.array(keep) return T[I]
def unwise_tiles_touching_wcs(wcs, polygons=True): ''' Returns a FITS table (with RA,Dec,coadd_id) of unWISE tiles ''' atlasfn = os.path.join(os.path.dirname(__file__), 'allsky-atlas.fits') T = fits_table(atlasfn) trad = wcs.radius() wrad = np.sqrt(2.) / 2. * 2048 * 2.75 / 3600. rad = trad + wrad r, d = wcs.radec_center() I, = np.nonzero(np.abs(T.dec - d) < rad) I = I[degrees_between(T.ra[I], T.dec[I], r, d) < rad] if not polygons: return T[I] # now check actual polygon intersection tw, th = wcs.imagew, wcs.imageh targetpoly = [(0.5, 0.5), (tw + 0.5, 0.5), (tw + 0.5, th + 0.5), (0.5, th + 0.5)] cd = wcs.get_cd() tdet = cd[0] * cd[3] - cd[1] * cd[2] if tdet > 0: targetpoly = list(reversed(targetpoly)) targetpoly = np.array(targetpoly) keep = [] for i in I: wwcs = unwise_tile_wcs(T.ra[i], T.dec[i]) cd = wwcs.get_cd() wdet = cd[0] * cd[3] - cd[1] * cd[2] H, W = wwcs.shape poly = [] for x, y in [(0.5, 0.5), (W + 0.5, 0.5), (W + 0.5, H + 0.5), (0.5, H + 0.5)]: rr, dd = wwcs.pixelxy2radec(x, y) ok, xx, yy = wcs.radec2pixelxy(rr, dd) poly.append((xx, yy)) if wdet > 0: poly = list(reversed(poly)) poly = np.array(poly) if polygons_intersect(targetpoly, poly): keep.append(i) I = np.array(keep) return T[I]
def unwise_tiles_touching_wcs(wcs, polygons=True): ''' Returns a FITS table (with RA,Dec,coadd_id) of unWISE tiles ''' atlasfn = os.path.join(os.path.dirname(__file__), 'allsky-atlas.fits') T = fits_table(atlasfn) trad = wcs.radius() wrad = np.sqrt(2.)/2. * 2048 * 2.75/3600. rad = trad + wrad r,d = wcs.radec_center() I, = np.nonzero(np.abs(T.dec - d) < rad) I = I[degrees_between(T.ra[I], T.dec[I], r, d) < rad] if not polygons: return T[I] # now check actual polygon intersection tw,th = wcs.imagew, wcs.imageh targetpoly = [(0.5,0.5),(tw+0.5,0.5),(tw+0.5,th+0.5),(0.5,th+0.5)] cd = wcs.get_cd() tdet = cd[0]*cd[3] - cd[1]*cd[2] if tdet > 0: targetpoly = list(reversed(targetpoly)) targetpoly = np.array(targetpoly) keep = [] for i in I: wwcs = unwise_tile_wcs(T.ra[i], T.dec[i]) cd = wwcs.get_cd() wdet = cd[0]*cd[3] - cd[1]*cd[2] H,W = wwcs.shape poly = [] for x,y in [(0.5,0.5),(W+0.5,0.5),(W+0.5,H+0.5),(0.5,H+0.5)]: rr,dd = wwcs.pixelxy2radec(x,y) ok,xx,yy = wcs.radec2pixelxy(rr,dd) poly.append((xx,yy)) if wdet > 0: poly = list(reversed(poly)) poly = np.array(poly) if polygons_intersect(targetpoly, poly): keep.append(i) I = np.array(keep) return T[I]
for ii in ilist: m0,m1 = T.mu_start[ii], T.mu_end[ii] n0,n1 = T.nu_start[ii], T.nu_end[ii] node,incl = T.node[ii], T.incl[ii] mu,nu = np.array([m0,m0,m1,m1]), np.array([n0,n1,n1,n0]) r,d = munu_to_radec_deg(mu, nu, node, incl) ok,x,y = wcs.radec2pixelxy(r, d) print 'Field', T.run[ii], T.camcol[ii], T.field[ii], 'xy', x,y # corner within tile? if np.any((x >= lo) * (x <= hi) * (y >= lo) * (y <= hi)): print 'Corner within tile' gotone = True break poly2[:,0] = x poly2[:,1] = y if polygons_intersect(poly1, poly2): print 'Polygons intersect' gotone = True break if gotone: keep.append(i) else: print 'No intersection: tile', W.coadd_id[i] W.cut(np.array(keep)) print 'Cut to', len(W) I = np.lexsort((W.ra, W.dec)) W.cut(I) A = fits_table()