def show_objects_from_gate(gatename, warn=100): '''Launch a CellMontageFrame with the objects in the specified gate. gatename -- name of the gate to apply warn -- specify a number of objects that is considered too many to show at once without warning the user and prompting to input how many they want. set to None if you don't want to warn for any amount.''' q = sqltools.QueryBuilder() q.select(sqltools.object_cols()) q.where([p.gates[gatename]]) q.group_by(sqltools.object_cols()) keys = db.execute(str(q)) keys = [tuple(row) for row in keys] if warn and len(keys) > warn: te = wx.TextEntryDialog(get_main_frame_or_none(), 'You have selected %s %s. ' 'How many would you like to show at random?'%(len(keys), p.object_name[1]), 'Choose # of %s'% (p.object_name[1]), defaultValue='100') te.ShowModal() try: numobs = int(te.Value) np.random.shuffle(keys) keys = keys[:numobs] except ValueError: wx.MessageDialog(get_main_frame_or_none(), 'You have entered an invalid number', 'Error').ShowModal() return import sortbin f = sortbin.CellMontageFrame(get_main_frame_or_none()) f.Show() f.add_objects(keys)
def show_images_from_gate(gatename, warn=10): '''Callback for "Show images in gate" popup item. gatename -- name of the gate to apply warn -- specify a number of objects that is considered too many to show at once without warning the user and prompting to input how many they want. set to None if you don't want to warn for any amount.''' q = sqltools.QueryBuilder() q.select(sqltools.image_cols()) q.where([p.gates[gatename]]) q.group_by(sqltools.image_cols()) res = db.execute(str(q)) if warn and len(res) > warn: dlg = wx.MessageDialog( get_main_frame_or_none(), 'You are about to open %s ' 'images. This may take some time depending on your settings. ' 'Continue?' % (len(res)), 'Warning', wx.YES_NO | wx.ICON_QUESTION) response = dlg.ShowModal() if response != wx.ID_YES: return logging.info('Opening %s images.' % (len(res))) import imagetools for row in res: imagetools.ShowImage(tuple(row), p.image_channel_colors, parent=get_main_frame_or_none())
def loadpoints(self, tablename, col, fltr=None, grouping=NO_GROUP): ''' Returns a dict mapping x label values to lists of values from col ''' q = sql.QueryBuilder() select = [sql.Column(tablename, col)] if grouping != NO_GROUP: dm = datamodel.DataModel.getInstance() group_cols = dm.GetGroupColumnNames(grouping, include_table_name=True) select += [sql.Column(*col.split('.')) for col in group_cols] q.set_select_clause(select) if fltr is not None: q.add_filter(fltr) res = db.execute(str(q)) res = np.array(res, dtype=object) # replaces Nones with NaNs for row in res: if row[0] is None: row[0] = np.nan points_dict = {} if self.group_choice.Value != NO_GROUP: for row in res: groupkey = tuple(row[1:]) points_dict[groupkey] = points_dict.get(groupkey, []) + [row[0]] else: points_dict = {col : [r[0] for r in res]} return points_dict
def _load_points(self): q = sql.QueryBuilder() select = [self.x_column, self.y_column] q.set_select_clause(select) if self.filter != None: q.add_filter(self.filter) return db.execute(str(q))
def _load_points(self): q = sql.QueryBuilder() select = [self.x_column] q.set_select_clause(select) if self.filter is not None: q.add_filter(self.filter) return np.array(db.execute(str(q))).T[0]
def UpdatePlateMaps(self): self.measurement = self.measurementsChoice.Value measurement = self.measurement table = self.sourceChoice.Value self.aggMethod = self.aggregationMethodsChoice.Value categorical = measurement not in get_numeric_columns_from_table(table) fltr = self.filterChoice.Value self.colorBar.ClearNotifyWindows() q = sql.QueryBuilder() well_key_cols = [sql.Column(p.image_table, col) for col in well_key_columns()] select = list(well_key_cols) if not categorical: if self.aggMethod=='mean': select += [sql.Column(table, measurement, 'AVG')] elif self.aggMethod=='stdev': select += [sql.Column(table, measurement, 'STDDEV')] elif self.aggMethod=='cv%': # stddev(col) / avg(col) * 100 select += [sql.Expression( sql.Column(table, measurement, 'STDDEV'), ' / ', sql.Column(table, measurement, 'AVG'), ' * 100')] elif self.aggMethod=='sum': select += [sql.Column(table, measurement, 'SUM')] elif self.aggMethod=='min': select += [sql.Column(table, measurement, 'MIN')] elif self.aggMethod=='max': select += [sql.Column(table, measurement, 'MAX')] elif self.aggMethod=='median': select += [sql.Column(table, measurement, 'MEDIAN')] elif self.aggMethod=='none': select += [sql.Column(table, measurement)] else: select += [sql.Column(table, measurement)] q.set_select_clause(select) q.set_group_columns(well_key_cols) if fltr not in (FilterComboBox.NO_FILTER, FilterComboBox.NEW_FILTER, ''): if fltr in p._filters: q.add_filter(p._filters[fltr]) elif fltr in p.gates: q.add_filter(p.gates[fltr].as_filter()) else: raise Exception('Could not find filter "%s" in gates or filters'%(fltr)) wellkeys_and_values = db.execute(str(q)) wellkeys_and_values = np.array(wellkeys_and_values, dtype=object) # Replace measurement None's with nan for row in wellkeys_and_values: if row[-1] is None: row[-1] = np.nan data = [] key_lists = [] dmax = -np.inf dmin = np.inf if p.plate_id: for plateChoice, plateMap in zip(self.plateMapChoices, self.plateMaps): plate = plateChoice.Value plateMap.SetPlate(plate) self.colorBar.AddNotifyWindow(plateMap) self.keys_and_vals = [v for v in wellkeys_and_values if str(v[0])==plate] platedata, wellkeys, ignore = FormatPlateMapData(self.keys_and_vals, categorical) data += [platedata] key_lists += [wellkeys] if not categorical: dmin = np.nanmin([float(kv[-1]) for kv in self.keys_and_vals]+[dmin]) dmax = np.nanmax([float(kv[-1]) for kv in self.keys_and_vals]+[dmax]) else: self.colorBar.AddNotifyWindow(self.plateMaps[0]) platedata, wellkeys, ignore = FormatPlateMapData(wellkeys_and_values, categorical) data += [platedata] key_lists += [wellkeys] if not categorical: dmin = np.nanmin([float(kv[-1]) for kv in wellkeys_and_values]) dmax = np.nanmax([float(kv[-1]) for kv in wellkeys_and_values]) if not categorical: if len(wellkeys_and_values) > 0: # Compute the global extents if there is any data whatsoever gmin = np.nanmin([float(vals[-1]) for vals in wellkeys_and_values]) gmax = np.nanmax([float(vals[-1]) for vals in wellkeys_and_values]) if np.isinf(dmin) or np.isinf(dmax): gmin = gmax = dmin = dmax = 1. # Warn if there was no data for this plate (and no filter was used) if fltr == FilterComboBox.NO_FILTER: wx.MessageBox('No numeric data was found in "%s.%s" for plate "%s"' %(table, measurement, plate), 'Warning') else: gmin = gmax = 1. if fltr == FilterComboBox.NO_FILTER: wx.MessageBox('No numeric data was found in %s.%s' %(table, measurement), 'Warning') if categorical: self.colorBar.Hide() else: self.colorBar.Show() self.colorBar.SetLocalExtents([dmin,dmax]) self.colorBar.SetGlobalExtents([gmin,gmax]) self.rightSizer.Layout() for keys, d, plateMap in zip(key_lists, data, self.plateMaps): plateMap.SetWellKeys(keys) if categorical: plateMap.SetData(np.ones(d.shape) * np.nan) plateMap.SetTextData(d) else: plateMap.SetData(d, data_range=self.colorBar.GetLocalExtents(), clip_interval=self.colorBar.GetLocalInterval(), clip_mode=self.colorBar.GetClipMode()) for keys, d, plateMap in zip(key_lists, data, self.plateMaps): plateMap.SetWellKeys(keys) if categorical: plateMap.SetData(np.ones(d.shape) * np.nan) plateMap.SetTextData(d) else: plateMap.SetData(d, data_range=self.colorBar.GetLocalExtents(), clip_interval=self.colorBar.GetLocalInterval(), clip_mode=self.colorBar.GetClipMode())