Ejemplo n.º 1
0
class SpiderViewerWard(SpiderViewerClassify):
    _targets = [SpiderProtClassifyWard]
    _label = "viewer ward"
    
    def _defineParams(self, form):
        SpiderViewerClassify._defineParams(self, form)

        self.groupClass.addParam('maxLevel', IntParam, default=4,
                      label='Maximum level',
                      help='Maximum level of classes to show')


    def visualizeClasses(self, e=None):
        classTemplate = "class_%03d"
        averages = '%03d@' + self.protocol._getFileName('averages')
        
        def getInfo2(level, classNo):
            return classTemplate % classNo, averages % classNo
        
        node = self.protocol.buildDendrogram()
        
        g = Graph(root=node)
        self.graph = g
               
        self.win = Window("Select classes", self.formWindow, minsize=(1000, 600))
        root = self.win.root
        canvas = Canvas(root)
        canvas.grid(row=0, column=0, sticky='nsew')
        root.grid_columnconfigure(0, weight=1)
        root.grid_rowconfigure(0, weight=1) 
        
        self.buttonframe = tk.Frame(root)
        self.buttonframe.grid(row=2, column=0, columnspan=2)  
        self.win.createCloseButton(self.buttonframe).grid(row=0, column=0, sticky='n', padx=5, pady=5) 
        saveparticlesbtn = HotButton(self.buttonframe, "Particles", Icon.PLUS_CIRCLE, command=lambda: self.askCreateSubset('Particles', self.getSelectedNodesCount(2)))
        saveparticlesbtn.grid(row=0, column=1, sticky='n', padx=5, pady=5)  
        btn = HotButton(self.buttonframe, "Classes", Icon.PLUS_CIRCLE, command=lambda: self.askCreateSubset('Classes', self.getSelectedNodesCount(1)))
        btn.grid(row=0, column=2, sticky='n', padx=5, pady=5)
            
        lt = LevelTree(g)
        lt.DY = 135 # TODO: change in percent of the image size
        lt.setCanvas(canvas)
        lt.paint(self._createNode, maxLevel=self.maxLevel.get()-1)
        canvas.updateScrollRegion()
        
        return [self.win]
    
    def askCreateSubset(self, output, size):
        
        headerLabel = 'Are you sure you want to create a new set of %s with %s %s?'%(output, size, 'element' if size == 1 else 'elements')
        runname =  askString('Question','Run name:', self.win.getRoot(), 30, defaultValue='ProtUserSubSet', headerLabel=headerLabel)
        if runname:
            createFunc = getattr(self, 'save' + output)
            createFunc(runname)
        
        
    def _createSubsetProtocol(self, createOutputFunc, label=None):
        """ Create a subset of classes or particles. """
        try:
            project = self.getProject()
            prot = project.newProtocol(ProtUserSubSet)
            prot.setObjLabel(label)
            prot.inputObject.set(self.protocol)
            project._setupProtocol(prot)
            prot.makePathsAndClean()
            createOutputFunc(prot)
            prot.setStatus(STATUS_FINISHED)
            project._storeProtocol(prot)
            #self.project.launchProtocol(prot, wait=True)

        except Exception, ex:
            import traceback
            traceback.print_exc()    
            self.win.showError(str(ex))
Ejemplo n.º 2
0
class SpiderViewerWard(SpiderViewerClassify):
    """ Visualization of Spider - classify Ward protocol results. """

    _targets = [SpiderProtClassifyWard]
    _label = "viewer ward"

    def _defineParams(self, form):
        SpiderViewerClassify._defineParams(self, form)

        self.groupClass.addParam('maxLevel',
                                 IntParam,
                                 default=4,
                                 label='Maximum level',
                                 help='Maximum level of classes to show')

    def visualizeClasses(self, e=None):
        classTemplate = "class_%03d"
        averages = '%03d@' + self.protocol._getFileName('averages')

        def getInfo2(level, classNo):
            return classTemplate % classNo, averages % classNo

        node = self.protocol.buildDendrogram(writeAverages=False)

        g = Graph(root=node)
        self.graph = g

        self.win = Window("Select classes",
                          self.formWindow,
                          minsize=(1000, 600))
        root = self.win.root
        canvas = Canvas(root)
        canvas.grid(row=0, column=0, sticky='nsew')
        root.grid_columnconfigure(0, weight=1)
        root.grid_rowconfigure(0, weight=1)

        self.buttonframe = tk.Frame(root)
        self.buttonframe.grid(row=2, column=0, columnspan=2)
        self.win.createCloseButton(self.buttonframe).grid(row=0,
                                                          column=0,
                                                          sticky='n',
                                                          padx=5,
                                                          pady=5)
        saveparticlesbtn = HotButton(self.buttonframe,
                                     "Particles",
                                     Icon.PLUS_CIRCLE,
                                     command=self._askCreateParticles)
        saveparticlesbtn.grid(row=0, column=1, sticky='n', padx=5, pady=5)
        btn = HotButton(self.buttonframe,
                        "Classes",
                        Icon.PLUS_CIRCLE,
                        command=self._askCreateClasses)
        btn.grid(row=0, column=2, sticky='n', padx=5, pady=5)

        lt = LevelTree(g)
        lt.DY = 135  # TODO: change in percent of the image size
        lt.setCanvas(canvas)
        lt.paint(self._createNode, maxLevel=self.maxLevel.get() - 1)
        canvas.updateScrollRegion()

        return [self.win]

    def _askCreateParticles(self):
        self._askCreateSubset('Particles', self.getSelectedNodesCount(2))

    def _askCreateClasses(self):
        self._askCreateSubset('Classes', self.getSelectedNodesCount(1))

    def _askCreateSubset(self, output, size):

        if self._selectionOverlap():
            self.win.showError("Classes could not overlap in the tree.")
            return

        s = '' if size == 1 else 's'
        headerLabel = 'Are you sure you want to create a new set of ' \
                      ' %s with %s element%s?' % (output, size, s)
        runname = askString('Question',
                            'Run name:',
                            self.win.getRoot(),
                            30,
                            defaultValue='ProtUserSubSet',
                            headerLabel=headerLabel)
        if runname:
            createFunc = getattr(self, 'save' + output)
            createFunc(runname)

    def _createSubsetProtocol(self, createOutputFunc, label=None):
        """ Create a subset of classes or particles. """
        try:
            project = self.getProject()
            prot = project.newProtocol(ProtUserSubSet)
            prot.setObjLabel(label)
            prot.inputObject.set(self.protocol)
            project._setupProtocol(prot)
            prot.makePathsAndClean()
            createOutputFunc(prot)
            prot.setStatus(STATUS_FINISHED)
            project._storeProtocol(prot)
            #self.project.launchProtocol(prot, wait=True)

        except Exception, ex:
            import traceback
            traceback.print_exc()
            self.win.showError(str(ex))