Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
 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")
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
 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()
Exemplo n.º 6
0
Arquivo: io.py Projeto: smdabdoub/find
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)
Exemplo n.º 7
0
    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()