def unmarshall(obj): # take care of compound types if isinstance(obj, list): return list(map(unmarshall, obj)) if isinstance(obj, tuple): return tuple(map(unmarshall, obj)) if isinstance(obj, dict): return dict(zip(obj.keys(), map(unmarshall, obj.values()))) if isinstance(obj, xmlrpclib.Binary): obj = obj.data return obj
def unmarshall(rtnval): typ = type(rtnval) # take care of compound types if isinstance(rtnval, list): return list(map(unmarshall, rtnval)) if isinstance(rtnval, tuple): return tuple(map(unmarshall, rtnval)) if isinstance(rtnval, dict): return dict(zip(rtnval.keys(), map(unmarshall, rtnval.values()))) if isinstance(rtnval, xmlrpclib.Binary): rtnval = rtnval.data return rtnval
def marshall(obj): typ = type(obj) # take care of compound types if isinstance(obj, list): return list(map(marshall, obj)) if isinstance(obj, tuple): return tuple(map(marshall, obj)) if isinstance(obj, dict): return dict(zip(obj.keys(), map(marshall, obj.values()))) # check if object is a large binary object if isinstance(obj, Blob): return xmlrpclib.Binary(obj.buf) if not typ in base_types: obj = undefined return obj
def marshall(res): typ = type(res) # take care of compound types if isinstance(res, list): return list(map(marshall, res)) if isinstance(res, tuple): return tuple(map(marshall, res)) if isinstance(res, dict): return dict(zip(res.keys(), map(marshall, res.values()))) # base types if isinstance(res, bytes): return xmlrpclib.Binary(res) if not typ in base_types: res = undefined return res
def set_table_cb(self, viewer, table): """Display the given table object.""" self.clear() tree_dict = OrderedDict() # Extract data as astropy table a_tab = table.get_data() # Fill masked values, if applicable try: a_tab = a_tab.filled() except Exception: # Just use original table pass # This is to get around table widget not sorting numbers properly i_fmt = '{{0:0{0}d}}'.format(len(str(len(a_tab)))) # Table header with units columns = [('Row', '_DISPLAY_ROW')] for c in itervalues(a_tab.columns): col_str = '{0:^s}\n{1:^s}'.format(c.name, str(c.unit)) columns.append((col_str, c.name)) self.widget.setup_table(columns, 1, '_DISPLAY_ROW') # Table contents for i, row in enumerate(a_tab, 1): bnch = Bunch.Bunch(zip(row.colnames, row.as_void())) i_str = i_fmt.format(i) bnch['_DISPLAY_ROW'] = i_str tree_dict[i_str] = bnch self.widget.set_tree(tree_dict) # Resize column widths n_rows = len(tree_dict) if n_rows < self.settings.get('max_rows_for_col_resize', 5000): self.widget.set_optimal_column_widths() self.logger.debug('Resized columns for {0} row(s)'.format(n_rows)) tablename = table.get('name', 'NoName') self.logger.debug('Displayed {0}'.format(tablename))
def load_file(self, filename): """Load coordinates file. Results are appended to previously loaded coordinates. This can be used to load one file per color. """ if not os.path.isfile(filename): return self.logger.info('Loading coordinates from {0}'.format(filename)) if filename.endswith('.fits'): fmt = 'fits' else: # Assume ASCII fmt = 'ascii' try: tab = Table.read(filename, format=fmt) except Exception as e: self.logger.error('{0}: {1}'.format(e.__class__.__name__, str(e))) return if self.use_radec: colname0 = self.settings.get('ra_colname', 'ra') colname1 = self.settings.get('dec_colname', 'dec') else: colname0 = self.settings.get('x_colname', 'x') colname1 = self.settings.get('y_colname', 'y') try: col_0 = tab[colname0] col_1 = tab[colname1] except Exception as e: self.logger.error('{0}: {1}'.format(e.__class__.__name__, str(e))) return nrows = len(col_0) dummy_col = [None] * nrows try: oldrows = int(self.w.ntotal.get_text()) except ValueError: oldrows = 0 self.w.ntotal.set_text(str(oldrows + nrows)) if self.use_radec: ra = self._convert_radec(col_0) dec = self._convert_radec(col_1) x = y = dummy_col else: ra = dec = dummy_col # X and Y always 0-indexed internally x = col_0.data - self.pixelstart y = col_1.data - self.pixelstart args = [ra, dec, x, y] # Load extra columns for colname in self.extra_columns: try: col = tab[colname].data except Exception as e: self.logger.error( '{0}: {1}'.format(e.__class__.__name__, str(e))) col = dummy_col args.append(col) # Use list to preserve order. Does not handle duplicates. key = (self.marktype, self.marksize, self.markcolor) self.coords_dict[key] += list(zip(*args)) self.redo()
def redo(self): """Image or coordinates have changed. Clear and redraw.""" if not self.gui_up: return self.clear_marking() self.tree_dict = Bunch.caselessDict() self.treeviewbad.clear() bad_tree_dict = Bunch.caselessDict() nbad = 0 self._xarr = [] self._yarr = [] self._treepaths = [] image = self.fitsimage.get_image() if image is None: return if not hasattr(image, 'radectopix'): self.logger.error( 'Image as no radectopix() method for coordinates conversion') return objlist = [] seqno = 1 max_x = image.width - 1 max_y = image.height - 1 for key, coords in iteritems(self.coords_dict): if len(coords) == 0: continue marktype, marksize, markcolor = key kstr = ','.join(map(str, key)) sub_dict = {} bad_sub_dict = {} self.tree_dict[kstr] = sub_dict bad_tree_dict[kstr] = bad_sub_dict for args in coords: ra, dec, x, y = args[:4] # Use X and Y positions directly. Convert to RA and DEC (deg). if ra is None or dec is None: ra, dec = image.pixtoradec(x, y) # RA and DEC already in degrees. Convert to pixel X and Y. else: x, y = image.radectopix(ra, dec) # Display original X/Y (can be 0- or 1-indexed) using # our internal 0-indexed values. xdisp = x + self.pixelstart ydisp = y + self.pixelstart seqstr = '{0:04d}'.format(seqno) # Prepend 0s for proper sort bnch = Bunch.Bunch(zip(self.extra_columns, args[4:])) # Extra bnch.update(Bunch.Bunch(MARKID=seqstr, RA=ra, DEC=dec, X=xdisp, Y=ydisp)) # Do not draw out of bounds if (not np.isfinite(x) or x < 0 or x > max_x or not np.isfinite(y) or y < 0 or y > max_y): self.logger.debug('Ignoring RA={0}, DEC={1} ' '(x={2}, y={3})'.format(ra, dec, x, y)) bad_sub_dict[seqstr] = bnch nbad += 1 # Display point else: obj = self._get_markobj( x, y, marktype, marksize, markcolor, self.markwidth) objlist.append(obj) sub_dict[seqstr] = bnch self._xarr.append(x) self._yarr.append(y) self._treepaths.append((kstr, seqstr)) seqno += 1 n_obj = len(objlist) self.logger.debug('Displaying {0} markings'.format(n_obj)) if nbad > 0: self.treeviewbad.set_tree(bad_tree_dict) if n_obj == 0: return # Convert to Numpy arrays to avoid looping later self._xarr = np.array(self._xarr) self._yarr = np.array(self._yarr) self._treepaths = np.array(self._treepaths) # Display info table self.recreate_toc() # Draw on canvas self.marktag = self.canvas.add(self.dc.CompoundObject(*objlist)) self.fitsimage.redraw() # Force immediate redraw