Projects/laydi
Projects
/
laydi
Archived
7
0
Fork 0

mainly overhaul of observers, and removal of project singleton

This commit is contained in:
Arnar Flatberg 2006-04-20 10:27:58 +00:00
parent f45c9c6bf7
commit 6a4ae8ecf1
6 changed files with 61 additions and 56 deletions

21
fluent
View File

@ -14,10 +14,12 @@ import gnome.ui
import pango import pango
import project import project
import workflow import workflow
import dataset
import logger import logger
import plots import plots
import navigator import navigator
import go_workflow import go_workflow
import scipy
PROGRAM_NAME = 'fluent' PROGRAM_NAME = 'fluent'
VERSION = '0.1.0' VERSION = '0.1.0'
@ -29,11 +31,22 @@ class FluentApp:
def __init__(self): def __init__(self):
# Application variables # Application variables
self.navigator = navigator.NavigatorStore()
self.current_data = None
self.project = project.Project() self.project = project.Project()
# add test data ##################
x = scipy.rand(200,3)
def_list = [ ['samples',[]], ['genes',['a','b','c']] ]
test_data1 = dataset.Dataset(x,def_list)
self.project.add_dataset(test_data1)
#y = scipy.rand(200,2)
#def_list = [ ['samples',[]], ['yclasses',['C','N']] ]
#test_data2 = dataset.Dataset(y,def_list)
####################
self.navigator = navigator.NavigatorStore(self.project)
self.current_data = None
gtk.glade.set_custom_handler(self.custom_object_factory) gtk.glade.set_custom_handler(self.custom_object_factory)
self.widget_tree = gtk.glade.XML(GLADEFILENAME, 'appwindow') self.widget_tree = gtk.glade.XML(GLADEFILENAME, 'appwindow')
self.workflow = go_workflow.EinarsWorkflow(self) self.workflow = go_workflow.EinarsWorkflow(self)
@ -59,7 +72,7 @@ class FluentApp:
self.small_view.show() self.small_view.show()
return self.small_view return self.small_view
def create_large_view(self, str1, str2, int1, int2): def create_large_view(self, str1, str2, int1, int2,project):
self.large_view = plots.LargeView() self.large_view = plots.LargeView()
self.large_view.show() self.large_view.show()
return self.large_view return self.large_view

View File

@ -22,9 +22,10 @@ class Dataset:
raise ValueError,"array dims and identifyer mismatch" raise ValueError,"array dims and identifyer mismatch"
for axis,(dim_name,ids) in enumerate(def_list): for axis,(dim_name,ids) in enumerate(def_list):
enum_ids = {} enum_ids = {}
if dim_name not in project.c_p.dim_names: #if dim_name not in project.c_p.dim_names:
dim_name = project.c_p.suggest_dim_name(dim_name) # dim_name = project.c_p.suggest_dim_name(dim_name)
if not ids: if not ids:
logger.log('debug','Creating identifiers along: '+dim_name)
ids = self._create_identifiers(axis) ids = self._create_identifiers(axis)
for num,name in enumerate(ids): for num,name in enumerate(ids):
enum_ids[name] = num enum_ids[name] = num
@ -70,6 +71,7 @@ class Dataset:
dim_ids = self.ids[dim_name] dim_ids = self.ids[dim_name]
if type(index)==int: if type(index)==int:
index = [index] index = [index]
return set([id for id,ind in dim_ids.items() if ind in index]) return set([id for id,ind in dim_ids.items() if ind in index])
def extract_index_from_id(self,dim_name,id): def extract_index_from_id(self,dim_name,id):

View File

@ -5,22 +5,20 @@ import plots
import logger import logger
class NavigatorStore (gtk.TreeStore): class NavigatorStore (gtk.TreeStore):
def __init__(self): def __init__(self,project):
gtk.TreeStore.__init__(self, gobject.TYPE_STRING, plots.Plot) gtk.TreeStore.__init__(self, gobject.TYPE_STRING, plots.Plot)
self.project = project
iter = self.append(None) iter = self.append(None)
self.set_value(iter, 0, ('Sine Plot')) self.set_value(iter, 0, ('Sine Plot'))
self.set_value(iter, 1, (plots.SinePlot())) self.set_value(iter, 1, (plots.SinePlot(project)))
iter = self.append(None) iter = self.append(None)
self.set_value(iter, 0, ('Scatter Plot')) self.set_value(iter, 0, ('Scatter Plot'))
self.set_value(iter, 1, (plots.ScatterPlot())) self.set_value(iter, 1, (plots.ScatterPlot(project)))
iter = self.append(None) iter = self.append(None)
self.set_value(iter, 0, ('Scatter Plot 2')) self.set_value(iter, 0, ('Scatter Plot 2'))
self.set_value(iter, 1, (plots.ScatterPlot())) self.set_value(iter, 1, (plots.ScatterPlot(project)))
def plot_at(self, path): def plot_at(self, path):
iter = self.get_iter(path) iter = self.get_iter(path)

View File

@ -163,12 +163,14 @@ class LargeView (gtk.Frame):
class Plot (gtk.Frame): class Plot (gtk.Frame):
def __init__(self): def __init__(self,project):
gtk.Frame.__init__(self) gtk.Frame.__init__(self)
self.project = project
self.mark_active(False) self.mark_active(False)
self.connect('button_press_event', self.on_button_press) self.connect('button_press_event', self.on_button_press)
self.sel_obj = None self.sel_obj = None
project.c_p.attach(self) if project!=None: #its not an Emptyview
project.attach(self,'selection_update')
def on_button_press(self, *rest): def on_button_press(self, *rest):
logger.log('debug', 'button pressed in plot') logger.log('debug', 'button pressed in plot')
@ -183,12 +185,12 @@ class Plot (gtk.Frame):
else: else:
self.set_shadow_type(gtk.SHADOW_OUT) self.set_shadow_type(gtk.SHADOW_OUT)
def update_selection(self,project): def update(self,project,key):
pass pass
class EmptyView (Plot): class EmptyView (Plot):
def __init__(self): def __init__(self):
Plot.__init__(self) Plot.__init__(self,None)
label = gtk.Label('No view') label = gtk.Label('No view')
ebox = gtk.EventBox() ebox = gtk.EventBox()
@ -212,8 +214,8 @@ class EmptyView (Plot):
class SinePlot(Plot): class SinePlot(Plot):
def __init__(self): def __init__(self,project):
Plot.__init__(self) Plot.__init__(self,project)
fig = Figure(figsize=(5,4), dpi=72) fig = Figure(figsize=(5,4), dpi=72)
ax = fig.add_subplot(111) ax = fig.add_subplot(111)
t = arange(0.0,3.0,0.01) t = arange(0.0,3.0,0.01)
@ -229,14 +231,13 @@ class SinePlot (Plot):
return self.toolbar return self.toolbar
class ScatterPlot(Plot): class ScatterPlot(Plot):
def __init__(self): def __init__(self,project):
Plot.__init__(self) Plot.__init__(self,project)
fig = Figure(figsize=(5,4), dpi=72) fig = Figure(figsize=(5,4), dpi=72)
self.ax = ax = fig.add_subplot(111) self.ax = ax = fig.add_subplot(111)
# testing testing # testing testing
self.c_p = project.c_p self.x_dataset = project.datasets[0]
self.x_dataset = self.c_p.datasets[0]
x = self.x_dataset._data x = self.x_dataset._data
self.xaxis_data = xaxis_data = x[:,0] + scipy.randn(scipy.shape(x)[0]) self.xaxis_data = xaxis_data = x[:,0] + scipy.randn(scipy.shape(x)[0])
self.yaxis_data = yaxis_data = x[:,1] self.yaxis_data = yaxis_data = x[:,1]
@ -286,15 +287,16 @@ class ScatterPlot (Plot):
logger.log('debug','Selected:\n%s'%index) logger.log('debug','Selected:\n%s'%index)
ids = self.x_dataset.extract_id_from_index('samples',index) ids = self.x_dataset.extract_id_from_index('samples',index)
#update selection object #update selection object
self.c_p.set_selection(self.current_dim,ids) self.project.set_selection(self.current_dim,ids)
logger.log('debug','Selected identifiers:\n%s'%ids) logger.log('debug','Selected identifiers:\n%s'%ids)
def update_selection(self,project): def update(self,project,key):
curr_sel = project.get_selection() # get selection object curr_sel = project.get_selection() # get selection object
ids = curr_sel[self.current_dim] # current identifiers ids = curr_sel[self.current_dim] # current identifiers
index = self.x_dataset.extract_index_from_id(self.current_dim,ids) #conversion to index index = self.x_dataset.extract_index_from_id(self.current_dim,ids) #conversion to index
xdata_new = scipy.take(self.xaxis_data,index) #take data xdata_new = scipy.take(self.xaxis_data,index) #take data
ydata_new = scipy.take(self.yaxis_data,index) ydata_new = scipy.take(self.yaxis_data,index)
self.ax.plot(self.xaxis_data,self.yaxis_data,'ob')
self.ax.plot(xdata_new,ydata_new,'or') self.ax.plot(xdata_new,ydata_new,'or')
self.canvas.draw() self.canvas.draw()

View File

@ -5,33 +5,35 @@ class Project:
def __init__(self,name="Testing"): def __init__(self,name="Testing"):
self.name = name self.name = name
self.dim_names = [] self.dim_names = []
self._selection_observers = [] self._observers = {}
self.current_data=None self.current_data=None
self.datasets=[] self.datasets=[]
self.sel_obj = dataset.Selection() self.sel_obj = dataset.Selection()
def attach(self, observer): def attach(self,observer,key):
"""Attach observer for selection updates""" """Attach observer for selection updates"""
if not observer in self._selection_observers: if not self._observers.has_key(key):
self._selection_observers.append(observer) self._observers[key]=[]
if not observer in self._observers[key]:
self._observers[key].append(observer)
def detach(self, observer): def detach(self,observer,key):
"""Detach observer for selection updates""" """Detach observer for selection updates"""
try: try:
self.selection_observers.remove(observer) self._observers[key].remove(observer)
except ValueError: except ValueError:
pass pass
def notify(self, modifier=None): def notify(self,key,modifier=None):
"""Notifies observers that selection is updated""" """Notifies observers"""
for observer in self._selection_observers: for observer in self._observers[key]:
if modifier != observer: if modifier != observer:
observer.update_selection(self) observer.update(self,key)
def set_selection(self,dim_name,selection): def set_selection(self,dim_name,selection):
"""Sets selection and notifies observers""" """Sets a current selection and notify observers"""
self.sel_obj.current_selection[dim_name] = set(selection) self.sel_obj.current_selection[dim_name] = set(selection)
self.notify() self.notify('selection_update')
def get_selection(self): def get_selection(self):
"""Returns the current selection object""" """Returns the current selection object"""
@ -50,18 +52,6 @@ class Project:
dim_name = dim_name + "_t" dim_name = dim_name + "_t"
return dim_name return dim_name
# FIXME: Singleton project should be removed.
c_p = Project()
#add test data
x = scipy.rand(2000,3)
def_list = [ ['samples',[]], ['genes',['a','b','c']] ]
test_data = dataset.Dataset(x,def_list)
c_p.add_dataset(test_data)
y = scipy.rand(2000,2)
def_list = [ ['samples',[]], ['yclasses',['C','N']] ]
test_data = dataset.Dataset(y,def_list)
c_p.add_dataset(test_data)

View File

@ -2,8 +2,8 @@ import gtk
import logger import logger
from annotations import Annotations from annotations import Annotations
from workflow import * from workflow import *
import geneontology #import geneontology
import gostat #import gostat
from scipy import array from scipy import array
class EinarsWorkflow (Workflow): class EinarsWorkflow (Workflow):