def OnCluster(self, event): """ Handles all clustering requests. Clustering requests are handled in the following method: 1. Passes the requested clustering method to L{cluster.dialogs.ClusterOptionsDialog.showDialog} method 2. Passes the data and the returned method options to L{cluster.methods.cluster} 3. Passes the returned cluster membership list to the FacsPlotPanel for display """ dlg = cDlgs.getClusterDialog(event.GetId(), self) if dlg.ShowModal() == wx.ID_OK: if (DataStore.getCurrentDataSet() is not None): self.statusbar.SetStatusText('Running %s clustering...' % cMthds.methods[event.GetId()][1], 0) fcs = DataStore.getCurrentDataSet() data = fcs.data # Remove columns from analysis as specified by the user if len(fcs.selDims) > 0: data = dh.filterData(data, fcs.selDims) clusterIDs, msg = cMthds.cluster(event.GetId(), data, **dlg.getMethodArgs()) DataStore.addClustering(event.GetId(), clusterIDs, dlg.getMethodArgs()) clusteringIndex = DataStore.getCurrentDataSet().clustering.keys()[-1] self.statusbar.SetStatusText(msg, 0) if (dlg.isApplyChecked()): if self.facsPlotPanel.SelectedSubplotIndex is not None: self.facsPlotPanel.CurrentSubplot = dv.Subplot(self.facsPlotPanel.SelectedSubplotIndex, DataStore.getCurrentIndex(), clusteringIndex) self.facsPlotPanel.draw() else: self.facsPlotPanel.addSubplot(DataStore.getCurrentIndex(), clusteringIndex) self.treeCtrlPanel.updateTree() dlg.Destroy()
def __init__(self, parent): wx.Dialog.__init__(self, parent, wx.ID_ANY, 'Cluster Center Chooser', size=(550, 550)) self.CenterOnParent() self.centers = [] # set up the plotting panel self.dataPanel = CenterChooserPanel(self, self.OnClick) (self.dataSelectors, self.selectorSizer) = customsizers.ChannelSelectorSizer(self) if DataStore.getCurrentIndex() is not None: self.dataPanel.addData(DataStore.getCurrentIndex()) # filter the list of labels to include only user-selected ones selDims = DataStore.getCurrentDataSet().selDims labels = [DataStore.getCurrentDataSet().labels[i] for i in selDims] customsizers.populateSelectors(self.dataSelectors, labels, selDims) self.dataPanel.updateAxes((selDims[0],selDims[1])) # main sizer self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.dataPanel, True, wx.EXPAND | wx.BOTTOM | wx.TOP, -20) self.sizer.AddSpacer(20) self.sizer.Add(self.selectorSizer, False, wx.EXPAND | wx.TOP, 20) self.sizer.Add(self.CreateButtonSizer(wx.OK | wx.CANCEL), False, wx.EXPAND) self.SetSizer(self.sizer) self.SetBackgroundColour("white")
def addSubplot(self): cds = DataStore.getCurrentDataSet() if cds is None: return try: clusteringIndex = cds.clustering.keys()[-1] except IndexError: self.facsPlotPanel.addSubplot(DataStore.getCurrentIndex()) else: self.facsPlotPanel.addSubplot(DataStore.getCurrentIndex(), clusteringIndex)
def buildDataTree(self, parent, dataDict, visited): for dIndex, fData in dataDict.iteritems(): # add tree node for the FACS data set if fData.ID in visited: return child = self.tree.AppendItem(parent, fData.displayname) if (DataStore.getCurrentIndex() == dIndex): self.tree.SetItemBold(child, True) self.tree.SetPyData(child, (DATA_SET_ITEM, dIndex)) self.tree.SetItemImage(child, self.fldridx, wx.TreeItemIcon_Normal) self.tree.SetItemImage(child, self.fldropenidx, wx.TreeItemIcon_Expanded) # add nodes for all the clusterings of the current data set for cIndex in fData.clustering: clust = self.tree.AppendItem(child, cluster.methods.getStringRepr(fData.methodIDs[cIndex]) + " " + str(cIndex+1)) if ((fData.selectedClustering == cIndex) and (fData.ID == DataStore.getCurrentIndex())): self.tree.SetItemBold(clust, True) toolTip = clusteringInfo(fData, cIndex) self.tree.SetPyData(clust, (DATA_SET_ITEM, dIndex, cIndex, toolTip)) #(data index, cluster index, tooltip) self.tree.SetItemImage(clust, self.fldridx, wx.TreeItemIcon_Normal) self.tree.SetItemImage(clust, self.fldropenidx, wx.TreeItemIcon_Expanded) # set clustering options for line in toolTip.split('\n'): if (line != ''): info = self.tree.AppendItem(clust, line) self.tree.SetPyData(info, None) if (fData.infoExpanded[cIndex]): self.tree.Expand(clust) # recursive call to build the tree for any children visited.append(fData.ID) self.buildDataTree(child, dict([(i,DataStore.getData()[i]) for i in fData.children]), visited) if (fData.nodeExpanded and self.tree.GetChildrenCount(child) > 0): self.tree.Expand(child)
def OnExport(self, event): if DataStore.getCurrentIndex() is None: wx.MessageBox("Please load a dataset before attempting to export", "Data Missing", wx.OK | wx.ICON_ERROR) return format = io.getMethod(event.GetId())().FileType dlg = wx.FileDialog(self, "Save File", "", "", format, wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.FD_CHANGE_DIR) if dlg.ShowModal() == wx.ID_OK: io.exportDataFile(event.GetId(), dlg.Path, DataStore.getCurrentDataSet(), window=self) dlg.Destroy()
def saveState(dir, filename): """ Save a representation of the system state: All the loaded data sets, their clusterings, any transformations or analyses (future), and all plots. The state is saved in JSON format based on a dict of the following form: data: list of IDs binfile: the filename of the binary file used to store all the actual data data-dID: dict of settings belonging to a FacsData instance clust-dID-cID: a dict of attributes belonging to a clustering figures: list of figureID strings fig-ID: A dict for each figure keyed on the ID. The subplot attribute here is replaced with a list of fig-ID-p-ID strings for locating subplot dicts fig-ID-p-ID: A dict for each subplot in each figure keyed on fig ID and plot ID. current-data: data ID current-figure: figure ID """ store = shelve.open(os.path.join(dir, filename)) #store = dbopen(os.path.join(dir, filename), 'c', format='csv') # The actual numeric data will be stored in a separate binary file using # the numpy savez() method allowing for efficient storage/retrieval of data binfile = '%s.npz' % filename bindata = {} store['data'] = DataStore.getData().keys() store['binfile'] = binfile for dID in DataStore.getData(): fdata = DataStore.get(dID) dStr = 'data-%i' % dID dfname = fdata.filename if (fdata.filename is not '') else binfile bindata[dStr] = fdata.data store[dStr] = {'filename': dfname, 'displayname': fdata.displayname, 'labels': fdata.labels, 'annotations': fdata.annotations, 'analysis': fdata.analysis, 'ID': fdata.ID, 'parent': fdata.parent, 'children': fdata.children, 'selDims': fdata.selDims, 'clustering': fdata.clustering.keys(), 'nodeExpanded': fdata.nodeExpanded, 'selectedClustering': fdata.selectedClustering} # clusterings for cID in fdata.clustering: cStr = 'clust-%i-%i' % (dID, cID) csett = {'method': fdata.methodIDs[cID], 'opts': fdata.clusteringOpts[cID], 'clusteringSelDims': fdata.clusteringSelDims[cID], 'infoExpanded': fdata.infoExpanded[cID]} store[cStr] = csett bindata[cStr] = fdata.clustering[cID] # figures sfigs = [] for figID in FigureStore.getFigures(): fig = FigureStore.get(figID) fStr = 'fig-%i' % figID d = dict(fig.__dict__) splots = packSubplots(store, figID, fig.subplots) d['subplots'] = splots store[fStr] = d sfigs.append(fStr) store['figures'] = list(sfigs) # other store['current-data'] = DataStore.getCurrentIndex() store['current-figure'] = FigureStore.getSelectedIndex() # write out settings data store.close() # write out numeric data to binary file np.savez(os.path.join(dir, binfile), **bindata)
def OnOpen(self, event): """ Opens a FACS data file, parses it, and updates the FacsPlotPanel instance. """ # retrieve the I/O methods for inputting files inputMethods = [m[2]() for m in io.AvailableMethods().values()] formats = '|'.join([m.FileType for m in inputMethods if io.FILE_INPUT in m.register()]) allLabels = [] allColArr = [] allDims = [] fColsMoved = False numLoaded = 0 # keep track of the common number of dimensions for datasets numDims = DataStore.getCurrentDataSet() if numDims is not None: numDims = len(numDims.labels) dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", formats, wx.FD_OPEN|wx.FD_MULTIPLE|wx.FD_CHANGE_DIR) if dlg.ShowModal() == wx.ID_OK: #TODO: move to data.io module? # process each file selected for n, path in enumerate(dlg.Paths): self.statusbar.SetStatusText('loading: ' + path, 0) try: (labels, data, annotations) = io.loadDataFile(path, window=self) except TypeError: # if there was an error loading the file, # loadDataFile should return None, so skip this file continue # make sure the new file matches dimensions of loaded files if numDims is None: numDims = len(labels) elif len(labels) != numDims: wx.MessageBox("Error loading file: %s\n\nThe number of channels does not match those in currently loaded datasets. \n\nThis file will not be loaded." % dlg.Filenames[n], "File Error", wx.OK | wx.ICON_ERROR) continue # Give the user a brief preview of the data (10 rows) and allow # column rearrangement and renaming if (not allLabels): dgridDlg = displayDialogs.SampleDataDisplayDialog(self, data[0:10,:], labels) if (dgridDlg.ShowModal() == wx.ID_OK): ca = dgridDlg.ColumnArrangement lbls = dgridDlg.ColumnLabels # Reassign the column labels labels = [lbls[i] for i in ca] if dgridDlg.ApplyToAll: allLabels = list(labels) allColArr = list(ca) # Rearrange the data columns if (dgridDlg.ColumnsMoved): fColsMoved = True data = dh.reorderColumns(data, ca) else: dgridDlg.Destroy() continue dgridDlg.Destroy() else: labels = list(allLabels) if fColsMoved: data = dh.reorderColumns(data, allColArr) # update the DataStore DataStore.add(FacsData(dlg.Filenames[n], labels, data, annotations=annotations)) numLoaded += 1 if n == 0: self.updateAxesList(labels) if (not allDims): # Allow the user to choose columns for use in analysis dimDlg = displayDialogs.DimensionExclusionDialog(self, labels) dimDlg.Size=(dimDlg.Size[0]*.75, dimDlg.Size[1]*.8) if (dimDlg.ShowModal() == wx.ID_OK): DataStore.getCurrentDataSet().selDims = dimDlg.SelectedDimensions if (dimDlg.ApplyToAll): allDims = list(dimDlg.SelectedDimensions) dimDlg.Destroy() else: DataStore.getCurrentDataSet().selDims = list(allDims) # update the panel self.facsPlotPanel.updateAxes([0,1]) if (len(self.facsPlotPanel.subplots) == 0 or len(dlg.Paths) > 1): self.facsPlotPanel.addSubplot(DataStore.getCurrentIndex()) # Create an n/2 x 2 grid for the n selected data files if (numLoaded > 1): self.facsPlotPanel.updateSubplotGrid(int(math.ceil(numLoaded/2.0)), 2) self.statusbar.SetStatusText('All data files loaded.') if FigureStore.isEmpty(): fig = Figure('Default', self.facsPlotPanel.subplots, 1, self.facsPlotPanel.Grid, self.facsPlotPanel.SelectedAxes) FigureStore.add(fig) self.treeCtrlPanel.updateTree() dlg.Destroy()