def get_arcmin(self, sep): sgn, deg, mn, sec = wcs.degToDms(sep) if deg != 0: txt = '%02d:%02d:%06.3f' % (deg, mn, sec) else: txt = '%02d:%06.3f' % (mn, sec) return txt
def _get_dss_image(self): try: fov_deg = float(self.w.fov.get_text()) # width and height are specified in arcmin sgn, deg, mn, sec = wcs.degToDms(fov_deg) wd = deg * 60.0 + float(mn) + sec / 60.0 sgn, deg, mn, sec = wcs.degToDms(fov_deg) ht = deg * 60.0 + float(mn) + sec / 60.0 # coordinates ra_txt = wcs.raDegToString(self.ctr_ra_deg) dec_txt = wcs.decDegToString(self.ctr_dec_deg) # these are the params to DSS params = dict(ra=ra_txt, dec=dec_txt, width=wd, height=ht) # Query the server and download file srvbank = self.fv.get_ServerBank() filename = "sky-" + str(self.dsscnt) + ".fits" self.dsscnt = (self.dsscnt + 1) % 5 filepath = os.path.join(self.tmpdir, filename) try: os.remove(filepath) except Exception as e: self.logger.warn("failed to remove tmp file '%s': %s" % (filepath, str(e))) try: dstpath = srvbank.getImage(self.servername, filepath, **params) except Exception as e: errmsg = "Failed to download sky image: %s" % (str(e)) self.fv.gui_do(self.fv.show_error, errmsg) return try: image = self.fv.load_image(dstpath) except Exception as e: errmsg = "Failed to load downloaded sky image: %s" % (str(e)) self.fv.gui_do(self.fv.show_error, errmsg) return image.set(nothumb=True) self.fv.gui_do(self.fitsimage.set_image, image) finally: self.fv.gui_do(self.fitsimage.onscreen_message_off)
def get_starsep_RaDecDeg(self, ra1_deg, dec1_deg, ra2_deg, dec2_deg): sep = self.deltaStarsRaDecDeg(ra1_deg, dec1_deg, ra2_deg, dec2_deg) ## self.logger.debug("sep=%.3f ra1=%f dec1=%f ra2=%f dec2=%f" % ( ## sep, ra1_deg, dec1_deg, ra2_deg, dec2_deg)) sgn, deg, mn, sec = wcs.degToDms(sep) if deg != 0: txt = '%02d:%02d:%06.3f' % (deg, mn, sec) else: txt = '%02d:%06.3f' % (mn, sec) return txt
def deg2fmt(self, ra_deg, dec_deg, format): rhr, rmn, rsec = wcs.degToHms(ra_deg) dsgn, ddeg, dmn, dsec = wcs.degToDms(dec_deg) if format == 'hms': return rhr, rmn, rsec, dsgn, ddeg, dmn, dsec elif format == 'str': #ra_txt = '%02d:%02d:%06.3f' % (rhr, rmn, rsec) ra_txt = '%d:%02d:%06.3f' % (rhr, rmn, rsec) if dsgn < 0: dsgn = '-' else: dsgn = '+' #dec_txt = '%s%02d:%02d:%05.2f' % (dsgn, ddeg, dmn, dsec) dec_txt = '%s%d:%02d:%05.2f' % (dsgn, ddeg, dmn, dsec) return ra_txt, dec_txt
def redo(self): obj = self.canvas.get_object_by_tag(self.areatag) if not obj.kind in ('rectangle', 'circle'): return True try: image = self.fitsimage.get_image() if obj.kind == 'rectangle': # if the object drawn is a rectangle, calculate the radius # of a circle necessary to cover the area # calculate center of bbox x1, y1, x2, y2 = obj.get_llur() wd = x2 - x1 dw = wd // 2 ht = y2 - y1 dh = ht // 2 ctr_x, ctr_y = x1 + dw, y1 + dh ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') # Calculate RA and DEC for the three points # origination point ra_org, dec_org = image.pixtoradec(x1, y1) # destination point ra_dst, dec_dst = image.pixtoradec(x2, y2) # "heel" point making a right triangle ra_heel, dec_heel = image.pixtoradec(x1, y2) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_heel, dec_heel) wd_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) radius_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) else: # if the object drawn is a circle, calculate the box # enclosed by the circle ctr_x, ctr_y = obj.crdmap.to_data(obj.x, obj.y) ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y) dst_x, dst_y = obj.crdmap.to_data(obj.x + obj.radius, obj.y) ra_dst, dec_dst = image.pixtoradec(dst_x, dst_y) radius_deg = wcs.deltaStarsRaDecDeg(ra_ctr, dec_ctr, ra_dst, dec_dst) # redo as str format for widget ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') wd = ht = math.fabs(dst_x - ctr_x) * 2.0 dw = wd // 2 dh = ht // 2 ra_org, dec_org = image.pixtoradec(ctr_x, ctr_y - dh) ra_dst, dec_dst = image.pixtoradec(ctr_x, ctr_y + dh) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) ra_org, dec_org = image.pixtoradec(ctr_x - dw, ctr_y) ra_dst, dec_dst = image.pixtoradec(ctr_x + dw, ctr_y) wd_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) # width and height are specified in arcmin sgn, deg, mn, sec = wcs.degToDms(wd_deg) wd = deg * 60.0 + float(mn) + sec / 60.0 sgn, deg, mn, sec = wcs.degToDms(ht_deg) ht = deg * 60.0 + float(mn) + sec / 60.0 sgn, deg, mn, sec = wcs.degToDms(radius_deg) radius = deg * 60.0 + float(mn) + sec / 60.0 #wd, ht, radius = wd_deg, ht_deg, radius_deg except Exception as e: errmsg = 'Error calculating bounding box: %s' % str(e) self.logger.error(errmsg) self.fv.show_error(errmsg) return True # Copy the image parameters out to the widget d = { 'ra': ra_ctr, 'dec': dec_ctr, 'width': str(wd), 'height': ht, 'r': radius, 'r2': radius, 'r1': 0.0, } self._update_widgets(d) return True
def redo(self): obj = self.canvas.getObjectByTag(self.areatag) if not obj.kind in ('rectangle', 'circle'): return True try: image = self.fitsimage.get_image() if obj.kind == 'rectangle': # if the object drawn is a rectangle, calculate the radius # of a circle necessary to cover the area # calculate center of bbox x1, y1, x2, y2 = obj.get_llur() wd = x2 - x1 dw = wd // 2 ht = y2 - y1 dh = ht // 2 ctr_x, ctr_y = x1 + dw, y1 + dh ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') # Calculate RA and DEC for the three points # origination point ra_org, dec_org = image.pixtoradec(x1, y1) # destination point ra_dst, dec_dst = image.pixtoradec(x2, y2) # "heel" point making a right triangle ra_heel, dec_heel = image.pixtoradec(x1, y2) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_heel, dec_heel) wd_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) radius_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) else: # if the object drawn is a circle, calculate the box # enclosed by the circle ctr_x, ctr_y = obj.crdmap.to_data(obj.x, obj.y) ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y) dst_x, dst_y = obj.crdmap.to_data(obj.x + obj.radius, obj.y) ra_dst, dec_dst = image.pixtoradec(dst_x, dst_y) radius_deg = wcs.deltaStarsRaDecDeg(ra_ctr, dec_ctr, ra_dst, dec_dst) # redo as str format for widget ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') wd = ht = math.fabs(dst_x - ctr_x) * 2.0 dw = wd // 2 dh = ht // 2 ra_org, dec_org = image.pixtoradec(ctr_x, ctr_y - dh) ra_dst, dec_dst = image.pixtoradec(ctr_x, ctr_y + dh) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) ra_org, dec_org = image.pixtoradec(ctr_x - dw, ctr_y) ra_dst, dec_dst = image.pixtoradec(ctr_x + dw, ctr_y) wd_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) # width and height are specified in arcmin sgn, deg, mn, sec = wcs.degToDms(wd_deg) wd = deg*60.0 + float(mn) + sec/60.0 sgn, deg, mn, sec = wcs.degToDms(ht_deg) ht = deg*60.0 + float(mn) + sec/60.0 sgn, deg, mn, sec = wcs.degToDms(radius_deg) radius = deg*60.0 + float(mn) + sec/60.0 #wd, ht, radius = wd_deg, ht_deg, radius_deg except Exception as e: errmsg = 'Error calculating bounding box: %s' % str(e) self.logger.error(errmsg) self.fv.show_error(errmsg) return True # Copy the image parameters out to the widget d = { 'ra': ra_ctr, 'dec': dec_ctr, 'width': str(wd), 'height': ht, 'r': radius, 'r2': radius, 'r1': 0.0, } self._update_widgets(d) return True
def info_xy(self, data_x, data_y, settings): # Get the value under the data coordinates try: # We report the value across the pixel, even though the coords # change halfway across the pixel value = self.get_data_xy(int(data_x + 0.5), int(data_y + 0.5)) except Exception as e: value = None system = settings.get('wcs_coords', None) format = settings.get('wcs_display', 'sexagesimal') ra_lbl, dec_lbl = six.unichr(945), six.unichr(948) # Calculate WCS coords, if available try: if self.wcs is None: self.logger.debug("No WCS for this image") ra_txt = dec_txt = 'NO WCS' elif self.wcs.coordsys == 'raw': self.logger.debug("No coordinate system determined") ra_txt = dec_txt = 'NO WCS' elif self.wcs.coordsys == 'pixel': args = [data_x, data_y] + self.revnaxis x, y = self.wcs.pixtosystem(args, system=system, coords='data') ra_txt = "%+.3f" % (x) dec_txt = "%+.3f" % (y) ra_lbl, dec_lbl = "X", "Y" else: args = [data_x, data_y] + self.revnaxis lon_deg, lat_deg = self.wcs.pixtosystem(args, system=system, coords='data') if format == 'sexagesimal': if system in ('galactic', 'ecliptic'): sign, deg, min, sec = wcs.degToDms(lon_deg, isLatitude=False) ra_txt = '+%03d:%02d:%06.3f' % (deg, min, sec) else: deg, min, sec = wcs.degToHms(lon_deg) ra_txt = '%02d:%02d:%06.3f' % (deg, min, sec) sign, deg, min, sec = wcs.degToDms(lat_deg) if sign < 0: sign = '-' else: sign = '+' dec_txt = '%s%02d:%02d:%06.3f' % (sign, deg, min, sec) else: ra_txt = '%+10.7f' % (lon_deg) dec_txt = '%+10.7f' % (lat_deg) if system == 'galactic': ra_lbl, dec_lbl = "l", "b" elif system == 'ecliptic': ra_lbl, dec_lbl = six.unichr(0x03BB), six.unichr(0x03B2) elif system == 'helioprojective': ra_txt = "%+5.3f" % (lon_deg * 3600) dec_txt = "%+5.3f" % (lat_deg * 3600) ra_lbl, dec_lbl = "x-Solar", "y-Solar" except Exception as e: self.logger.warning("Bad coordinate conversion: %s" % (str(e))) ra_txt = dec_txt = 'BAD WCS' try: # log traceback, if possible (type_, value_, tb) = sys.exc_info() tb_str = "".join(traceback.format_tb(tb)) self.logger.error("Traceback:\n%s" % (tb_str)) except Exception: tb_str = "Traceback information unavailable." self.logger.error(tb_str) info = Bunch.Bunch(itype='astro', data_x=data_x, data_y=data_y, x=data_x, y=data_y, ra_txt=ra_txt, dec_txt=dec_txt, ra_lbl=ra_lbl, dec_lbl=dec_lbl, value=value) return info
ts = time.time() try: if (self.wcs == None) or (self.wcs.coordsys == 'raw'): ra_txt = dec_txt = 'NO WCS' else: args = [data_x, data_y] + self.revnaxis lon_deg, lat_deg = self.wcs.pixtosystem(#(data_x, data_y), args, system=system, coords='data') if format == 'sexagesimal': if system in ('galactic', 'ecliptic'): sign, deg, min, sec = wcs.degToDms(lon_deg, isLatitude=False) ra_txt = '+%03d:%02d:%06.3f' % (deg, min, sec) else: deg, min, sec = wcs.degToHms(lon_deg) ra_txt = '%02d:%02d:%06.3f' % (deg, min, sec) sign, deg, min, sec = wcs.degToDms(lat_deg) if sign < 0: sign = '-' else: sign = '+' dec_txt = '%s%02d:%02d:%06.3f' % (sign, deg, min, sec) else: ra_txt = '%+10.7f' % (lon_deg) dec_txt = '%+10.7f' % (lat_deg)
def info_xy(self, data_x, data_y, settings): # Get the value under the data coordinates try: # We report the value across the pixel, even though the coords # change halfway across the pixel value = self.get_data_xy(int(data_x+0.5), int(data_y+0.5)) except Exception as e: value = None system = settings.get('wcs_coords', None) format = settings.get('wcs_display', 'sexagesimal') ra_lbl, dec_lbl = six.unichr(945), six.unichr(948) # Calculate WCS coords, if available ts = time.time() try: if self.wcs is None: self.logger.debug("No WCS for this image") ra_txt = dec_txt = 'NO WCS' elif self.wcs.coordsys == 'raw': self.logger.debug("No coordinate system determined") ra_txt = dec_txt = 'NO WCS' elif self.wcs.coordsys == 'pixel': args = [data_x, data_y] + self.revnaxis x, y = self.wcs.pixtosystem(#(data_x, data_y), args, system=system, coords='data') ra_txt = "%+.3f" % (x) dec_txt = "%+.3f" % (y) ra_lbl, dec_lbl = "X", "Y" else: args = [data_x, data_y] + self.revnaxis lon_deg, lat_deg = self.wcs.pixtosystem(#(data_x, data_y), args, system=system, coords='data') if format == 'sexagesimal': if system in ('galactic', 'ecliptic'): sign, deg, min, sec = wcs.degToDms(lon_deg, isLatitude=False) ra_txt = '+%03d:%02d:%06.3f' % (deg, min, sec) else: deg, min, sec = wcs.degToHms(lon_deg) ra_txt = '%02d:%02d:%06.3f' % (deg, min, sec) sign, deg, min, sec = wcs.degToDms(lat_deg) if sign < 0: sign = '-' else: sign = '+' dec_txt = '%s%02d:%02d:%06.3f' % (sign, deg, min, sec) else: ra_txt = '%+10.7f' % (lon_deg) dec_txt = '%+10.7f' % (lat_deg) if system == 'galactic': ra_lbl, dec_lbl = "l", "b" elif system == 'ecliptic': ra_lbl, dec_lbl = six.unichr(0x03BB), six.unichr(0x03B2) elif system == 'helioprojective': ra_txt = "%+5.3f" % (lon_deg*3600) dec_txt = "%+5.3f" % (lat_deg*3600) ra_lbl, dec_lbl = "x-Solar", "y-Solar" except Exception as e: self.logger.warning("Bad coordinate conversion: %s" % ( str(e))) ra_txt = 'BAD WCS' dec_txt = 'BAD WCS' try: # log traceback, if possible (type_, value_, tb) = sys.exc_info() tb_str = "".join(traceback.format_tb(tb)) self.logger.error("Traceback:\n%s" % (tb_str)) except Exception: tb_str = "Traceback information unavailable." self.logger.error(tb_str) te = time.time() - ts #print "time elapsed: %.4f" % te info = Bunch.Bunch(itype='astro', data_x=data_x, data_y=data_y, x=data_x, y=data_y, ra_txt=ra_txt, dec_txt=dec_txt, ra_lbl=ra_lbl, dec_lbl=dec_lbl, value=value) return info
def info_xy(self, data_x, data_y, settings): # Note: FITS coordinates are 1-based, whereas numpy FITS arrays # are 0-based fits_x, fits_y = data_x + 1, data_y + 1 # Get the value under the data coordinates try: # We report the value across the pixel, even though the coords # change halfway across the pixel value = self.get_data_xy(int(data_x+0.5), int(data_y+0.5)) except Exception as e: value = None system = settings.get('wcs_coords', None) format = settings.get('wcs_display', 'sexagesimal') ra_lbl, dec_lbl = six.unichr(945), six.unichr(948) # Calculate WCS coords, if available ts = time.time() try: if (self.wcs == None) or (self.wcs.coordsys == 'raw'): ra_txt = dec_txt = 'NO WCS' else: args = [data_x, data_y] + self.revnaxis lon_deg, lat_deg = self.wcs.pixtosystem(#(data_x, data_y), args, system=system, coords='data') if format == 'sexagesimal': if system in ('galactic', 'ecliptic'): sign, deg, min, sec = wcs.degToDms(lon_deg, isLatitude=False) ra_txt = '+%03d:%02d:%06.3f' % (deg, min, sec) else: deg, min, sec = wcs.degToHms(lon_deg) ra_txt = '%02d:%02d:%06.3f' % (deg, min, sec) sign, deg, min, sec = wcs.degToDms(lat_deg) if sign < 0: sign = '-' else: sign = '+' dec_txt = '%s%02d:%02d:%06.3f' % (sign, deg, min, sec) else: ra_txt = '%+10.7f' % (lon_deg) dec_txt = '%+10.7f' % (lat_deg) if system == 'galactic': ra_lbl, dec_lbl = "l", "b" elif system == 'ecliptic': ra_lbl, dec_lbl = six.unichr(0x03BB), six.unichr(0x03B2) elif system == 'helioprojective': ra_txt = "%+5.3f" % (lon_deg*3600) dec_txt = "%+5.3f" % (lat_deg*3600) ra_lbl, dec_lbl = "x-Solar", "y-Solar" except Exception as e: self.logger.warn("Bad coordinate conversion: %s" % ( str(e))) ra_txt = 'BAD WCS' dec_txt = 'BAD WCS' te = time.time() - ts #print "time elapsed: %.4f" % te info = Bunch.Bunch(itype='astro', data_x=data_x, data_y=data_y, fits_x=fits_x, fits_y=fits_y, x=fits_x, y=fits_y, ra_txt=ra_txt, dec_txt=dec_txt, ra_lbl=ra_lbl, dec_lbl=dec_lbl, value=value) return info
def redo(self): obj = self.canvas.getObjectByTag(self.areatag) if not obj.kind in ('rectangle', 'circle'): # !!? self.stop() return True try: image = self.fitsimage.get_image() if obj.kind == 'rectangle': # if the object drawn is a rectangle, calculate the radius # of a circle necessary to cover the area # calculate center of bbox wd = obj.x2 - obj.x1 dw = wd // 2 ht = obj.y2 - obj.y1 dh = ht // 2 ctr_x, ctr_y = obj.x1 + dw, obj.y1 + dh ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') # Calculate RA and DEC for the three points # origination point ra_org, dec_org = image.pixtoradec(obj.x1, obj.y1) # destination point ra_dst, dec_dst = image.pixtoradec(obj.x2, obj.y2) # "heel" point making a right triangle ra_heel, dec_heel = image.pixtoradec(obj.x1, obj.y2) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_heel, dec_heel) wd_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) radius_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) else: # if the object drawn is a circle, calculate the box # enclosed by the circle ctr_x, ctr_y = obj.x, obj.y ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y) ra_dst, dec_dst = image.pixtoradec(ctr_x + obj.radius, ctr_y) radius_deg = wcs.deltaStarsRaDecDeg(ra_ctr, dec_ctr, ra_dst, dec_dst) # redo as str format for widget ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') wd = ht = obj.radius * 2.0 dw = wd // 2 dh = ht // 2 ra_org, dec_org = image.pixtoradec(ctr_x, ctr_y - dh) ra_dst, dec_dst = image.pixtoradec(ctr_x, ctr_y + dh) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) ra_org, dec_org = image.pixtoradec(ctr_x - dw, ctr_y) ra_dst, dec_dst = image.pixtoradec(ctr_x + dw, ctr_y) wd_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) # width and height are specified in arcmin sgn, deg, mn, sec = wcs.degToDms(wd_deg) wd = deg * 60.0 + float(mn) + sec / 60.0 sgn, deg, mn, sec = wcs.degToDms(ht_deg) ht = deg * 60.0 + float(mn) + sec / 60.0 sgn, deg, mn, sec = wcs.degToDms(radius_deg) radius = deg * 60.0 + float(mn) + sec / 60.0 #wd, ht, radius = wd_deg, ht_deg, radius_deg except Exception as e: self.fv.showStatus('BAD WCS: %s' % str(e)) return True # Copy the image parameters out to the widget d = { 'ra': ra_ctr, 'dec': dec_ctr, 'width': str(wd), 'height': ht, 'r': radius, 'r2': radius, 'r1': 0.0, } self._update_widgets(d) return True
def redo(self): obj = self.canvas.getObjectByTag(self.areatag) if not obj.kind in ('rectangle', 'circle'): # !!? self.stop() return True try: image = self.fitsimage.get_image() if obj.kind == 'rectangle': # if the object drawn is a rectangle, calculate the radius # of a circle necessary to cover the area # calculate center of bbox wd = obj.x2 - obj.x1 dw = wd // 2 ht = obj.y2 - obj.y1 dh = ht // 2 ctr_x, ctr_y = obj.x1 + dw, obj.y1 + dh ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') # Calculate RA and DEC for the three points # origination point ra_org, dec_org = image.pixtoradec(obj.x1, obj.y1) # destination point ra_dst, dec_dst = image.pixtoradec(obj.x2, obj.y2) # "heel" point making a right triangle ra_heel, dec_heel = image.pixtoradec(obj.x1, obj.y2) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_heel, dec_heel) wd_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) radius_deg = wcs.deltaStarsRaDecDeg(ra_heel, dec_heel, ra_dst, dec_dst) else: # if the object drawn is a circle, calculate the box # enclosed by the circle ctr_x, ctr_y = obj.x, obj.y ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y) ra_dst, dec_dst = image.pixtoradec(ctr_x + obj.radius, ctr_y) radius_deg = wcs.deltaStarsRaDecDeg(ra_ctr, dec_ctr, ra_dst, dec_dst) # redo as str format for widget ra_ctr, dec_ctr = image.pixtoradec(ctr_x, ctr_y, format='str') wd = ht = obj.radius * 2.0 dw = wd // 2 dh = ht // 2 ra_org, dec_org = image.pixtoradec(ctr_x, ctr_y - dh) ra_dst, dec_dst = image.pixtoradec(ctr_x, ctr_y + dh) ht_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) ra_org, dec_org = image.pixtoradec(ctr_x - dw, ctr_y) ra_dst, dec_dst = image.pixtoradec(ctr_x + dw, ctr_y) wd_deg = wcs.deltaStarsRaDecDeg(ra_org, dec_org, ra_dst, dec_dst) # width and height are specified in arcmin sgn, deg, mn, sec = wcs.degToDms(wd_deg) wd = deg*60.0 + float(mn) + sec/60.0 sgn, deg, mn, sec = wcs.degToDms(ht_deg) ht = deg*60.0 + float(mn) + sec/60.0 sgn, deg, mn, sec = wcs.degToDms(radius_deg) radius = deg*60.0 + float(mn) + sec/60.0 #wd, ht, radius = wd_deg, ht_deg, radius_deg except Exception, e: self.fv.showStatus('BAD WCS: %s' % str(e)) return True
def info_xy(self, data_x, data_y, settings): # Note: FITS coordinates are 1-based, whereas numpy FITS arrays # are 0-based fits_x, fits_y = data_x + 1, data_y + 1 # Get the value under the data coordinates try: # We report the value across the pixel, even though the coords # change halfway across the pixel value = self.get_data_xy(int(data_x+0.5), int(data_y+0.5)) except Exception as e: value = None system = settings.get('wcs_coords', None) format = settings.get('wcs_display', 'sexagesimal') ra_lbl, dec_lbl = six.unichr(945), six.unichr(948) # Calculate WCS coords, if available ts = time.time() try: if self.wcs == None: self.logger.debug("No WCS for this image") ra_txt = dec_txt = 'NO WCS' elif self.wcs.coordsys == 'raw': self.logger.debug("No coordinate system determined") ra_txt = dec_txt = 'NO WCS' else: args = [data_x, data_y] + self.revnaxis lon_deg, lat_deg = self.wcs.pixtosystem(#(data_x, data_y), args, system=system, coords='data') if format == 'sexagesimal': if system in ('galactic', 'ecliptic'): sign, deg, min, sec = wcs.degToDms(lon_deg, isLatitude=False) ra_txt = '+%03d:%02d:%06.3f' % (deg, min, sec) else: deg, min, sec = wcs.degToHms(lon_deg) ra_txt = '%02d:%02d:%06.3f' % (deg, min, sec) sign, deg, min, sec = wcs.degToDms(lat_deg) if sign < 0: sign = '-' else: sign = '+' dec_txt = '%s%02d:%02d:%06.3f' % (sign, deg, min, sec) else: ra_txt = '%+10.7f' % (lon_deg) dec_txt = '%+10.7f' % (lat_deg) if system == 'galactic': ra_lbl, dec_lbl = "l", "b" elif system == 'ecliptic': ra_lbl, dec_lbl = six.unichr(0x03BB), six.unichr(0x03B2) elif system == 'helioprojective': ra_txt = "%+5.3f" % (lon_deg*3600) dec_txt = "%+5.3f" % (lat_deg*3600) ra_lbl, dec_lbl = "x-Solar", "y-Solar" except Exception as e: self.logger.warn("Bad coordinate conversion: %s" % ( str(e))) ra_txt = 'BAD WCS' dec_txt = 'BAD WCS' te = time.time() - ts #print "time elapsed: %.4f" % te info = Bunch.Bunch(itype='astro', data_x=data_x, data_y=data_y, fits_x=fits_x, fits_y=fits_y, x=fits_x, y=fits_y, ra_txt=ra_txt, dec_txt=dec_txt, ra_lbl=ra_lbl, dec_lbl=dec_lbl, value=value) return info